Fysikmotor update 10/2


Bild Wikipedia

Att simulera endast två kroppar mekaniskt var relativt rättframt: tilldela kropparna lite egenskaper och geometrier; simulera deras rörelser i små tidssteg; kollisionsdetektera och – om kropparna kolliderar – beräkna en kollisionsimpuls som får dem att ”studsa” iväg åt varsitt håll. Om kropparna hunnit överlappa varandra var det bara att ”knuffa” isär dem längs kortast möjliga väg så att det såg ok ut igen. Voila, en klar fysikmotor. Eller?

Jodå, så länge systemet bara innehöll just två kroppar. Men i regel vill man ha med betydligt fler än så. Kruxet är då att en och samma kropp kan vara inblandad i flera kollisioner samtidigt. Kropp A kanske kolliderar med B som kolliderar med C och D osv. Det kan alltså uppstå situationer där inte bara två utan ett okänt antal kroppar kolliderar och har en inverkan på varandra, och där varje enskild kropps slutgiltiga riktning och hastighet efter kollisionen beror på alla andra inblandade kroppar.

Detta skulle visa sig vara ett rätt knepigt problem. I teknisk mening är det ett icke-linjärt ekvationssystem. Ett sådant går bra att lösa med t ex Newtons metod men det är omständigt och lämpar sig inte väl för realtidssimulering. Det som behövs är någon approximativ men ändå tillräckligt exakt metod. För att hitta en sådan finns det bara en sak att göra; att ta ett djupt andetag och dyka in i den numeriska analysens dunkla värld.

Valet har nu, efter mycket slit och släp, fallit på en metod som först formulerar problemet som ett linjärt istället för ett icke-linjärt ekvationssystem (enklare och snabbare att lösa), och sedan löser det approximativt med hjälp av en iterativ metod vid namn Gauss-Seidel. En del andra tricks för att få rätt på överlappningar och annat smått och gott ingår också. En stor fördel med metoden är att den även kan hantera constraints, som används till att simulera olika typer av mekaniska leder. Bilden ovan föreställer t ex en kardan-led (Wikipedia).

En mer sofistikerad variant av samma metod används i fysiksimulatorn Box2d som ingår i spel som Crayon Physics Deluxe, Zany Doodle, IncrediBots m fl.

~ av Calvin den februari 10, 2009.

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Ansluter till %s

 
Följ

Få meddelanden om nya inlägg via e-post.