Hi, ich bin bei meinem Spiel mittlerweile bei der Physik angekommen. Jetzt ist die Frage wie baue ich eine Kollisionskontrolle. Die Physik Objekte bestehen auf Kugeln und Quadern. Die Kollisionskontrolle an sich ist nicht das Problem, sondern die Reaktion auf eine Kollision. Bis jetzt hatte ich es so vor: 1.) Ich habe eine Liste von Bewegten Objekten bei denen ich eine Kollisionskontrolle durchführe 2.) Bei einer Kollision bewege ich das Objekt, zB. bis zur Wand, und füge am Ende der Liste eine weitere Gegenbewegung hinzu
Das Problem ist jetzt folgendes: Wenn ich eine Wand und zB. zwei Autos habe welche sich parallel zur Wand und zueinander Bewegeng, dann könnte es passieren, dass das Auto an der Wand in diese Richtung fährt. Mein System läst das Auto in die andere Richtung abprallen, dort ist allerdings das andere Auto so pendelt das Auto immer hin und her. Das Problem ist, da ich alle Bewegungen in einer Schleife abarbeite wird diese nie fertig, das Spiel (zumindest die Physik) hängt sich auf. Mir ist bisjetzt leider keine Lösung für das Problem eingefallen.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Wenn du feststellst, dass ein Objekt nur bis zu einem bestimmten Punkt gedrängt werden kann, weil dann ein massives Objekt (Wand) kommt, müsstest du die Gegenbewegung an alle Objekte zurückpropagieren, die dafür verantwortlich waren, dass das Auto überhaupt an die Wand geprallt ist. Wenn also Auto A das Auto B an die Wand C schiebt, dann übt C berechtigterweise eine Kraft gegen B aus. B aber kann nicht zurückweichen, weil A im Weg ist, also bekommt A die Gegenkraft ebenfalls ab, sodass beide zum stehen kommen.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Üblicherweise löst man das Problem iterativ. Zudem gibt es eine Unterscheidung zwischen Kollisions-Behandlung und Kontakt-Behandlung. Kollisions beachtet die Materialeigenschaften führt also z.B. einen elastischen Stoß aus. Kontakt macht nahezu das gleiche, der Unterschied ist das sämtliche Kollisionen als vollständig unelastischer Stoß behandelt werden.
Dateianhang:
contact.jpg
Pseudocode:
Code:
1. for 1...5 do: collision() 2. externe Kräfte anwenden, z.B. Gravitation. 3. for 1...10 do: contact() 4. Positionen updaten
Die Funktionen collision() und contact() testen dabei jeweils jedes Objekt gegen jedes andere Objekt. Bei großen Szenen sollte man da natürlich irgendwo eine Baumstruktur einsetzen um nicht wirklich alles gegen alles zu testen. Wichtig: Jedes Objekt speichert zwei Positionen und Rotationen! Erstens die Position/Rotation des letzten Frames und zweitens eine vorhergesagte Position/Rotation berechnet aus der Position/Rotation des letzten Frames und den aktuellen Geschwindigkeiten.
Die Funktionen collision/contact sehen ungefähr so aus:
Code:
1. predictedPosition = position + timeElapsed * velocity 2. Objekte unter Nutzung von predictedPosition kollidieren lassen, Kräfte aufsummieren (nicht sofort anwenden!) 3. Kräfte auf velocity anwenden
Warum das alles? Da die erste Schleife oben bis 5 läuft können hier Objekte maximal 5 mal hin und her prallen. Da jeweils Energie verloren geht (Materialkonstante richtig wählen!) sollte nach 5 mal nicht mehr viel passieren. Die restliche Energie wird dann einfach auf Null gesetzt indem die Kollisionen als unelastischer Stoß behandelt werden. Die Objekte werden also angehalten, drücken sich aber ggf. noch auseinander. Wichtig ist das externe Kräfte wie Gravitation erst nach dem collisions-Schritt angewendet werden. Anderenfalls würde ein ruhendes Objekt auf dem Fussboden nämlich plötzlich hochspringen weil es durch Anwendung der Gravitionskraft plötzlich Geschwindigkeit bekommen hat.
Vielen Dank für die schnellen Antworten, ich werde mir den Link nochmal genauer anschauen und es wie ihr beschrieben habt entsprechend, bzw mit ein paar Änderungen, implementieren. Ich denke ich werde nachdem ich die Physik fertig habe mein Projekt hier im Forum endlich vorstellen.
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.