Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 06, 2025 05:32

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kollisions Problem
BeitragVerfasst: Sa Jun 26, 2010 14:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
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.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisions Problem
BeitragVerfasst: Sa Jun 26, 2010 14:57 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisions Problem
BeitragVerfasst: Sa Jun 26, 2010 15:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ü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.

Siehe auch mein Articulated Rigid Bodies Projekt und die dort verlinkten Paper.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Kollisions Problem
BeitragVerfasst: Sa Jun 26, 2010 15:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
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.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 16 Queries | GZIP : On ]