Laborationshandledning TSBK03 Teknik för avancerade datorspel

OBS! DETTA ÄR 2009 ÅRS LABB. DENNA ÄR INTE LÄNGRE KÖRBAR I LABBET OCH HAR ERSATTS AV EN KOMPLETT OMARBETAD LABB.

Laboration 3, Fysik: Biljardbordet.

I denna laboration skall vi arbeta med lite grundläggande klassisk fysik i en spelsituation. Miljön är ett biljardbord, där vi ska få bollarna att interagera på ett så realistiskt sätt som möjligt.

Viktiga koncept: Kollissionshantering i praktiken. Quaternions för rotation.

Laborationsskalet

Vi använder här ett labbskal som heter "Valla Online". Fysikmotorn liksom de flesta laborationsmomenten har utvecklats av Tomas (Zsolt) Szabo.

Dessa anvisningar kan innehålla felaktigheter. Om filer saknas eller instruktioner inte alls fungerar, fråga labbhandledaren.

Ladda ner labbskalet här. (Gamla versioner finns på gamla kurssidan: /site/edu/icg/tsbk10/phylab/phylab.tar.gz eller http://www.isy.liu.se/~ingis/TSBK10-files/labb/tsbk10-lab3.tar.gz.) Fråga labbassistenten om du inte kan ladda ner.

Vi skall få någonting som liknar ett biljardbord (utan hål) att fungera så bra som möjligt. Det tycks vara ett ganska enkelt problem, men det finns flera delproblem som skall lösas.

I labbskalet finns en debugrenderare som hjälpverktyg. Den ritar vektorer, boxar och koordinatsystem (3x3-matriser). Beskrivning av hur den fungerar hittar du i <include/gfx/DebugRenderer.hh>.

Uppgift 0: Kom igång

Gör först

module add TSBK10

Kompilera labbprogrammet med

make

och kör med

./lab --world phylab

Nu skall du se ett biljardbord. Hela kollissionsupplösningen saknas, och din uppgift nu är att lägga till den så vi får en trevlig simulering som skulle duga till ett biljardspel.

Styrning: WASD samt QE för upp/ner.

Klicka båda musknapparna för att "koppla loss" musen.

Högerknapp ger en impuls mot bollen du siktar på.

Om du vill ha flera bollar så kör du med:

./lab --world phylab2

Uppgift 1: Elastisk friktionsfri kollission mellan punktmassor

Första steget är att hantera kollissioner mellan punktmassor.

Du jobbar i filen physics/LabResolver.cc. Alla ändringar för den här uppgiften gör du i metoden calcCollissionImpulse. Den anropas när kollissionsdetekteringssystemet har upptäckt en kollission och vill beräkna en impuls för att separera objekten. De har en negativ relativ hastighet, är på väg in i varandra.

Det finns ett par strukturer/klasser som du behöver använda:

Betydelsen hos ett par viktiga variabler i ContactInfo-strukturen

 

Uppgift 2: Friktion

Nu glider bollarna omkring helt obegränsat, för underlaget är ju friktionsfritt.

Även nu jobbar du i filen physics/LabResolver.cc.

Se denna figur (från äldre föreläsningsmaterial). Kinetisk friktion räcker bra.

Implementera friktionen som impulser som läggs på samtidigt som man separerar objekten, dvs normalkraften ges av impulsen som du beräknar i uppgift 1.

 

Uppgift 3: Spinn

Men bollarna snurrar inte, de bara glider. Det ska vi råda bot på. Första steget är att alls tillåta spinn. Då måste vi kunna representera både bollens rotationsriktning och dess rotationshastighet.

I denna uppgift jobbar du i physics/LabSimulator.cc. Allt som är markerat med "TODO" är ställen där du behöver ändra. Kika gärna i include/physics/LabSimulator.hh för att bekanta dig med variablerna som ingår i klassen (statevariablerna).

Rotationer kan representeras med 3x3-matriser. Det är alldeles utmärkt på många sätt, men det är inte så uppenbart vilken axel man roterar kring. I det här fallet är det praktiskt att ha en annan representation, nämligen quaternions (kvaternioner), som Peter gick igenom på sin andra föreläsning.

Man kan tämligen rättframt konvertera mellan kvaternioner och matriser, och genom definitionen för multiplikation av quaternions kan man utföra rotation på punktmängder.

I labbskalet finns några funktioner definierade för kvaternioner, i /lib/wml/Math/.

Implementationsdetalj:
Om man vill multiplicera en vektor v med en kvaternjon q så kan göra så här:
Skapa en kvaternjon från vektorn v med
vq = Quaterniond(0.0, v.X(), v.Y(), v.Z());
och multiplicera vq och q.

Se även Baraff:

Använd dessa för att ge bollarna rotation. Till att börja med nöjer vi oss med att de roterar alls, med kvaternionrepresentation. I nästa uppgift skall vi få dem att rotera realistiskt.

 

Uppgift 4: Realistisk rotation

Nu ska vi sy ihop det resulterande simuleringssystemet. Det viktigaste är att en impuls skall påverka rotationen.

Detta fixar du i physics/LabSimulator.cc (getPtVel, om inte implemeterad i 3:an) samt physics/LabResolver.cc.

Not: Eftersom ContactInfo innehåller pekare till objekten (a och b) så måste man peka genom objektens simulator för att komma åt getPtVel.

Se Baraff, kapitel 8: