In diesem Kapitel widmen wir uns der Erkennung von Kollisionen. Dieses Thema wird uns von nun an bis zum Ende des Semesters beschäftigen.

Fences / Sync Objects

In Graphics::loop() finden Sie eine Neuerung. Hier wird nun eine explizite Synchronisation zwischen GPU und CPU implementiert. Ohne diese explizite Synchronisation wird diese Aufgabe dem Gerätetreiber überlassen und es kann auf verschiedenen Grafikkarten zu unterschiedlichen Phänomenen kommen. Eine genauere Erklärung zu diesem Thema finden Sie unter OpenGL Wiki: Sync Object

Für uns wird dies relevant beim Zeichnen großer Mengen von Objekten. Je nach Hardware und Objektanzahl ist die Grafikkarte irgendwann mit der Anzahl der Instruktionen überfordert und beginnt einzelne Frames wegzuwerfen (discard). Die CPU merkt davon allerdings nichts. Mit der Synchronisation wird dies verhindert.

Die aktuelle Implementierung erlaubt CPU und GPU bis zu 3 Frames auseinander zu driften bevor die CPU ausgebremst wird. Wenn Sie im weiteren Verlauf dieses Kapitels die Performance analysieren, versuchen Sie mal diese Anzahl von Frames oder auch das Timeout zu verändern und beobachten Sie ob Sie einen Unterschied in der Framerate feststellen.

Collider und Kollisionen

In Scene::Scene(std::string filename) finden Sie das Laden der sog. Collider aus der Szene. Hier wird unterschieden zwischen zwei Typen von Collidern: Sphere und Mesh

In diesem Kapitel kümmern wir uns erstmal nur um den Sphere-Collider. Er repräsentiert eine Bounding Sphere und wird in diesem Kapitel sowohl für die Broad- als auch für die Narrow-Phase verwendet.

Im folgenden Kapitel werden wir die Narrow-Phase auf einen genaueren Algorithmus umstellen, nutzen die Bounding Sphere jedoch weiterhin in der Broad-Phase.

Die eigentliche Kollisionserkennung finden Sie in Scene::update(const double time). Ihnen wir auffallen, dass hier verschiedene Dinge doppelt gemacht werden. Dies dient lediglich der Veranschaulichung der unterschiedlichen Laufzeiten.

Bitte bedenken Sie dass auch in der Entity::update() Aktionen ausgeführt werden, die die Laufzeit der Kollisionserkennung beeinflussen.

Der tatsächliche Algorithmus zum Erkennen ob zwei Collider überlappen, befinden Sie schließlich in der Collider Klasse.

Aufgaben

9.1: Machen Sie sich mit dem grundsätzlichen Abläufen der Kollisionserkennung in der Engine vertraut.

9.2: Erstellen Sie ein Diagramm (Plot) in dem Sie die Laufzeiten der beiden Funktionen determineCollisions() und sortAndSweep() in Abhängigkeit der Anzahl der geladenen Entities gegenüber stellen.

Wählen Sie eine aus den folgenden beiden Aufgaben als Spezialisierung

9.3-A: Die gezeigte Implementierung von SortAndSweep nutzt immer die X-Achse für die Sortierung. Der originale Algorithmus bestimmt nach jedem Durchlauf die Varianz der Objekte entlang aller drei Achsen und wählt dann eine geeignete Achse für den nächsten Frame. Lesen Sie sich in das Thema ein und optimieren Sie den Algorithmus entsprechend. Beschreiben Sie im Anschluss wieviel diese Anpassung wirklich bringt.

--- oder ---

9.3-B: In resolveCollisions werden aktuell die Kollisionen aufgelöst. Dabei werden allerdings die kollidierenden Kugeln an den Anfang des Frames zurück verschoben und so getan als habe die Kollision bereits zu diesem Zeitpunkt stattgefunden. Dies ist aber nicht korrekt. Ermitteln die den exakten Zeitpunkt der Kollision und passen Sie die Flugbahnen der Kugeln entsprechend an. Stellen Sie sich im Anschluss die Frage ob dieser Algorithmus 'robust' ist oder ob es zu Problemen führen kann.

Diese Seite speichern:
Redvery Journal
Computergrafik-Effiziente-Algorithmen-9.trj
Seite speichern
Computergrafik-Effiziente-Algorithmen-9.trj
Redvery Journal ist ein modernes Dateiformat mit dem diese Seite incl. aller Bilder und Anhänge gespeichert und offline verwendet werden kann.

Die passende App dazu gibt es kostenlos unter www.redvery.com/journal
Speichern
Abbrechen