Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Kollisionen erkennen - Kollisions- und Schnittpunkttests auf Dreieckbasis - Kollisions- und Schnittpunkttests auf Viereckbasis - Einsatz von achsenausgerichteten.

Ähnliche Präsentationen


Präsentation zum Thema: "Kollisionen erkennen - Kollisions- und Schnittpunkttests auf Dreieckbasis - Kollisions- und Schnittpunkttests auf Viereckbasis - Einsatz von achsenausgerichteten."—  Präsentation transkript:

1 Kollisionen erkennen - Kollisions- und Schnittpunkttests auf Dreieckbasis - Kollisions- und Schnittpunkttests auf Viereckbasis - Einsatz von achsenausgerichteten Bounding Boxen für die Verbesserung der Performance bei Kollisions- und Schnittpunkttests auf Dreieckbasis - Kollision zweier 3D Modelle: -OOB-OOB-Test -AABB-OOB_Test

2 Kollisions- und Schnittpunkttests auf Dreieckbasis (1) 3D Modell auf Dreieckbasis 3D Modell auf Dreieckbasis –Drahtgittermodell (besteht aus Dreiecken) mit Texturüberzug –Dreiecke werden zu Kollisions- und Schnittpunkttests herangezogen Punkt-in-Dreieck-Test Punkt-in-Dreieck-Test –Wofür: z.B. um festzustellen ob ein Spieler gegen die Wand gerannt ist Strahl-schneidet-Dreieck-Test: Strahl-schneidet-Dreieck-Test: –Wofür: Zur Bestimmung der Fußboden- und Terrainhöhe

3 Kollisions- und Schnittpunkttests auf Dreieckbasis (2) 1. Schnittpunkt in der Ebene bestimmen (allgemein): 1. Schnittpunkt in der Ebene bestimmen (allgemein): –Mit Normalenform einer Ebene - Wenn Punkt innerhalb der Ebene liegt, liegt der Vektor in der Ebene und ist damit senkrecht zur Flächennormalen n. - Das Skalarprodukt (relative Lage der zwei Vektoren zueinander) ist gleich Null Es muss zuerst überprüft werden ob zwischen den Objekten in der Umgebung und dem jeweiligen Dreieck in einer Ebene einen Schnittpunkt gibt

4 Kollisions- und Schnittpunkttests auf Dreieckbasis (2) Schnittpunktberechnung (konkret) Schnittpunktberechnung (konkret)

5 Kollisions- und Schnittpunkttests auf Dreieckbasis (3) Dreieck in der Ebene (Konstruktion einer Ebene aus Eckpunkten) Dreieck in der Ebene (Konstruktion einer Ebene aus Eckpunkten) –Wir kennen die Eckpunkte (Vertices) des Dreiecks aus denen das 3D Modell zusammengesetzt ist (wurden festgelegt als das Gittermodell entworfen wurde) –Daraus muss die Ebene berechnet werden

6 Kollisions- und Schnittpunkttests auf Dreieckbasis (4) Der Halbseitentest Der Halbseitentest –Was können wir schon? Aus Punkten Ebene berechnen Aus Punkten Ebene berechnen Wir kennen Methode zur Schnittpunktberechnung mit Ebene Wir kennen Methode zur Schnittpunktberechnung mit Ebene –Schnittpunkt muss nicht innerhalb des Dreiecks sein Ebene hat unendliche Ausdehnung Ebene hat unendliche Ausdehnung Ausdehnung eines Dreiecks ist aber begrenzt Ausdehnung eines Dreiecks ist aber begrenzt –Methode um festzustellen ob ein Schnittpunkt einer Ebene innerhalb des Dreiecks liegt ist Halbseitentest Es wird überprüft auf welcher Seite einer Dreieckskante der Schnittpunkt liegt Es wird überprüft auf welcher Seite einer Dreieckskante der Schnittpunkt liegt Liegt der Schnittpunkt immer innerhalb der drei Dreieckskanten, liegt er auch innerhalb des Dreiecks Liegt der Schnittpunkt immer innerhalb der drei Dreieckskanten, liegt er auch innerhalb des Dreiecks

7 Kollisions- und Schnittpunkttests auf Dreieckbasis (5) Halbseitentest die Zweite: Halbseitentest die Zweite: Test ist möglich für zweidimensionale, konvexe Polygone Konvex = Innenwinkel aller benachbarter Kanten ist < 180 ° Für dreidimensionale Polygone gibt es den Halbraumtest Kleiner mathematisch-terminologischer Exkurs: -Der Mathematiker bezeichnet sowohl die Innen-, als auch die Außenseite als Halbseite Deshalb der Name

8 Kollisions- und Schnittpunkttests auf Dreieckbasis (6) Auf zur Praxis: Auf zur Praxis: –Klasse CTriangle wird implementiert 3 Vektoren für die Eckpunkte 3 Vektoren für die Senkrechten der Dreieckskanten Normalenvektor Konstruktor/Destruktor hat keine Funktion Dreiecksnummer

9 Kollisions- und Schnittpunkttests auf Dreieckbasis (7) Was machen die Funktionen: Init_Triangle() -Aufgabe: Initialisierung eines Dreiecks - Skalierte sowie unskalierte Eckpunkte können übergeben werden -Damit das Dreieck mit unskalierten Eckpunkten richtig skaliert werden kann, muss der Skalierungsfaktor mit übergeben werden Warum skaliert, warum unskalierte Eckpunkte: - Bei wenigen Objekten ist es sinnvoll die Eckpunkte als skaliert schon vorliegen zu haben (also ein 3D Modell zu übergeben) -Bei mehreren Objekten ist es sinnvoller wenige 3D Modelle zu verwenden und durch Variation des Skalierungsfaktors variable Objekte zu erzeugen (bsplw. Bei Asteroiden) - Nach Zuweisung der Eckpunkte wird der Normalvektor, sowie die Senkrechten der Dreieckskanten berechnet

10 Init_Triangle()

11 Kollisions- und Schnittpunkttests auf Dreieckbasis (8) Test_for_Ray_Intersection() Test_for_Ray_Intersection() –Führt Schnittpunkttest zwischen einem Strahl (z.B. Sonnenstrahl) und einem Dreieck durch Schritt 1: es wird überprüft ob Normalvektor und die Richtung des Strahls senkrecht zueinander sind Schritt 1: es wird überprüft ob Normalvektor und die Richtung des Strahls senkrecht zueinander sind –Wenn ja, kann es keinen Schnittpunkt geben Schritt 2: intersection_parameter (entspricht Variable a aus 7.3) wird berechnet Schritt 2: intersection_parameter (entspricht Variable a aus 7.3) wird berechnet –Um Schnittpunkt zu bestimmen wird dieser Parameter anschließend in die Geradengleichung eingesetzt Schritt 3: Halbseitentest Schritt 3: Halbseitentest

12 Test_for_Ray_Intersection()

13 Kollisions- und Schnittpunkttests auf Dreieckbasis (9) Test_for_Point_Collision() Test_for_Point_Collision() –Kollisionstest zwischen Punkt und einem Dreieck wird gemacht (Raketen, Laserimpulswaffen ) –Übergeben werden: Adresse des Ortsvektors der Objektmittelpunktes Adresse des Ortsvektors der Objektmittelpunktes Adresse der Objektflugrichtung Adresse der Objektflugrichtung Adresse einer Ganzzahlvariablen Adresse einer Ganzzahlvariablen –Im Falle eines positiven Kollisionstests übergibt man die Dreiecksnummer Diese Funktion für den Punkt und die Strahlfunktion sind identisch Diese Funktion für den Punkt und die Strahlfunktion sind identisch –Einziger Unterschied: Abstandstest zwischen Dreieck und Objektmittelpunkt Abstandstest zwischen Dreieck und Objektmittelpunkt –Ist der Abstand zu groß liegt keine Kollision vor –Ist Abstand in bestimmten Rahmen, liegt Kollision vor –Die Größe des Rahmens soll man durch ausprobieren herausfinden

14 Test_for_Point_Collision()

15 Test_for_Point_Collision_Wall() Abwandlung der Test_for_Point_Collision() für den Kollisionstest an einer Wand Abwandlung der Test_for_Point_Collision() für den Kollisionstest an einer Wand –Keine Adresse der Bewegungsrichtung wird mit übergeben Als Richtung wird immer der negative Normalenvektor der Wand verwendet Als Richtung wird immer der negative Normalenvektor der Wand verwendet

16 Kollisions- und Schnittpunkttests auf Dreieckbasis (10) CTriangle() wird später zur genauen Treffer- und Schnittpunkterkennung in Indoor und Terainrenderer verwendet CTriangle() wird später zur genauen Treffer- und Schnittpunkterkennung in Indoor und Terainrenderer verwendet –Bei der Initialisierung werden immer die Modellkoordinaten der Dreiecke einer 3 D Modells an die Funktion Init_Triangle() übergeben –Im Spiel hingegen unterliegen die Modelle ständigen Transformationen Frage: Wie soll Treffererkennung ohne Kenntnis der Weltkoordinaten der 3 D Modelle funktionieren? Frage: Wie soll Treffererkennung ohne Kenntnis der Weltkoordinaten der 3 D Modelle funktionieren?

17 Kollisions- und Schnittpunkttests auf Dreieckbasis (11) Beispiel: Beispiel: –Rakete fliegt, Raumschiff (fliegt), Treffer soll erkannt werden –Mittels Funktion Test_for_Point_Collision() soll getroffenes Dreieck gefunden werden Lösung: Lösung: –Ortsvektor und Bewegungsrichtung der Rakete müssen so transformiert werden, dass Modellkoordinaten der Dreiecke des Raumschiffs für die Treffererkennung verwendet werden können

18 Rücktransformation Für Treffertest müssen Position und Flugrichtung transformiert werden - Inverse Rotationsmatrix des Raumschiffes wird benötigt Inverse Rotationsmatrix macht die Transformationen der Oirginalmatrix wieder rückgängig

19 Kollisions- und Schnittpunkttests auf Dreieckbasis (12) Dreieck-Dreieck-Kollisionstest Dreieck-Dreieck-Kollisionstest –Wenn sich zwei Dreiecke schneiden muss mindestens eine Kante des einen Dreiecks eine Fläche des anderen schneiden Schnittpunktberechnungsfunktion kennen wir bereits Schnittpunktberechnungsfunktion kennen wir bereits –Die Dreieckskante die man der Funktion übergibt muss man relativ zu den Modellkoordinaten des anderen Dreiecks transformieren Eckpunkte des Dreiecks transformieren und aus ihnen die Kanten berechnen Eckpunkte des Dreiecks transformieren und aus ihnen die Kanten berechnen –Dann intersection_parameter berechnen Hat dieser einen Wert >=0 und =0 und <=1schneidet die Kante diejenige Ebene in der das andere Dreieck liegt

20 Kollisions- und Schnittpunkttests auf Viereckbasis (1) Unterschied zu Tests auf Dreieckbasis: Unterschied zu Tests auf Dreieckbasis: –Beim Halbseitentest kommt eine weitere Kante hinzu –Mit Klasse ClQuad() Hat zwei weitere Funktionen Hat zwei weitere Funktionen –Test_for_axis_aligned_Ray_Intersection() Schnittpunkt zwischen Strahl und achsenausgerichtetem Rechteck/Quader kann schneller berechnet werden als mit Test_for_Ray_Intersection() Schnittpunkte sind einfacher und auf Halbseitentest kann verzichtet werden, und nur Ausdehnung in x-, y- und z-Richtung wird benötigt Schnittpunkt zwischen Strahl und achsenausgerichtetem Rechteck/Quader kann schneller berechnet werden als mit Test_for_Ray_Intersection() Schnittpunkte sind einfacher und auf Halbseitentest kann verzichtet werden, und nur Ausdehnung in x-, y- und z-Richtung wird benötigt –Test_Portal_Durchtritt() Verwendet Seitentest den wir schon kennen (in Verbindung mit Portalen) Verwendet Seitentest den wir schon kennen (in Verbindung mit Portalen)

21 Einsatz von achsenausgerichteten Bounding Boxen für die Verbesserung der Performance bei Kollisions- und Schnittpunkttests auf Dreieckbasis Sind viele Objekte vorhanden deren Kollisionen berechnet werden müssen kommt es ab einem gewissen Grad zu Performance-Problemen (alle Dreiecke müssen auf Kollision getestet werden) Sind viele Objekte vorhanden deren Kollisionen berechnet werden müssen kommt es ab einem gewissen Grad zu Performance-Problemen (alle Dreiecke müssen auf Kollision getestet werden) –Bounding Boxen bringen hier große Vorteile Zuerst Treffertest mit Boxen und Waffe durchgeführt Zuerst Treffertest mit Boxen und Waffe durchgeführt Ist dieser positiv können alle Dreiecke in anderen Boxen vernachlässigt werden Ist dieser positiv können alle Dreiecke in anderen Boxen vernachlässigt werden Nur die in der positiv getesteten Box liegenden Dreiecke werden getestet Nur die in der positiv getesteten Box liegenden Dreiecke werden getestet Treffertest zwischen AABB und Lenkwaffe ist ohne großen Rechenaufwand möglich Treffertest zwischen AABB und Lenkwaffe ist ohne großen Rechenaufwand möglich –Position der Lenkwaffe wird mit den Eckpunkten der Box verglichen

22 Einsatz von achsenausgerichteten Bounding Boxen für die Verbesserung der Performance bei Kollisions- und Schnittpunkttests auf Dreieckbasis (2) Bei Schnittpunktberechnung zwischen Strahl und Box wird überprüft ob der Strahl eine der sechs Flächen der Box schneidet Bei Schnittpunktberechnung zwischen Strahl und Box wird überprüft ob der Strahl eine der sechs Flächen der Box schneidet Bei Verwendung von AABB kann Test_for_axis_aligned_Ray_Intersection()- Methode benutzt werden Bei Verwendung von AABB kann Test_for_axis_aligned_Ray_Intersection()- Methode benutzt werden Praktikabelste Lösung ist eine eigene Klasse zur Erzeugung einer AA Bounding Box anzulegen Praktikabelste Lösung ist eine eigene Klasse zur Erzeugung einer AA Bounding Box anzulegen –Damit AABB korrekt initialisiert werden kann, müssen der Klasseninstanz vor dem Aufruf der Initialisierungmethode die minimalen und maximalen x-, y- und z-Werte übergeben werden

23 Einsatz von achsenausgerichteten Bounding Boxen für die Verbesserung der Performance bei Kollisions- und Schnittpunkttests auf Dreieckbasis (3) Ermittlung der Eckpunkte der Box 3 Seiten Quelltext Siehe Buch S (Aufruf der CAABB Kollisions- und Schnittpunkttests aus einer 3D Modellklasse heraus)

24 Kollision zweier 3D Modelle (1) Kollisionsprüfungen brauchen sehr viel Zeit (wurde schon sehr oft gesagt ) Kollisionsprüfungen brauchen sehr viel Zeit (wurde schon sehr oft gesagt ) Dem entgegen wirken Boundingboxen (wurde auch schon oft gesagt ) Dem entgegen wirken Boundingboxen (wurde auch schon oft gesagt ) Man hat die Wahl diese Boxen in einer einfachen Baumstruktur zu organisieren Man hat die Wahl diese Boxen in einer einfachen Baumstruktur zu organisieren –Hierarchisches Kollisionsmodell Oder als einen Satz gleichberechtigter Boxen zu definieren Oder als einen Satz gleichberechtigter Boxen zu definieren –All-equal Kollisionsmodell Muss Modellgeometrie möglichst gut wiedergeben Muss Modellgeometrie möglichst gut wiedergeben

25 Kollision zweier 3D Modelle (1) All-equal Kollisionsmodell All-equal Kollisionsmodell –Kommt mit wenigen Boxen aus und ist einfach zu implementieren –Ohne weitere Optimierung ist die benötigte Rechenzeit für einen vollständigen Prüflauf an Dreieck-Dreieck Kollisionstests deutlich höher als bei einem hierarchischem Kollisionsmodell –Bei nur 6 Boxen müssten schlimmstenfalls 36 Box-Box - Kollisionstests durchgeführt werden Bestenfalls nur ein Test Bestenfalls nur ein Test

26 Kollision zweier 3D Modelle (2) Hierarchisches Kollisionsmodell: Hierarchisches Kollisionsmodell: –Jedes Dreieck soll von einer Bounding Box umschlossen werden –Baumstruktur Sollte augeglichen sein Sollte augeglichen sein –Kommt in der Realität aber fast nie vor –Findet eine Box-Box Kollision statt, wird noch ein Dreieck-Dreieck- Kollisionstest durchgeführt –Zudem kann es vorkommen, dass die zu testende Box des einen Baumes mehrere Boxen eines anderen Baumes schneidet Dadurch müssen mehrere Testläufe in Kauf genommen werden Dadurch müssen mehrere Testläufe in Kauf genommen werden Bounding-Box-Kollisionstests Bounding-Box-Kollisionstests –3D Modelle unterliegen in der Spielerealität ständigen Veränderungen, weshalb der AABB-AABB Kollisionstest nicht angewendet werden kann –Deshalb gibt es eine logische Erweiterung, den OBB-OBB Kollisionstest

27 Kollision zweier 3D Modelle (2) Der OBB-OBB Kollisionstest Der OBB-OBB Kollisionstest –OB Boxen haben unendlich viele Orientierungsmöglichkeiten –Es ergeben sich nicht weniger als 15 potentielle separierbare Achsen, die nacheinander geprüft werden müssen –Siehe Beispiel S OBB-OBB Kollisionstest wird genau unter die Lupe genommen und Problemfälle erläutert OBB-OBB Kollisionstest wird genau unter die Lupe genommen und Problemfälle erläutert

28 Kollision zweier 3D Modelle (2) AABB-OBB-Kollisionstest AABB-OBB-Kollisionstest –Etwas einfacher aufgebaut, da eine achsenausgerichtete BB eines untransformierten Objektes gegen eine orientierte BB eines transformierten Objektes getestet werden muss –Orientierte BB des transf. Objektes müssen auf die Modellkoordinaten des untransformierten Objektes rücktransformiert werden Siehe S Siehe S

29 Kollision zweier 3D Modelle (3) Ein all-equal Modell im Einsatz Ein all-equal Modell im Einsatz –Mit Hilfe einer Methode, aus C_OBB, Init_as_AABB() können achsenausgerichtete BB für die 3D Modelle erzeugt werden –1. Schritt eines Kollisionstests besteht also darin die BB des einen Objektes (pObject[jj]) auf die Modellkoordinaten des anderen Objektes (pObject[j]) rück zu transformieren –Dafür stehen drei Rotationsmatrizen zur Verfügung:

30 Kollision zweier 3D Modelle (4) Im einfachsten Fall werden dann alle ausger. BB des untr. Objektes (pObject[j]) paarweise gegen alle OBB des tr. Obejktes (pObject[jj]) auf mögliche Kollision getestet Im einfachsten Fall werden dann alle ausger. BB des untr. Objektes (pObject[j]) paarweise gegen alle OBB des tr. Obejktes (pObject[jj]) auf mögliche Kollision getestet


Herunterladen ppt "Kollisionen erkennen - Kollisions- und Schnittpunkttests auf Dreieckbasis - Kollisions- und Schnittpunkttests auf Viereckbasis - Einsatz von achsenausgerichteten."

Ähnliche Präsentationen


Google-Anzeigen