FRIEDRICH-ALEXANDER-UNIVERSITÄT ERLANGEN-NÜRNBERG. Lehrstuhl für Informatik 10 (Systemsimulation)

Größe: px
Ab Seite anzeigen:

Download "FRIEDRICH-ALEXANDER-UNIVERSITÄT ERLANGEN-NÜRNBERG. Lehrstuhl für Informatik 10 (Systemsimulation)"

Transkript

1 FRIEDRICH-ALEXANDER-UNIVERSITÄT ERLANGEN-NÜRNBERG INSTITUT FÜR INFORMATIK (MATHEMATISCHE MASCHINEN UND DATENVERARBEITUNG) Lehrstuhl für Informatik 10 (Systemsimulation) Geometrieprimitive und Dreiecksgitter für die pe Physikengine Martin Ketzer Diplomarbeit

2 Geometrieprimitive und Dreiecksgitter für die pe Physikengine Martin Ketzer Diplomarbeit Aufgabensteller: Prof. Dr. U. Rüde Betreuer: M. Sc. Klaus Iglberger Bearbeitungszeitraum: 26. September März 2007

3 Erklärung: Ich versichere, dass ich die Arbeit ohne fremde Hilfe und ohne Benutzung anderer als der angegebenen Quellen angefertigt habe und dass die Arbeit in gleicher oder ähnlicher Form noch keiner anderen Prüfungsbehörde vorgelegen hat und von dieser als Teil einer Prüfungsleistung angenommen wurde. Alle Ausführungen, die wörtlich oder sinngemäß übernommen wurden, sind als solche gekennzeichnet. Erlangen, den 16. April

4 Zusammenfassung Geometrieprimitive und Dreiecksgitter für die pe Physikengine Die Kollisionserkennung ist ein wichtiges Forschungsgebiet, da sie vielfältige Anwendungen findet und es keine für alle Verwendungsgebiete passende Lösung gibt. Die pe Physikengine simuliert physikalisch möglichst exakt Kollisionen zwischen Körpern. In dieser Arbeit wird die Engine um neue geometrische Primitive erweitert. Zusätzlich zu den schon existierenden Geometrien Kugel und Ebene werden Kapsel und Box hinzugefügt. Weiterhin wird die Engine um beliebig geformte Geometrien in Form von Dreicksnetzen erweitert. Für diese neuen Körper werden Algorithmen zu Kollisionserkennung und Kollisionsbestimmung beschrieben. Dabei wird besonders Wert auf möglichst hohe pysikalische Korrektheit gelegt und erst nachranging auf hohe Geschwindigkeit. Die Berechnung der Kontaktpunkte der Körper funktioniert sehr gut, jedoch gibt es Probleme bei der Kollisionsreaktion, da die pe Engine durch ihre bisherige ausschließliche Verwendung von Kugeln und Ebenen Kanten-Kollisionen nicht korrekt simuliert. Diese Probleme treten bei Boxen und Dreiecksnetzen auf. Weiterhin wird die Physikengine durch eine Visualisierung erweitert, die es erlaubt, während der Berechnung die simulierte Szene zu betrachten. Damit eignet sie sich sehr gut, den Verlauf und die Ergebnisse einer Simulation möglichst früh zu beurteilen. Die neuen Fähigkeiten der pe Physikengine werden an einigen Beispielen gezeigt.

5 Inhaltsverzeichnis 1 Einleitung Ziele Kollisionserkennung pe eine Physikengine Kollisionserkennung in der pe Physikengine Aufwandsabschätzung bei der Kollisionserkennung Implementation Ungenauigkeit der Berechnungen Optimierungen Numerische Optimierungen Zweistufige Kollisionserkennung Bounding Volumes Hierarchische Kollisionserkennung Kollisionserkennung mit Hierarchien Körper und Definitionen Körper Ebene Kugel Kapsel Axis-aligned Bounding Box Box Dreiecksnetz Union Das stl-format Das ASCII-Format Das binäre Format Einschränkungen des stl-formats Separating Axis Theorem v

6 INHALTSVERZEICHNIS 4 Geometrische Werkzeuge Abstand zwischen einem Punkt und einer Linie Schnitt zweier Linien im Zweidimensionalen Punkte nächster Annäherung zwischen zwei Linien in drei Dimensionen Berechnung der nächsten Punkte auf zwei Liniensegmenten Nächster Punkt auf einer Box und einem Liniensegment Punkt-In-Dreieck-Test Kollisionsalgorithmen Kugel-Kugel-Kollision Kollisionserkennung Kontaktpunkterzeugung Kugel-Ebenen-Kollision Kollisionserkennung Kontaktpunkterzeugung Kugel-Box-Kollision Kollisionserkennung Kontaktpunkterzeugung Kugel-Kapsel-Kollision Kollisionserkennung Kontaktpunkterzeugung Box-Box-Kollision Kollisionserkennung Kontaktpunkterzeugung Box-Kapsel-Kollision Kollisionserkennung Kontaktpunktberechnung Box-Ebenen-Kollision Kollisionserkennung Kontaktpunktberechnung Kapsel-Kapsel-Kollision Kollisionserkennung Kontaktpunktberechnung Kapsel-Ebenen-Kollision Kollisionserkennung Kontaktpunktberechnung Dreiecksnetz-Ebene-Kollisionen Kollisionserkennung Kontaktpunktberechnung Dreiecksnetz-Kugel-Kollisionen Kollisionserkennung Kontaktpunktberechnung Dreiecksnetz-Kapsel-Kollisionen vi

7 INHALTSVERZEICHNIS Kollisionserkennung Kontaktpunktberechnung Dreiecksnetz-Dreiecksnetz-Kollisionen Kollisionserkennung Kontaktpunktberechnung Dreiecksnetz-Box-Kollisionen Union-Kollisionen Die Echtzeitvisualisierung Integration der Visualisierung Die OpenGL-Renderpipeline Die Anwendungsstufe Die Geometriestufe Die Rasterisierungsstufe Darstellung einer Box als Beispiel der Visualisierung Beispielszenen Erstellen einer Szene Benchmarks eigener Szenen Torrus vs. Kugeln Kugel rollen schräge Boxen hinab Schluss Ergebnisse A Bilder 71 A.1 Verschiedene Screenshots des Viewers A.2 Vergleich einer Simulation mit Dreiecksnetz-Boxen und echten Boxen Literaturverzeichnis 79 vii

8 viii INHALTSVERZEICHNIS

9 Abbildungsverzeichnis 2.1 Darstellung verschiedener Hüllvolumen Darstellung einer oriented bounding box im Vergleich zu einer axis-aligned bounding box Beispiel für eine BSP-Baum Beispiel für den Aufbau eines Baumes zur Raumunterteilung Beispielbaum Darstellung einer Kugel Darstellung einer Kapsel Darstellung einer Kapsel Darstellung einer AABB Darstellung einer Box Darstellung einer Box Darstellung eines Dreiecksnetzes Darstellung des SAT Abstand zwischen einem Punkt und einem Liniensegment Schnitt zweier Linien im Zweidimmensionalen Verschiedene Möglichkeiten der größtmöglichen Annäherung zwischen zwei Endpunkten zweier Liniensegmente Verschiedene Möglichkeiten der größtmöglichen Annäherung zwischen einem Endpunkt eines Liniensegments und einem zweiten Liniensegment Darstellung der Bestimmung eines nächstliegenden Punktes zu einem Liniensegment Mögliche Punkte nächster Annäherung zu einem Linie auf einer Box Nächster Punkt auf einer Box und einem Liniensegment Punk-In-Dreieck-Test Darstellung der Kollisionserkennung zweier Kugeln Darstellung der Kollision zweier Kugeln Darstellung der Kollision zwischen einer Kugel und einer Kapsel Darstellung der Kontaktpunktberechnung zwischen einer Kugel und einer Kapsel ix

10 ABBILDUNGSVERZEICHNIS 5.5 Darstellung des Separation Axis Theorem bei zwei Boxen Kante-Kante-Kollision zweier Boxen Verschiedene Möglichkeiten einer Box-Kollisionsfläche bei parallelen Seitenflächen Verschiedene Möglichkeiten einer Box-Box-Kollision Verschiedene Möglichkeiten einer Kapsel-Box-Kollision Kollisionserkennung zwischen Box und Ebene Darstellung der Kollisionserkennung zwischen einer Kapsel und einer Ebene aufgeblasenes Dreieck zur Kollisionserkennung Schnitt einer Linie mit einer Ebene Verschiedene Möglichkeiten der Lage zweier Dreiecke zueinander A.1 Szene: 100 Kapseln fallen auf Union aus 4 Boxen A.2 Szene: 100 Kugeln fallen auf Torrus A.3 Szene: Kugeln rollen mehrere Boxen hinunter A.4 Zeitschritt A.5 Zeitschritt A.6 Zeitschritt A.7 Zeitschritt A.8 Zeitschritt A.9 Zeitschritt A.10 Zeitschritt A.11 Zeitschritt A.12 Zeitschritt A.13 Zeitschritt A.14 Zeitschritt A.15 Zeitschritt A.16 Zeitschritt x

11 Tabellenverzeichnis 7.1 Benchmarks Benchmarks xi

12 xii TABELLENVERZEICHNIS

13 Kapitel 1 Einleitung 1.1 Ziele Aufgabe dieser Arbeit ist es, die pe Physikengine um verschiedene primitive Geometrien zu erweitern. Neben den existierenden Geometrien Kugel und Ebene sollen Kapsel und Box in die Engine integriert werden. Weiterhin sollen beliebig geformte Geometrien in Form von Dreiecksnetzen verwendet werden können. Das Hinzufügen neuer Geometrien beinhaltet den Entwurf passender Datenstrukturen, um deren Eigenschaften wiederzugeben, sowie die Programmierung von Kollisionsroutinen zwischen den verschiedenen Geometrien. Damit einher geht das Finden von Algorithmen, welche Kollisionen zwischen den verwendeten Körpern erkennen und bestimmen können. Die entstandenen Kollisionsroutinen sollen auf Geschwindigkeit optimiert werden, wobei zu beachten ist, dass es die Zielsetzung der pe-engine ist, möglichst hohe physikalische Exaktheit zu erreichen. Die Optimierungen dürfen also nicht zu Lasten der Genauigkeit gehen. Weiterhin soll eine Visualisierung entstehen, welche es ermöglicht, während der Physiksimulation in Echtzeit bzw. vielmehr in Simulationszeit die Bewegungen der simulierten Körper nachzuvollziehen. Es wird damit ermöglicht, eventuelle Fehler, sowohl in Programmteilen, als auch in der Ausgangssituation der simulierten Szene, frühzeitig zu erkennen und zu beheben. Als Letzes sollen die neuen Fähigkeiten der Physikengine anhand von Beispielen zu demonstriert werden. 1.2 Kollisionserkennung Kollisionserkennung ist eines der vielen Probleme, die jeder Mensch jeden Tag vielfach löst, ohne sich darüber Gedanken zu machen. Es ist beispielsweise für einen Menschen ohne größere geistige Anstrengung möglich, eine Tasse auf einem Tisch abzustellen, ohne dass deren Inhalt verschüttet wird. Ebenso kann sich jeder durch eine Menschenmenge bewegen und dabei Zusammenstöße vermeiden, so lang noch genügend Platz ist. Auch beim Ballspiel, bei dem das Spielgerät am Boden oder Hindernissen abprallt und damit seine Bewegungsrichtung verändert, ist es für einen Menschen in gewissen Grenzen möglich, die zukünftige Bewegung des Balles vorherzusagen. Für einen Computer sind diese Probleme sehr komplex und nur mit großem Berechnungsaufwand sowie komplizierten Algorithmen lösbar. 1

14 KAPITEL 1. EINLEITUNG Das gilt auch nur, falls alle Parameter der Ausgangssituation genau festgelegt sind. Kollisionserkennung ist immer noch ein wichtiges Forschungsgebiet, da sie vielfältige Anwendungen findet und es keine für alle Verwendungsgebiete passende Lösung gibt. Sie ist ein fundamentaler Baustein für viele Anwendungen der Computergrafik und Simulation virtueller Umgebungen. Sie wird sowohl in Computerspielen, Flug- und Fahrzeugsimulatoren, Robotik, virtual manufactoring, CAD/CAM sowie in fast jeder Virtual Reality - Simulation verwendet. Die Kollisionserkennung ist im eigentlichen Sinne nur ein Teil der Kollisionsbehandlung, hat sich jedoch im allgemeinen Sprachgebrauch als Oberbegriff für dieses Gebiet durchgesetzt. Die Kollisionsbehandlung setzt sich aus der Kollisionserkennung (collision detection), der Kollisionsbestimmung (collision determination) und der Kollisionsreaktion (collision response) zusammen. Die Kollisionserkennung liefert eine Aussage darüber, ob zwei Objekte miteinander kollidieren, die Kollisionsbestimmung findet die Schnitte zwischen den Objekten und die Kollisionsreaktion entscheidet, welche Reaktion auf die Kollision der Objekte erfolgen soll. In vielen, weit verbreiteten Anwendungsgebieten, wie beispielsweise in Computerspielen, reicht eine Annäherung der Kollisionsbehandlung an das Verhalten realer Objekte. In der Kollisionserkennung geschieht das etwa durch Annäherung komplexer Objekte mit einfachen geometrischen Formen. Auch eine exakte Simulation der Physik wird oft durch zu Gunsten der Geschwindigkeit optimierte Algorithmen ersetzt. In vielen Fällen muss ein Kompromiss zwischen ausreichend schneller Berechnung und einem möglichst realistischen Verhalten gefunden werden. Diese reduzierte Genauigkeit ist jedoch nicht für alle Anwendungen ausreichend, so dass eine Kollisionsbehandlung nötig wird, deren Ergebnis möglichst genau dem erwarteten physikalisch korrekten Verhalten entspricht. Die exakte Kollisionserkennung bedeutet jedoch nicht, dass keine Optimierungen möglich sind. Sie kann mit Verfahren beschleunigt werden, welche das Ergebnis nicht beeinflussen, jedoch deren Berechnung vereinfachen. 1.3 pe eine Physikengine Das Ziel der pe Physikengine ist es, möglichst realistisch die Bewegungen und Zusammenstöße verschiedener Körper zu simulieren. Die physikalische Exaktheit ist dabei oberstes Kriterium und steht vor anderen Zielsetzungen, wie hohe Geschwindigkeit. In pe werden Kollisionen nur zwischen je zwei Körpern berechnet, somit muss, um alle Körper auf Kollisionen zu testen, jeder Körper gegen jeden anderen getestet werden. Die Simulation läuft in mehreren Schritten ab. Zuerst wird eine Kollision zwischen zwei Körpern geprüft. Existiert keine, ist die Berechnung für die Kombination dieser Körper in diesem Zeitschritt beendet. Wurde eine Kollision erkannt, werden als Nächstes ein oder mehrere Kontaktpunkte berechnet, welche die Kollision repräsentieren sollen. In der realen Welt würden zwischen zwei Körpern immer Flächen kollidieren - allerdings ist es zur Simulation ausreichend genau, einzelne Punkte zu verwenden. Dabei spielt die Anzahl der zu berechnenden Kontakte eine große Rolle. Beispielsweise können zwei Kugeln idealisiert an genau einem Punkt zu- 2

15 1.3. PE EINE PHYSIKENGINE sammenstoßen. Eine Kollision zwischen einer Fläche einer Box und einer Ebene kann aber schon bis zu vier Kontaktpunkte benötigen, um eine physikalisch korrekte Berechnung der Kollision zu erlauben. Genauer wird auf dieses Problem eingegangen, wenn es bei den Kollisionsberechnungen zwischen einzelnen Körpern auftritt. In pe gehören verschiedene Daten zu einem Kontaktpunkt: der beteiligte Körper 1 der beteiligte Körper 2 die Position des Kontaktpunktes die Kollisionsnormale von Körper 2 zu Körper 1 Die beiden ersten Angaben sind Ergebnis der Kollisionserkennung, die beiden letzten werden in der Kollisionsbestimmung berechnet. Sowohl die Position des Kontaktpunktes als auch die Normale sind in Weltkoordinaten angegeben. Der Kontaktpunkt sollte sich idealerweise auf der Oberfläche beider kollidierender Körper befinden. Der letzte Schritt - die Reaktion auf die Kollision - ist nicht Bestandteil dieser Arbeit, wird jedoch von pe auf Grundlage der in den ersten beiden Schritten berechneten Daten durchgeführt. Es werden die durch die Kollisionen verursachten Änderungen an Geschwindigkeit und Winkelgeschwindigkeit der Körper angewendet. Vor der Simulation des nächsten Zeitschrittes werden die neuen Positionen und Rotationen der simulierten Körper berechnet. Die Zeit ist in pe in feste Schritte eingeteilt, in einem Zeitschritt wird immer die Bewegung aller Körper der gesamten Welt für ein Zeitintervall berechnet. Die Größe der Zeitintervalle sind, je nach Szenario, frei wählbar. Dieses Konzept der Einteilung in Zeitschritte hat den Nachteil, dass Ereignisse die zwischen zwei Zeitschritten auftreten, nicht berücksichtigt werden können. Für die Kollisionserkennung bedeutet dies, dass eine Kollision (fast) immer erst zu einem Zeitpunkt erkannt wird, in dem die eigentliche Kollision schon vorbei ist und die kollidierenden Körper sich überschneiden. Dieses Konzept nennt man a posteriori im Gegensatz zu a priori -Ansätzen, bei denen im Voraus bestimmt wird, wann genau eine Kollision stattfinden wird, so dass zwei kollidierende Körper sich nie überschneiden. Der Vorteil der a posteriori -Methode ist, dass die Kollisionserkennung kein Wissen über die zugrundeliegende Physikberechnung der Engine haben muss. Somit ist dieser Ansatz einfacher zu implementieren und gewährleistet eine Trennung zwischen Physik- und Geometrie-Berechnungen. Eine Schwierigkeit bei dem in pe verwendeten a posteriori -Ansatz ist die Bestimmung einer ausreichend hohen Zeitauflösung. Diese hängt von der Geschwindigkeit und Größe der Simulationsobjekte ab, da v = s t. Dass heißt um so kleiner oder/und um so schneller die Objekten sind, desto so höher muss die Zeitauflösung sein. Im ungünstigsten Fall kommt es sonst dazu, dass zwei Objekte eine Kollision zwischen zwei Zeitschritten hätten, dies aber nie erkannt werden kann. 3

16 4 KAPITEL 1. EINLEITUNG

17 Kapitel 2 Kollisionserkennung in der pe Physikengine 2.1 Aufwandsabschätzung bei der Kollisionserkennung Der Aufwand für die Kollisionserkennung mit n dynamischen und m statischen Objekten skaliert im unoptimierten Fall sehr schlecht mit: nm + ( ) n 2 wobei nm dafür steht, dass alle unbewegten Objekte gegen alle bewegten getestet werden, ( n ) 2 dafür, dass alle bewegten Objekte gegeneinander getestet werden müssen[1]. Dies kann man mit Methoden optimieren, welche in einem ersten Schritt diejenigen Objekte bestimmen, welche überhaupt für eine Kollision in Frage kommen (siehe 2.4.4). Mit hierarchischen Strukturen sollte sich dieser Aufwand signifikant reduzieren lassen. Eine Abschätzung des Gewinns ist jedoch sehr schwer, da er stark vom konkreten Anwendungsszenario abhängt. (2.1) 2.2 Implementation Die pe Engine ist objektorientiert in C++ programmiert. Alle Körper in pe sind Objekte, welche in Klassen definiert sind. Es gibt Hilfsklassen zur Repräsentation von dreidimensionalen Vektoren Vector3 und Matrizen Matrix3. Sie stellen verschiedene Funktionen und überladene Operatoren zur Verfügung, mit denen alle gängigen Vektor- und Matrixoperationen möglich sind. Unter anderem sind dies folgende: Multiplikation eines Skalars mit einem Vektor: * Skalarprodukt zweier Vektoren: * Multiplikation einer Matrix mit einem Vektor: * Berechnung der Transponierten einer Matrix: Transpose() 5

18 KAPITEL 2. KOLLISIONSERKENNUNG IN DER PE PHYSIKENGINE Zugriffsoperator auf einzelne Komponenten einer Matrix oder eines Vektors: [] Länge eines Vektors: Length() quadrierte Länge eines Vektors: SqrLength() In pe wird für Fließkommazahlen der Typ real verwendet, der als double oder float definiert werden kann. 2.3 Ungenauigkeit der Berechnungen Zu der Ungenauigkeit des Zeitpunktes, zu der eine Kollision festgestellt wird, kommt noch die begrenzte Genauigkeit von Berechnungen mit Fließkommazahlen. Um diese Ungenauigkeit einzubeziehen, wird, wenn zwei Zahlen auf Gleichheit getestet werden sollen, eine sehr kleine Zahl ǫ festgelegt, welche die Höchstabweichung der verglichenen Zahlen festlegt, bis zu der sie als gleich gelten sollen. Diese Zahl kann von Test zu Test variieren und wird normalerweise so gewählt, dass sie in dem Fall eines bestimmten Problems gute Ergebnisse erzeugt. Problematisch kann dabei sein, dass mit einem festen ǫ auch immer Annahmen über die Größenordnung der beteiligten Zahlen getroffen werden, da die Genauigkeit von Zahlen in Fließkommadarstellung von ihrer Größe abhängt. Dennoch werden meist feste Werte, also Konstanten, verwendet, die aber leicht veränderbar sind. In pe gibt es verschiedene Epsilons. Der contactthreshold bestimmt, ab welchem Abstand zwei Körper als kollidierend angesehen werden. Der surfacethreshold gibt an, ab welchem Abstand ein Punkt als Oberflächenpunkt eines Körpers betrachtet wird und der parallelthreshold ab welchem Wert des Skalarproduktes zweier Vektoren diese für parallel gehalten werden. Letztere Angabe sollte aus Gründen der Stabilität nur als erste Abschätzung dienen, da ein kleiner Winkel zwischen zwei Vektoren auf eine genügend lange Strecke trotzdem in einem großen Abstand resultieren kann. 2.4 Optimierungen Eine verbreitete Methode zur Beschleunigung von Kollisionstests ist ein sogenannter rejection test - ein einfacher Test, der im Falle eines Erfolgs anzeigt, dass keine Kollision stattfindet. Weiterhin versucht man oft, den Test auf eine oder zwei Dimensionen zu reduzieren, indem man auf eine geeignete Ebene projiziert. Auch numerische Optimierungen sind wichtig für effiziente Algorithmen. Im Folgenden beschreibe ich einige zur Geschwindigkeitsoptimierung geeignete Möglichkeiten Numerische Optimierungen Es gibt viele Möglichkeiten durch bloßes Umstellen von Gleichungen die Berechnung zu vereinfachen bzw. nicht unnötig zu verkomplizieren. Divisionen sollten möglichst vermieden werden, zum Beispiel kann statt x 2 einfach x 0.5 berechnet werden. Ebenso kann 6

19 2.4. OPTIMIERUNGEN man den Zähler in Brüchen als Reziproke vorberechnen, falls man ihn mehrfach verwendet. Bei Vergleichen lohnt es sich bestimmte Operationen möglichst spät durchzuführen. Zum Beispiel könnte ein Vergleich die Länge eines Vektors erfordern, welche aber nur im Falle eines positiven Tests als konkreter Zahlenwert benötigt wird. So könnte eine Bedingung lauten a r, welches sich dann mit kleinerem Berechnungsaufwand durch a 2 r 2 ersetzen lässt, da die für die Längenberechnung erforderliche Wurzeloperation aufwändiger ist als das Quadrieren einer Zahl. Falls allerdings die wirkliche Länge des Vektors fast immer benötigt wird, kann der Berechnungsaufwand durch eine solche Ersetzung auch höher werden. Gerade wenn vor der eigentlichen Kollisionserkennung schon bestimmt wurde, ob eine Kollision der betreffenden Objekte wahrscheinlich ist (siehe 2.4.2). Generell sollte die Berechnung von Werten möglichst spät erfolgen und erst nach dem wirklich sicher ist, dass sie benötigt werden. Diese Vorgehensweise wird oft als lazy evaluation bezeichnet. Es ist wichtig, Werte nur einmal zu berechnen und möglichst oft wieder zu verwenden, wobei zu beachten ist, dass dies den Programmcode nicht unnötig unleserlich macht. Oft ist es leider so, das eine einfach verständliche Lösung eher langsam, die optimierte Lösung eher unleserlich ist. Dabei muss ein Kompromiss zwischen beiden Zielen gefunden werden Zweistufige Kollisionserkennung Hierbei handelt es sich um ein Verfahren aufwändige Berechnungen zu vermeiden, indem in einer ersten Stufe der Kollisionserkennung mögliche kollidierende Körper bestimmt werden. Erst in einer zweiten Stufe werden die exakten Kollisionen und Kontaktpunkte berechnet. Dafür verwendet man Hüllvolumen (Bounding Volumes), welche jedes Objekt einschließen und auf Überlappung getestet werden können. Wenn die Hüllvolumen zweier Objekte keine Überschneidung aufweisen, so kann davon ausgegangen werden, dass auch die Objekte nicht kollidieren Bounding Volumes Bei der Auswahl der Hüllvolumen gibt es verschieden wichtige Eigenschaften, die beachtet werden sollten bzw. welche die Hüllvolumen besitzen müssen. Sie sollten die zu testende Geometrie möglichst eng umschließen, um möglichst wenig irrtümlich positive Testergebnisse zu liefern. Sie sollten schnell zu testen und schnell zu erstellen sein. Diese Ziele sind nicht immer alle gleich gut zu erfüllen, vor allem, da der Nutzen bestimmter Bounding Volumes auch vom konkreten Anwendungsfall abhängt. Falls eine Szene zum Großteil aus Kugeln besteht und damit die meisten Überprüfungen auf eine Kollision Kugel gegen Kugel - oder Kugel gegen Ebene -Tests sind, kann der Gewinn von Hüllvolumen nicht sehr groß sein bzw. Hüllvolumen können diese Szene sogar verlangsamen und den Speicherbedarf erhöhen. Andererseits gibt es komplexere Geometrien, die im Verhältnis so langsam zu testen sind, dass Hüllvolumen die Berechnung wesentlich vereinfachen, so dass die generelle Verwendung von Hüllvolumen gerechtfertigt erscheint. Gerade die komplizierteren Tests sind aufwändiger und dauern länger, wodurch der Gewinn größer und eher zu bemerken ist, als 7

20 KAPITEL 2. KOLLISIONSERKENNUNG IN DER PE PHYSIKENGINE Abbildung 2.1: Verschiedene Hüllvolumen, zur Veranschaulichung in zwei Dimensionen: von links 1. axis-aligned bounding box, 2. axis-aligned bounding box als von der Drehung des Objektes unabhängiger Würfel, 3. Kugel als Hüllvolumen der eventuelle Verlust bei Szenarien mit sehr einfachen Körpern. Ein einfacher Fall eines Hüllvolumens ist eine an den Koordinatenachsen ausgerichtete Box - eine so genannte axis-aligned bounding box (AABB). Nachteil dieses Hüllvolumens ist es, dass es in jedem Bewegungsschritt neu berechnet werden muss. Möglich wäre aber auch die Verwendung eines Würfels als AABB, der das in ihm enthaltene Objekt in jeder Orientierung umschließt, so dass die Bounding Box bei jeder Bewegung des Objektes nur verschoben werden muss. An Stelle solcher Würfel ist es jedoch auch möglich eine Kugel als Hüllvolumen zu verwenden, da diese der in Bezug auf das Volumen ideale, gegen Drehung invariante Körper ist (siehe Bild 2.1). Ein weiterer, als Hüllvolumen verwendbarer, Körper ist eine oriented bounding box (OBB). Es handelt sich dabei um eine AABB, die zusätzlich gedreht sein kann. Damit kann die Box ein viel kleineres Volumen umschließen (siehe Bild 2.2), ist aber auch wesentlich komplizierter auf Schnitte zu testen. Allerdings muss sie nicht in jedem Zeitschritt neu berechnet werden, da sie sich mit dem umschlossenen Objekt mitdreht. Die OBB ist also nur bei komplexen Geometrien sinnvoll einsetzbar und sollte eventuell selbst noch einmal von einer Bounding Box umschlossen sein. Es sind natürlich beliebige andere Bounding Volumes denkbar, genauso wie Ansätze, den gesamten Raum hierarchisch zu unterteilen (siehe 2.4.4). In pe hat jedes Objekt eine AABB als Hüllvolumen. Die Bounding Boxes zweier Objekte werden vor dem eigentlichen Kollisionstest auf Überlappung hin getestet - falls schon diese nicht kollidieren, so können es auch die Objekte nicht und der Kollisionstest wird mit negativem Ergebnis beendet Hierarchische Kollisionserkennung Eine hierarchische Kollisionserkennung ist ähnlich einer zweistufigen Kollisionserkennung, nur gibt es hier mehr als zwei Stufen, welche in hierarchischen Datenstrukturen abgespeichert sind. Damit kann die Gesamtperformanz bei sehr komplexen Szenen verbessert werden. Bei der Erklärung des Konzeptes von Hierarchien in der Kollisionserkennung spielt die Ebene der Verwendung dieser erst einmal keine Rolle. Denkbar ist die Anwendung auf 8

21 2.4. OPTIMIERUNGEN Abbildung 2.2: Eine oriented bounding box (rechts) kann im Vergleich zu einer axis-aligned bounding box (links) ein wesentlich kleineres Volumen haben. eine gesamte Szene mit den darin enthaltenen Objekten genau wie auf ein komplexes Dreiecks-Modell eines Körpers. Speziell in letzterem Fall ist allerdings die Verwendung einer Form von hierarchischer Kollisionserkennung unerlässlich, da die Geschwindigkeit der Berechnung von Kollisionen durch einen solchen Körper sehr stark abnimmt. Dies ist dadurch zu erklären, dass jedes einzelne Dreieck, welches Teil dieses Körpers ist, als eigenständiges Objekt auf Kollisionen getestet werden muss. Die grundsätzliche Idee, die hier Anwendung findet, ist die Darstellung des Raumes eines Körpers oder einer Szene durch eine Hierarchie von Bounding Volumes. Damit einhergehend werden in den höheren Ebenen der Kollisionserkennung nur Tests dieser Hüllvolumen gegeneinander ausgeführt. Der Ablauf dieser Tests ist unabhängig von der Art des verwendeten Hüllvolumens und wird in erläutert BSP-Bäume Ein BSP-Baum oder Binary Space Partition Tree teilt in jeder Ebene des Baumes den Raum in zwei Teile. Jedem Knoten ist ein Volumen zugeordnet, welches alle seine Kinder umschließt. In pe werden Axis-Aligned BSP-Trees verwendet, bei denen der Raum rekursiv in AABB aufgeteilt wird. Es ist am Günstigsten, die jeweils größte Ausdehnung des umschlossenen Raumes zu unterteilen. Das führt zu möglichst kubischen Hüllvolumen mit möglichst kleinen Oberflächen, was im Sinne der Kollisionserkennung ideal ist. Die Stelle, an der der Raum in jeder Ebene geteilt wird, kann auf verschiedene Arten festgelegt werden. Es ist möglich auf beiden Seiten gleich viele Objekte zu haben, indem beiden Teilbäumen die Hälfte der Objekte zugeordnet werden. Auch ist es möglich, gleichgroße Volumen zu erhalten, indem der Raum in der Mitte geteilt wird. Beide Verfahren können Vor- und Nachteile haben. Die Unterteilung nach der Anzahl der Objekte kann zu sehr unterschiedlich großen Räumen für beide Teile führen, wobei der Abstieg in einen der Teilbäume somit wesentlich wahrscheinlicher 9

22 KAPITEL 2. KOLLISIONSERKENNUNG IN DER PE PHYSIKENGINE Abbildung 2.3: Die Unterteilung der verschiedenen Ebenen eines BSP-Tree (im zweidimensionalen). Die gestrichelten Linien stellen die AABB der verschiedenen Ebenen des Baumes dar. Um so feiner die Strichlienie, um so tiefer ist die Ebene. Es ist zu sehen, dass jede AABB entweder zwei weitere AABB oder zwei Primitive enthält. Siehe auch Abb. 2.4 und 2.5 zur Entstehung dieser hierarchischen Aufteilung. ist als in den anderen. Die mittige Unterteilung könnte (fast) leere Teilbäume zum Ergebnis haben, was die Höhe des Baumes unnötig anwachsen lässt. In der Implementierung für die pe Physikengine erfolgt die Teilung abhängig von der Anzahl der Objekte. Weiterhin muss festgelegt werden, wieviele Objekte ein Blatt enthalten darf - wann also mit der hierarchischen Unterteilung aufgehört werden soll. Da in pe jedes der verwendeten Primitive eine eigene Bounding Box besitzt, wird die Unterteilung bei zwei Objekten pro Knoten abgebrochen, damit die AABB-Daten nicht doppelt gespeichert werden müssen. Es ist zu beachten, dass sich bei der in pe verwendeten Methode beide Kindknoten überschneiden können, da die Ausdehnung der Objekte bis in das Hüllvolumen des anderen Kindes reichen kann. Damit ist es möglich, dass in beide Kinder abgestiegen werden muss. Eine Alternative dazu wäre es, zu erlauben, dass Objekte in inneren Knoten gespeichert werden dürfen, was den Baum jedoch komplizierter macht und auch zu Entartungen führen kann, wenn sehr unterschiedlich große Objekte abgespeichert werden. In der Abbildung 2.3 ist ein BSP-Baum mit geometrischen Primitiven veranschaulicht, in den Abbildungen 2.4 und 2.5 ist der Aufbau dieses Baumes dargestellt. 10

23 2.4. OPTIMIERUNGEN Aufbau von BSP-Bäumen Im Folgenden wird der Algorithmus erklärt, mit dem ein Dreiecksnetz, welches auf Kollisionen getestet werden soll, in einem BSP-Baum unter Verwendung von AABB abspeichert wird. Die Methode wäre aber mit geringen Abwandlungen auch verwendbar, um Körper einer Szene in einer Hierarchie abzuspeichern. Die abgespeicherten Objekte müssen nur Funktionen besitzen, um ihren Mittelpunkt und ihre AABB zurückzugeben. Es gibt verschiedene Methoden einen Baum aufzubauen, die hier beschriebene Methode arbeitet nach dem top-down -Prinzip. Am Anfang wird eine das ganze Modell umfassende Bounding Box bestimmt, welche in den weiteren Schritten rekursiv unterteilt wird. Am Ende sollen in jedem Knoten nur zwei Kindknoten, zwei Dreiecke oder ein Dreieck und ein Kindknoten vorhanden sein. Als Erstes werden alle vorhandenen Primitive nach der Position ihres Mittelpunktes sortiert - und zwar für jede Achse. Das Ergebnis sind also drei Listen, mit den nach jeweils einer Achse sortierten Referenzen auf Dreiecke. Da die Listen Referenzen auf die Objekte enthalten, hält sich der Platzbedarf in Grenzen. Nun wird die Ausdehnung der AABB des Wurzelknotens, welche die AABB aller umschlossenen Dreiecke enthält, bestimmt. Die Daten der AABB werden in dem aktuellen Knoten gespeichert. Die Dimension der größten Ausdehnung der AABB wird bestimmt und die entsprechende Objektliste halbiert. Dadurch sind gleich viele Dreiecke in beiden Nachfolgerknoten enthalten. Praktisch wird ein Index berechnet, ab dem der zweite Teil der Liste und damit der andere Ast des Baumes beginnt. Dieser Index stimmt aber nur für die Liste, die nach der Koordinate sortiert ist, deren Achse geteilt wurde. Die beiden anderen Achsen müssen allerdings auch in den rechten und linkten Teilbaum aufgespalten werden. Dies wird durch einen Wert als Marker realisiert, der in den Objekten gespeichert wird und bestimmt, ob ein Objekt in die rechte oder linke Teilliste gehört. Beim Durchgehen der Liste der geteilten Achse werden alle Objekte je nach Zugehörigkeit markiert. Die Elemente der Listen der beiden anderen Dimensionen werden jetzt nacheinander in eine neue Liste übertragen und dabei in die richtige Hälfte gespeichert. Da die Listen vorher sortiert waren, sind jetzt beide Hälften in sich sortiert. Nun kann der Baumaufbau in der nächsten Ebene gestartet werden, indem der Algorithmus für beide Teilbäume aufgerufen wird. Es werden jeweils die Indizes auf das erste und letzte Element dieses Teilbaumes sowie Referenzen auf die drei sortierten Listen übergeben. Abgebrochen wird der Algorithmus, wenn nur noch ein Dreieck in einem Teilbaum enthalten wäre. Am Ende ist das ganze Dreiecksnetz in einer Hierarchie gespeichert - in jedem Knoten ist dessen AABB sowie der Index des ersten und letzten Dreiecks dieses Knotens gespeichert, so dass alle Informationen vorhanden sind, den Baum und jeden Teilbaum auf mögliche Schnitte zu testen und letztendlich die Primitive zu liefern, welche auf Kollisionen getestet werden müssen. Eine Optimierungsmöglichkeit wäre es, diese AABB in einem zusätzlichen bottom-up -Durchgang zu berechnen, da die AABB eines Knotens immer genau die AABB seiner Kinder umfasst. Da der hier beschriebene Baum mit Axis-aligned bounding boxes arbeiten, muss er in jedem Zeitschritt der Simulation neu berechnet werden, falls sich das Dreiecksnetz, welches er enthält, bewegt hat. Da ohne eine solche Hierarchie aber jedes Dreieck einzeln auf Kollision getestet werden muss, sollte sich dieser Aufwand durchaus lohnen. 11

24 KAPITEL 2. KOLLISIONSERKENNUNG IN DER PE PHYSIKENGINE (a) Objekte (b) oberste Ebene des Baumes (c) 1. Unterteilung (d) 2. Unterteilung Abbildung 2.4: Die Unterteilung der verschiedenen Ebenen eines BSP-Tree (im zweidimensionalen). Man sieht die Überlappung der einzelnen AABB. Die Hüllvolumen wurden nicht raumminimierend unterteilt, sondern immer bei der Hälfte der Objektanzahl. Es ist leicht zu sehen, dass, falls eine beliebige AABB keinen Schnitt mit einem anderen Körper aufweist, eine Kollision für diesen Teilbaum ausgeschlossen werden kann. Weiterhin sollte sich die Position der einzelnen Primitive im Baum in einem Zeitschritt nicht sehr ändern, so dass das neuerliche Sortieren der Liste weniger Aufwand verursacht als bei einer unsortierten Liste. Eine Möglichkeit den Neuaufbau der Hierarchie zu vermeiden wäre es, andere Hüllvolumen zu verwenden, etwa OBB oder Bounding Spheres. Beide wären durch eine Neuberechnung des Mittelpunktes und im Falle der OBB der Rotation in jedem Zeitschritt ausreichend beschrieben Kollisionserkennung mit Hierarchien Hier ist die Unterscheidung zwischen zwei Fällen zu treffen. Es könnte sein, dass lediglich eine Kollision erkannt werden soll - dann reicht es im Falle einer Kollision zu terminieren und das Ergebnis zurückzugeben. Möglich ist aber auch eine Bestimmung der kollidierenden Objekte, wobei der ganze Baum getestet werden muss. Der Ablauf ist sehr ähnlich - in 12

25 2.4. OPTIMIERUNGEN Abbildung 2.5: Der aus Bild 2.4 entstandene Baum. In den inneren Knoten werden nur Intervalle von Indizes auf eine Liste von Objekten und die AABB gespeichert. Die Blätter sind die zu speichernden Objekte. zweiten Fall muss das erkannte Objekt in eine Liste kollidierender Objekte eingetragen werden und danach der Algorithmus weiter laufen. Für einen Test zweier Hüllvolumen-Hierarchien gegeneinander wird in jeder Stufe erst getestet, ob einer der beteiligten Knoten ein Blatt ist - sonst wird weiter abgestiegen. Bei den Blättern muss die Kollisionserkennung für das entsprechende Primitiv gestartet werden. Falls die Knoten beider Bäume innere Knoten sind, ist es sinnvoll in den Knoten weiter abzusteigen, der das größere Volumen hat. So wird sicher gestellt, dass eine Kollision zweier Objekte A und B dasselbe Ergebnis liefert wie die Kollision von B mit A. Weiterhin liefert dieser Ansatz auch die höhere Geschwindigkeit. In dem Fall, dass ein beteiligter Knoten ein Blatt und der andere ein innerer Knoten ist, ist es möglich, entweder erst in den inneren Knoten weiter abzusteigen oder einen Test Hüllvolumen gegen Primitiv auszuführen. Einfacher ist es jedoch, das Hüllvolumen des Objekts zu testen, da dies keine zusätzliche Methode zum Testen von Hüllvolumen gegen Objekte voraussetzt. Wichtig ist es zu beachten, dass immer in beide Kindknoten abgestiegen werden kann, da Objekte mit Volumen nach ihrem Mittelpunkt sortiert werden und dadurch fast immer Überlappungen der beiden Hüllvolumen auftreten. 13

26 KAPITEL 2. KOLLISIONSERKENNUNG IN DER PE PHYSIKENGINE 14

27 Kapitel 3 Körper und Definitionen 3.1 Körper Im Folgenden werden alle Körper vorgestellt, die im Rahmen der Kollisionserkennung in pe verwendet werden. Jeder Körper hat ein eigenes lokales Objektkoordinatensystem, in dem er definiert ist. Die Lage des Körpers ist dort am Koordinatenursprung und an den Koordinatenachsen ausgerichtet. Der Raum, in dem sich alle Körper einer Szene befinden und relativ zueinander definiert sind, ist das globale Koordinatensystem oder Weltkoordinatensystem. Hier kann jeder Körper relativ zum Koordinatenursprung gedreht und verschoben sein. Wenn in den Beschreibungen der Algorithmen zur Kollisionserkennung keine weiteren Angabe gemacht werden, sind Weltkoordinaten angegeben. Wenn eine Berechnung in Objektkoordinaten ausgeführt wird, wird dies extra erwähnt. Mittels der Position des Mittelpunktes c = (c x,c y,c z ) T und der Rotationsmatrix r 00 r 01 r 02 R = r 10 r 11 r 12 (3.1) r 20 r 21 r 22 eines Körpers lassen sich Punkte zwischen den lokalen Koordinatensystemen und den Weltkoordinaten umrechnen. Jeder Körper ist als eine Klasse realisiert und besitzt Zugriffsfunktionen um seine Eigenschaften zurückzugeben (get-funktionen) sowie zu verändern (set-funktionen). Dabei ist zu beachten, dass nur Eigenschaften verändert werden können, die auch in der realen Welt veränderbar wären. Die Position und Drehung sind beispielsweise variabel - die Dichte und Größe nicht. Diese Werte werden bei der Initialisierung des Körpers festgelegt und lassen sich dann nicht mehr modifizieren. Außerdem besitzt jeder Körper Funktionen, um spezifische Eigenschaften wie seine axis-aligned bounding box oder seine Masse zu berechnen. Letztlich gibt es für jeden Körper Hilfsfunktionen, welche bestimmen, ob ein Punkt in relativen oder globalen Koordinaten in dem Körper oder auf seiner Oberfläche liegt. Alle Körper sind in der Implementation von einer Klasse Object abgeleitet, welche unter anderem folgende Funktionen zur Verfügung stellt: Vector3 GetPosition(): gibt die Position des Mittelpunktes zurück 15

28 KAPITEL 3. KÖRPER UND DEFINITIONEN Abbildung 3.1: Darstellung einer Kugel in der pe Visualisierung Matrix3 GetRotation(): gibt die Rotationsmatrix zurück Vector3 PointFromBFtoWF( const Vector3& rpos ): rechnet einen Punkt in lokalen Koordinaten in einen Punkt in globalen Koordinaten um Vector3 PointFromWFtoBF( const Vector3& gpos ): rechnet einen Punkt in globalen Koordinaten in einen Punkt in lokalen Koordinaten um Ebene Eine Ebene wird durch die implizite Gleichung ax + by + cz = d beschrieben, was äquivalent zu n p d = 0 ist. Dabei ist n = (a,b,c) T der Normalenvektor und p = (x,y,z) T ein beliebiger Punkt auf der Ebene. Der Parameter d beschreibt die Lage der Ebene durch den Abstand vom Koordinatenursprung entlang der Normale. Zu beachten ist das Vorzeichen von d, das oft als entgegengesetzt zur hier gemachten Definition gewählt wird. Jeder Punkt p, der diese Gleichung erfüllt, liegt auf der Ebene. Falls die Funktion f( p) = n p d größer ist als 0, liegt der Punkt p im positiven Halbraum der Ebene, dass heißt über der Ebene. Falls f kleiner ist als 0 liegt er im negativen Halbraum, also in der Ebene. Zusätzlich ergibt das Einsetzen eines Punktes in f dessen Abstand von der Ebene, falls die Normale normalisiert ist. Die Ebene ist ein wichtiger Körper, da sie eine Szene begrenzen kann, und trotzdem einfach zu beschreiben und zu berechnen ist. Damit eignet sie sich zum Beispiel als Grundfläche. Sie besitzt keinerlei Extrempunkte und ist unendlich groß. Als Körper nimmt die Ebene eine Sonderstellung ein, da eine Ebene in der Realität nicht existiert. In pe wird ein Zeiger auf ein Ebenenobjekt als PlaneID bezeichnet und es existieren folgende wichtige Zugriffsfunktionen: Vector3 GetNormal(): gibt die Normale der Ebene zurück Vector3 GetDisplacement(): gibt den Abstand vom Koordinatenursprung zurück Kugel Eine Kugel (Bild 3.1) ist gegeben durch ihren Mittelpunkt c s und einen Radius r s. Gegenüber Rotationen ist eine Kugel invariant und eignet sich durch ihre einfache Beschreibung - ein 16

29 3.1. KÖRPER Abbildung 3.2: Darstellung einer Kapsel in der pe Visualisierung Abbildung 3.3: Eine Kapsel mit Radius r und Länge l konstanter Abstand von einem Punkt - gut als Primitiv für die Kollisionserkennung. Die Normale ist an allen Oberflächenpunkten durch die Verbindung mit dem Mittelpunkt exakt definiert. Eine Kollision einer Kugel mit einem konvexen Körper kann immer nur einen Kontaktpunkt erzeugen. Zeiger auf eine Kugel werden mit SphereID bezeichnet und eine Kugel besitzt eine Zugriffsfunktion, um ihren Radius zurückzugeben: Vector3 GetRadius() Kapsel Eine Kapsel (Bild 3.3) ist ein zylinderähnlicher Körper, der aus einem Zylinderteil der Länge l c und zwei an den Enden befindlichen Halbkugeln aufgebaut ist (siehe Bild 3.3). Sowohl der Zylinder als auch die Halbkugeln haben den Radius r c. Eine andere gebräuchliche Bezeichnung ist line swept sphere, was soviel bedeutet, wie eine auf einer Linie verschobene Kugel. Diese Linie, welche die Achse des Zylinders ist, wird im Folgenden als Mittellinie der Kapsel bezeichnet. Diese Mittellinie verläuft im Koordinatensystem der Kapsel entlang der x-achse. Durch die Rotation R c und Translation ist die Position der Kapsel c c in Weltkoordinaten bestimmt. Die Kapsel ist ein eher ungebräuchlicher Körper, welcher jedoch in der Kollisionserkennung unbestreitbare Vorteile bietet. Oft kann eine Kapsel einen Zylinder ersetzen, aber durch die nahe Verwandschaft mit der Kugel ist die Kapsel ein relativ einfacher Körper und hat überall genau definierte Oberflächenormalen. Ein Zylinder hat den Nachteil von Kanten, an welchen die Oberflächennormalen nicht definiert sind und welche die Berechnung einer Kollision mit anderen Körpern sehr erschweren. Ein Zeiger auf eine Kapsel 17

30 KAPITEL 3. KÖRPER UND DEFINITIONEN Abbildung 3.4: Eine AABB aufgespannt durch die Punkte p min und p max Abbildung 3.5: Darstellung einer Box in der pe Visualisierung ist in pe eine CapsuleID. Unter anderem können folgende Eigenschaften einer Kapsel mit Zugriffsfunktionen erfragt werden: Vector3 GetLength(): gibt die Länge der Mittellinie der Kapsel zurück Vector3 GetRadius(): gibt der Radius der Kapsel zurück Axis-aligned Bounding Box Eine Axis-aligned Bounding Box, kurz AABB, ist eine Box, deren Normalen der Seitenflächen mit den Koordinatenachsen übereinstimmen (siehe Bild 3.4). Eine AABB wird durch zwei Punkte p min und p max beschrieben, wobei gilt p min i p max i, i {x,y,z}. Eine AABB wird nicht als eigenständiger Körper verwendet, sondern als Bounding Volume. Somit existieren keine Funktionen zur Kollision mit anderen Körpern. Es gibt nur die Möglichkeit die eventuelle Überschneidung zweier AABB festzustellen. Sie können außerdem addiert werden, wobei eine AABB entsteht, welche die beiden addierten AABB umschließt. 18

31 3.1. KÖRPER Abbildung 3.6: Eine Box mit dem Mittelpunkt b c, den Normalenvektoren der Seiten b u, b v und b w und den halben Seitenlängen von h B u, hb v und hb w Box Eine Box B (auch Oriented Bounding Box genannt, Bild 3.5) ist hier ein Körper mit 6 Seitenflächen, deren Normalen paarweise orthogonal sind (siehe 3.6). Im eigenen Koordinatensystem mit den Achsen u, v und w ist eine Box eine Axis-aligned Bounding Box. Die jeweils gegenüberliegenden Seitenflächen haben den gleichen Abstand zum Koordinatenursprung dieses lokalen Koordinatensystems. Dieser Abstand sind die Halblängen h B u, h B v und h B w. Der Mittelpunkt b c der Box legt die Lage im globalen Koordinatensystem fest. Die normalisierten Vektoren b u, b v und b w sind die Normalen der Box-Seiten und spannen das lokale Koordinatensystem der Box auf. Aus diesen normalisierten Vektoren kann man die Rotationsmatrix der Box aufbauen: r 00 r 01 r 02 ( ) R = r 10 r 11 r 12 = b u b v b w r 20 r 21 r 22 (3.2) Die Box ist ein problematischer Körper in Bezug auf die Kollisionsbestimmung, da die Kanten und Eckpunkte keine definierten Oberflächennormalen besitzen, welche als Kollisionnormale verwendet werden könnten. Eine Box kann bei der Kollision mit einer Ebene vier Kontaktpunkte haben, bei der Kollision mit einer anderen Box sogar acht. Ein Box-Zeiger ist in pe eine BoxID und eine Box bietet eine im Folgenden wichtige Zugriffsfunktion: Vector3 GetLengths(): gibt die Kantenlängen der Box zurück. 19

32 KAPITEL 3. KÖRPER UND DEFINITIONEN Abbildung 3.7: Darstellung eines Dreiecksnetzes in der pe Visualisierung Dreiecksnetz Ein Dreiecksnetz (Bild 3.7)ist ein beliebig geformter Körper, welcher aus Dreiecken aufgebaut ist. Dieses Dreiecksnetz sollte eine in sich geschlossene Oberfläche bilden. Zu jedem Dreieck sind drei Eckpunkte und eine Normale gespeichert. Man kann sich ein Dreieck auch als Teil einer Ebene mit der Normalen des Dreiecks und begrenzt durch die Verbindung der Eckpunkte des Dreiecks vorstellen. Die Normalen sind für verschiedene Berechnungen mit den Dreiecken notwendig - nicht nur für die Kollisionserkennung, sondern auch an anderer Stelle, wie für die Beleuchtungsberechnung bei der Darstellung. Falls die Normalen nicht mit den Geometriedaten gespeichert wurden, kann man diese auch berechnen. Aus Dreiecken kann jeder beliebige Körper aufgebaut werden, jedoch ist die Genauigkeit immer durch die Größe und Anzahl der Dreiecke beschränkt. Eine Kugel lässt sich beispielsweise aus Dreiecken nur approximieren, eine Box hingegen kann exakt dargestellt werden (aus 12 Dreiecken). Praktisch ist die Anzahl der Dreiecke, aus denen ein Körper aufgebaut sein kann, durch die Verarbeitungsgeschwindigkeit der Dreiecke begrenzt. Eine effiziente Speicherart für Dreiecksnetze ist es, eine Liste der Eckpunkte und eine Liste der Dreiecke zu speichern. In der Liste der Eckpunkte sind deren Positionen, aber auch beliebige andere Daten gespeichert. Diese per-vertex Daten sind für die Kollisionserkennung aber unerheblich - es handelt sich beispielsweise um Beleuchtungsnormalen, Farben oder Texturkoordinaten. Die Beleuchtungsnormalen sind Normalen, die anteilig aus den Normalen der den Eckpunkt umgebenden Flächen zusammengesetzt sind. Für die Kollisionserkennung benötigt man allerdings Flächennormalen. Die Liste der Dreiecke enthält Indizes, mit denen auf die Liste der Eckpunkte zugegriffen werden kann. Vorteil dieser Speicherweise ist ein geringer Speicherverbrauch und die Tatsache, dass jeder Eckpunkt nur einmal transformiert werden muss, wenn das Dreiecksnetz seine Lage oder Position ändert. Der Nachteil in Bezug auf die Kollisionserkennung ist, dass außer der Vertex-Position keinerlei Daten auf Eckpunktbasis benötigt werden und trotzdem für jedes Dreieck die Normale berechnet werden muss (was das Ziehen einer Wurzel beinhaltet, da die Normale normalisiert werden muss). Aus diesem Grund werden in pe für Dreiecksnetze Eckpunktlisten zu verwenden, in der immer drei aufeinanderfolgende Eckpunkte ein Dreieck bilden und dazu jeweils in einer Liste die Normalen gespeichert sind. Diese Speicherweise ist nicht optimal, da alle Punkte 20

33 3.1. KÖRPER mehrfach gespeichert werden und kann noch verbessert werden. Das würde jedoch eine Verarbeitung der eingelesenen Daten des Dreiecksnetzes erfordern, da diese bei dem momentan verwendeten stl-speicherformat (siehe 3.2) nicht als Indexliste gegeben sind. Eine Veränderung der Datenstrukturen zur Speicherung von Dreiecksnetzen, hin zur Verwendung von Indexlisten, wäre aber jederzeit möglich, falls dies erforderlich sein sollte. Ein Dreiecksnetz wird in pe durch Zeiger mit der Bezeichnung TriangleMeshID bezeichnet und besteht aus einzelnen Dreiecken, die durch eine Klasse Triangle repräsentiert werden. Wie jeder andere Körper ist ein Dreiecksnetz durch seine Position und Lage im Raum definiert, die einzelnen Dreiecke sind in einer Liste gespeichert. Diese Dreiecke sind relativ zum Koordinatensystem des Dreiecksnetzes definiert, also vor Anwendung der Translation und Rotation. Daher muß die globale Position der Dreiecke nach jeder Änderung der Lage des Dreiecksnetzes neu berechnet werden. Dies passiert durch eine Art lazy evaluation - Ansatz. So lange keine Daten über die Weltposition eines Dreiecks angefordert werden, sind diese nicht berechnet. Wenn diese Informationen benötigt werden, erfolgt eine Berechnung und eine Speicherung der Daten, welche so lange gültig bleiben, bis wieder eine Änderung der Position oder Drehung des Dreiecksnetzes erfolgt. Falls keine Kollision mit diesem Dreiecksnetz möglich ist, da diese durch den Test mit dem Hüllvolumen ausgeschlossen wurde, müssen also nicht in jedem Schritt die Weltkoordinaten aller Dreiecke neu berechnet werden. Ebenso erfolgt beispielsweise bei der Neuzuweisung der Lage und anschließend der Drehung des Dreiecksnetzes nicht jedes Mal eine aufwendige Neuberechnung. Die Abfragefunktionen für alle Werte, die in Weltkoordinaten zurückgegeben werden, sind nach dem selben Muster aufgebaut: const Vector3& Triangle : : GetWNormal ( ) { i f (! valid_ ) { Refresh ( ) ; } return normalworld_ ; } Dabei ist valid_ ein Wahrheitswert, der für alle Dreiecke im Falle einer Änderung der Position oder Drehung des Dreiecksnetzes auf false gesetzt wird. Die Methode Refresh() berechnet alle Werte des Dreiecks in Weltkoordinaten neu und setzt valid_ auf true Union Eine Union ist eine Verbindung einer beliebigen Anzahl von Körpern. Sie hat dabei alle Eigenschaften eines Körpers, wie beispielsweise Position und Drehung. Die Positionen aller Körper in einer Union sind durch ihre relative Position zur Union definiert. 21

34 KAPITEL 3. KÖRPER UND DEFINITIONEN 3.2 Das stl-format Das Dateiformat, in dem die in pe verwendeten Dreiecksgeometrien abgespeichert sind, ist das stl-format. Dieses existiert in zwei Ausprägungen, als ASCII- und als binäres Format Das ASCII-Format Das ASCII-Format hat den Vorteil für einen Menschen lesbar zu sein und ist damit auch leicht zu bearbeiten. Allerdings ist es bei größeren Geometrien sehr platzaufwändig. In diesem Fall bietet sich das platzsparende binäre Format an (siehe 3.2.2). Die Speicherung basiert auf öffnenden und schließenden Markierungen. Ein Körper beginnt in der Datei mit dem solid-schlüsselwort und endet mit endsolid jeweils gefolgt von demselben Header. Dieser kann eine Bezeichnung für den angegebenen Körper enthalten. Ein Dreieck beginnt mit dem Schlüsselwort facet gefolgt von normal und drei Fließkommazahlen, welche die Normale des Dreiecks angeben. Anschließend werden die Eckpunkte des Dreiecks, umschlossen von outer loop und endloop, angegeben. Ein Eckpunkt besteht jeweils aus dem Schlüsselwort vertex und wiederum drei Fließkommazahlen. Abgeschlossen wird das Dreieck dann mit endfacet. Auf diese Weise werden alle Dreiecke des Modells angegeben. Eine Beispiel stl-datei für ein einzelnes Dreieck sieht damit wie folgt aus: s o l i d s t l demo f i l e f a c e t normal e e e+000 outer loop vertex e e e +001 vertex e e e +001 vertex e e e +000 endloop e ndfacet endsolid s t l demo f i l e Das binäre Format Das binäre Format bietet eine sehr kompakte Speicherart für Dreiecksgeometrien. Es wird von vielen Programmen als Export-Format angeboten. Eine binäre stl-datei besteht aus einem 80 Bytes Header, welcher ein String ist, in dem beliebige Daten abgespeichert werden können. Darauf folgt ein 4 Bytes long integer, der die Gesamtzahl der Dreiecke angibt. Für jedes Dreieck werden nun eine Normale und drei Eckpunkte gespeichert, jeder Punkt bzw. Vektor ist als eine 4 Bytes Fließkommazahl gespeichert. Anschließend folgen 2 Füllbytes bevor das nächste Dreieck beginnt. Jedes Dreieck besteht also aus 50 Bytes, 12 für die Normale, 36 für die Eckpunkte und 2 zum Auffüllen. Das binäre Format ist damit wesentlich platzsparender als das ASCII-Format. 22

35 3.3. SEPARATING AXIS THEOREM Einschränkungen des stl-formats Innerhalb einer stl-datei sollte mindestens eine geschlossene Oberfläche aus Dreiecken definiert sein. Dies wird jedoch beim Einlesen nicht überprüft und hängt somit von dem erstellenden Programm ab. Das stl-format ist leicht einlesbar, hat aber auch einige Nachteile. Zum Beispiel ist die Speicherung der Dreiecke so gewählt, dass jedes Dreieck inklusive seiner Eckpunkte getrennt gespeichert wird. Somit wird keine Information darüber mitgeliefert, zu welchen Dreiecken ein Eckpunkt noch gehört. Falls also eine Indexliste (siehe 3.1.6) erstellt werden soll, erfordert dies eine zusätzliche Verarbeitung der Daten. Es gibt stl-dateien, in welchen die Normalen nicht in Richtung der Dreiecksoberseite zeigend gespeichert sind oder die Dreieckseckpunktreihenfolge nicht stimmt. Es ist in der Computergrafik üblich, als Speicherreihenfolge der Eckpunkte gegen den Uhrzeigersinn zu wählen. Damit kann aus der Reihenfolge der Eckpunkte bestimmt werden, welche Seite des Dreiecks nach außen zeigt. gegen den Uhrzeigersinn heißt, dass wenn die Finger der rechten Hand entgegen dem Uhrzeigersinn um die Eckpunkte eines Dreiecke fassen der Daumen in Richtung der Normale zeigt. Die Normale eines Dreiecks sollte immer nach außen zeigen und die Länge 1 haben. Falls nicht korrekte stl-dateien verwendet werden sollen, gibt es Programme, welche diese in standard-konforme Dateien umwandeln[4]. 3.3 Separating Axis Theorem Sind A und B zwei Körper im dreidimensionalen Raum, so heißt eine Gerade separierende Achse (also separating axis), falls die Intervalle der Projektionen beider Körper auf dieser Achse disjunkt sind. Zwei beliebige konvexe Polytope sind genau dann disjunkt, wenn es eine separierende Achse gibt. Sind A und B disjunkt, gibt es eine solche Achse die entweder orthogonal zu 1. einer Fläche von A, 2. einer Fläche von B oder 3. einer Linearkombination einer Kante von A und einer Kante von B ist (siehe Bild 3.8). Der Begriff konvexes Polytop kann hier sehr weit gefasst werden, so kann das Separating Axis Theorem (SAT) auch mit Liniensegmenten oder Dreiecken verwendet werden. Die Anzahl der nötigen Achsen, welche getestet werden müssen, um eine Kollision auszuschließen ist f A + f B + e A e B. Wobei f A bzw. f B die Anzahl der Flächen und e A bzw. e B die Anzahl der Kanten von Körper A bzw. B sind. Das Separating Axis Theorem eignet sich gut für rejection tests (siehe 2.4). 23

36 KAPITEL 3. KÖRPER UND DEFINITIONEN Abbildung 3.8: Das SAT mit zwei Körpern A und B, l A 1 ist eine separierende Achse, l A 2 dagegen nicht. 24

37 Kapitel 4 Geometrische Werkzeuge Im folgenden Kapitel werden verschiedene Algorithmen vorgestellt, welche bei der Kollisionserkennung und -bestimmung Verwendung finden. Dabei handelt es sich um die Abstandsbestimmung bzw. Schnittberechnung zweier Linien im zwei- und dreidimmensionalen, die Berechnung der nächstliegenden Punkte auf zwei Liniensegmenten sowie einem Liniensegment und einer Box. Als Letztes wird ein einfacher Test vorgestellt, mit dem sich bestimmen lässt, ob ein Punkt in einem Dreieck liegt. 4.1 Abstand zwischen einem Punkt und einer Linie Eine Linie l, gegeben durch zwei auf ihr befindliche Punkte p 1 und p 2, p 1 p 2, lässt sich durch die Gleichung x 1 + (x 2 x 1 ) t l(t) = p 1 + ( p 2 p 1 ) t = y 1 + (y 2 y 1 ) t (4.1) z 1 + (z 2 z 1 ) t ausdrücken. Der Abstand zu einem Punkt p 3 = (x 3,y 3,z 3 ) T berechnet sich wie folgt: d = ((x 1 x 3 ) + (x 2 x 1 )t) 2 + ((y 1 y 3 ) + (y 2 y 1 )t) 2 + ((z 1 z 3 ) + (z 2 z 1 )t) 2 (4.2) Die minimale Distanz (siehe Bild 4.1) befindet sich an der Stelle t = ( p 1 p 3 ) ( p 2 p 1 ) p 2 p 1 2, (4.3) Abbildung 4.1: Abstand zwischen einem Punkt p 3 und einem Liniensegment p 1 p 2 25

38 KAPITEL 4. GEOMETRISCHE WERKZEUGE Abbildung 4.2: Schnitt zweier Linien l 1 (s) = o 1 + sd 1 und l 2 (t) = o 2 + td 2 ermittelt durch Nullsetzen der Ableitung d(d2 ) dt und Auflösen nach t. Nach Anwendung der ersten binomischen Formel auf die obige Abstandsberechnung kann dieses t jetzt eingesetzt werden: d 2 = (x 1 x 3 ) 2 + (y 1 y 3 ) 2 + (z 1 z 3 ) 2 + 2t((x 2 x 1 )(x 1 x 3 ) + (y 2 y 1 )(y 1 y 3 ) + (z 2 z 1 )(z 1 z 3 )) + t 2 ((x 2 x 1 ) 2 + (y 2 y 1 ) 2 + (z 2 z 1 ) 2 ) = p 1 p (( p 1 p 3 ) ( p 2 p 1 )) 2 p 2 p (( p 1 p 3 ) ( p 2 p 1 )) 2 p 2 p 1 2 = p 1 p 3 2 p 2 p 1 2 (( p 1 p 3 ) ( p 2 p 1 )) 2 p 2 p 1 2 Für den Zähler dieses Bruches existiert die Vektoridentität (A B) 2 = A 2 B 2 (A B) 2, (4.4) womit die Formel nach dem Wurzelziehen folgendermaßen aussieht: d = ( p 2 p 1 ) ( p 1 p 3 ). (4.5) p 2 p 1 Offensichtlich darf die Linie nicht zu einem Punkt entarten, da bei p 2 = p 1 durch Null geteilt würde. 4.2 Schnitt zweier Linien im Zweidimensionalen Zur Berechnung des Schnittes zweier Linien l 1 und l 2 (siehe Bild 4.2) verwendet man den orthogonalen Vektor zum Richtungsvektor, um die Gleichungsparameter s und t zu berechnen. Ein Vektor im Skalarprodukt mit seinem orthogonalen Vektor ergibt 0. l 1 (s) = l 2 (t) (4.6) o 1 + s d 1 = o 2 + t d 2 (4.7) 26

39 4.3. PUNKTE NÄCHSTER ANNÄHERUNG ZWISCHEN ZWEI LINIEN IN DREI DIMENSIONEN { sd1 d 2 = (o 2 o 1 ) d 2 td 2 d 1 = (o 1 o 2 ) d 1 s = (o 2 o 1 ) d 2 d 1 d 2 t = (o 1 o 2 ) d (4.9) 1 d 2 d 1 Vor der Berechnung muss geprüft werden, ob der Nenner des Bruches 0 wird, dann sind die Linien parallel. (4.8) 4.3 Punkte nächster Annäherung zwischen zwei Linien in drei Dimensionen Gegeben seien zwei Linien l 1 (s) = o 1 + sd 1 und l 2 (t) = o 2 + td 2, wobei t bzw. s jeden Wert annehmen können. Die Methode ist ähnlich der für den zweidimensionalen Schnitt verwendete, nur dass hier das Kreuzprodukt zur Hilfe genommen wird um einen der Parameter s und t zu eliminieren. Ein Vektor mit sich selbst im Kreuzprodukt ergibt (0,0,0). Im Folgenden wird der Schnitt beider Linien berechnet: l 1 (s) = l 2 (t) (4.10) o 1 + sd 1 = o 2 + td 2 Wenn auf beiden Seiten o 1 bzw. o 2 subtrahiert und anschließend das Kreuzprodukt mit d 2 respektive d 1 gebildet wird entstehen folgende Formeln: { s d1 d 2 = ( o 2 o 1 ) d 2 t d 2 d 1 = ( o 1 o 2 ) d 1 (4.11) Jetzt wird das Skalarprodukt mit d 1 d 2 oder d 2 d 1 errechnet: { s( d1 d 2 ) ( d 1 d 2 ) = (( o 2 o 1 ) d 2 ) ( d 1 d 2 ) t( d 2 d 1 ) ( d 2 d 1 ) = (( o 1 o 2 ) d 1 ) ( d 2 d 1 ) s = (( o 2 o 1 ) d 2 ) ( d 1 d 2 ) d 1 d 2 2 t = (( o 1 o 2 ) d 1 ) ( d 2 d 1 ) d 1 d 2 2 s = (( o 2 o 1 ) d 1 )( d 2 d 2 ) (( o 2 o 1 ) d 2 )( d 2 d 1 ) d 1 d 2 2 t = (( o 1 o 2 ) d 2 )( d 1 d 1 ) (( o 1 o 2 ) d 1 )( d 1 d 2 ) d 1 d 2 2 (4.12) (4.13) (4.14) 27

40 KAPITEL 4. GEOMETRISCHE WERKZEUGE Der letzte Schritt ist mittels der Vektoridentität (A B)(C D) = (A C)(B D) (A D)(B C) (4.15) möglich. Da das Skalarprodukt eines Vektors mit sich selbst dessen quadrierte Länge ergibt, kann für normierte Vektoren d 1 bzw. d 2 der entsprechende Faktor d 1 d 1 bzw. d 2 d 2 weggelassen werden. Weiterhin sind viele der Terme zur Berechnung von s und t identisch oder lassen sich leicht ineinander überführen, was Raum zur Optimierung lässt, da deren Auswertung nur einmal notwendig ist. 4.4 Berechnung der nächsten Punkte auf zwei Liniensegmenten Für die nächsten Punkte auf zwei Liniensegmenten gibt es mehrere Möglichkeiten. Als Erstes wird getestet, ob die Endpunkte beider Liniensegmente den Punkt nächster Annäherung bilden. Wenn nicht, dann könnte es eine Kombination aus einem Endpunkt und einem Liniensegment sein. Wenn auch dies nicht der Fall ist, liegen die gesuchten Punkte zwischen den Endpunkten beider Segmente. Der Test auf größte Annäherung zwischen den Enden der Linien ist einfach über die Winkel zu realisieren. Hierbei macht man sich zunutze, dass das Skalarprodukt zweier Vektoren größer als 0 ist, wenn für den Winkel φ zwischen ihnen gilt: 0 φ < π 2. Wenn φ kleiner als 0 ist gilt π 2 < φ π. Anhand dieser Regel kann man sich leicht überlegen, bei welchen Kombinationen Endpunkte der Liniensegmente die Punkte größter Annäherung bilden und welche Punkte dies jeweils sind. Im Folgenden werden zwei beliebige Liniensegmente A und B und deren Endpunkte a 1,a 2,b 1 und b 2 genannt. Da es vier Endpunkte gibt, existieren vier Kombinationen, wie diese als Punkte größtmöglicher Annäherung kombiniert sein können (siehe Bild 4.3, (a)-(d) entsprechen den folgenden Fällen 1.-4.). 1. a 1 a 2 a 1 b 1 0 und b 1 b 2 a 1 b 1 0 a 1,b 1 2. a 1 a 2 a 1 b 2 0 und b 1 b 2 a 1 b 2 0 a 1,b 2 3. a 1 a 2 a 2 b 1 0 und b 1 b 2 a 2 b 1 0 a 2,b 1 4. a 1 a 2 a 2 b 2 0 und b 1 b 2 a 2 b 2 0 a 2,b 2 Falls ein Liniensegment identische Endpunkte besitzt, so wird dies auch erkannt, da das Skalarprodukt mit dem Vektor (0,0,0) wiederum 0 ergibt. Als Nächstes wird getestet, ob die Lösung einen Linienendpunkt beinhaltet. Dafür muss man herausfinden, ob sich ein Endpunkt zwischen den Endpunkten der anderen Linie befindet, das heißt zwischen den zwei Ebenen mit der Richtung des Liniensegments als Normalenvektor und je einem Endpunkt als Punkt auf der Ebene. Dies ist wieder gut über die Winkel herauszufinden. Es gibt wieder vier Möglichkeiten, bei denen je ein anderer Endpunkt einen der Punkte größter Annäherung bildet (siehe Bild 4.4, (a)-(d) entsprechen den folgenden Fällen 1.-4.): 1. a 1 a 2 a 1 b 1 0 und a 1 a 2 a 2 b 1 0 b 1 28

41 4.4. BERECHNUNG DER NÄCHSTEN PUNKTE AUF ZWEI LINIENSEGMENTEN (a) (b) (c) (d) Abbildung 4.3: Verschiedene Möglichkeiten der größtmöglichen Annäherung zwischen zwei Endpunkten zweier Liniensegmente 2. a 1 a 2 a 1 b 2 0 und a 1 a 2 a 2 b 2 0 b 2 3. b 1 b 2 a 1 b 1 0 und b 1 b 2 a 1 b 2 0 a 1 4. b 1 b 2 a 2 b 1 0 und b 1 b 2 a 2 b 2 0 a 2 Jetzt ist zu beachten, dass noch nicht klar ist, ob der gefundene Punkt wirklich eine korrekte Lösung darstellt. Im Folgenden wird ohne Beschränkung der Allgemeinheit angenommen, der Punkt b 1 wurde als in Frage kommender Endpunkt identifiziert, da festgestellt wurde, dass er sich zwischen a 1 und a 2 befindet. Jetzt bestimmt man die Normale auf der 29

42 KAPITEL 4. GEOMETRISCHE WERKZEUGE (a) (b) (c) (d) Abbildung 4.4: Verschiedene Möglichkeiten der größtmöglichen Annäherung zwischen einem Endpunkt eines Liniensegments und einem zweiten Liniensegment (a) (b) Abbildung 4.5: Ist der Winkel zwischen der Normalen n kleiner als π 2 so ist b 1 der nächstliegende Punkt zu a 1 a 2 auf b 1 b 2 (links), andernfalls nicht (rechts). 30

43 4.5. NÄCHSTER PUNKT AUF EINER BOX UND EINEM LINIENSEGMENT (a) Im eignen Koordinatensystem ist die Box eine AABB (b) In Richtung des Vektors v gesehen ist klar, dass nur 6 Kanten den Punkt nächster Annäherung enthalten können. Abbildung 4.6: Da alle Komponenten des Vektors v positiv sind, sind die dicker dargestellten Kanten der Box die 6 Kanten, welche den Punkt nächster Annäherung zu einer Linie enthalten können. (falls kein Schnitt zwischen Box und Liniensegment existiert) Linie A, welche in Richtung des Punktes b 1 zeigt: n = a 1 b 1 a 1 a 2 a 1 b 1 a 1 a 2 a1 a 2 (4.16) a 1 a 2 b 1 ist nur die richtige Lösung falls der andere Endpunkt b 2 weiter von der Linie a 1 a 2 entfernt ist als b 1. Wenn also der Winkel der Linie b 1 b 2 zu der Normalen kleiner oder gleich π 2 ist, hat man den richtigen Punkt gefunden (siehe 4.5). Der Punkt größter Annäherung auf der Linie A läßt sich dann leicht berechnen: a 1 a 2 a 1 b 1 p 2 = a 1 + a 1 a 2 a1 a 2 (4.17) a 1 a 2 Analog ist mit den anderen drei Möglichkeiten zu verfahren. Falls bis jetzt keine Lösung gefunden wurde, handelt es sich bei der Stelle größer Annäherung um Punkte auf beiden Linien (und nicht um Endpunkte). Die Berechnung der Punkte erfolgt jetzt genau wie in 4.3 es werden Parameter s und t errechnet, welche beim Einsetzen in die Gleichungen, welche die Linien A und B darstellen, die gewünschten Punkte ergeben. 4.5 Nächster Punkt auf einer Box und einem Liniensegment Ein Liniensegment sei durch zwei Punkte p 1 und p 2 gegeben, eine Box durch ihren Mittelpunkt c b, eine Rotationsmatrix R und ihre Halblängen h u, h v und h w. Die folgenden Berechnungen werden im Koordinatensystem der Box ausgeführt. Der Anfangspunkt der Line p 1 31

44 KAPITEL 4. GEOMETRISCHE WERKZEUGE Abbildung 4.7: Nächster Punkt auf einer Box b und einem Liniensegment l = s+ vt, 0 t 1 und ihre Richtung p 2 p 1 werden in das Koordinatensystem der Box transformiert. Als weitere Vereinfachung werden von den Komponenten der Richtung der Linie die Absolutwerte genommen und die Vorzeichen gespeichert. Die Linie ist jetzt durch die Formel l = s + vt (4.18) gegeben. Damit reduzieren sich die möglichen Kanten der Box, auf denen sich der nächste Punkt befinden kann auf sechs (siehe Bild 4.6). Möglich ist diese Vereinfachung, da die Box in ihrem eigenen Koordinatensystem symetrisch zum Ursprung ist. Als Nächstes werden die Parameter t der Punkte aller drei Dimensionen berechnet, an denen die Linie die positive oder negative Halblänge erreicht, je nach dem was näher ist. Damit wurden die Stellen berechnet, an denen die Linie die Ebenen der Boxseitenflächen schneidet (siehe Bild 4.7). Jetzt wird über die Ableitung der quadrierten Entfernung eines auf der Box befindlichen Punktes und eines Linienpunktes die Stelle nächster Annäherung berechnet. Also: d(f(t)) 2 dt = 0 mit f(t) = p l (t) p b (t) (4.19) Wobei p l ein Punkt auf der Linie l ist und p b der selbe Punkt auf die Box projiziert. Durch die Berechnung des quadrierten Abstandes kann die Funktion für alle drei Dimensionen getrennt angewendet werden. Zuerst wird die Ableitung für t = 0 berechnet. Falls diese 0 ist, ist das Ergebnis schon erreicht - der Anfangspunkt der Linie ist der nächstliegende Punkt. Jetzt werden nacheinander die Ableitungen an den vorher berechneten Schnittpunkte mit den Ebenen, beginnend 32

45 4.6. PUNKT-IN-DREIECK-TEST mit kleinstem t, gebildet. Dies sind genau die Punkte, an denen sich die Kante der Box ändert, auf denen sich der nächstliegende Punkt befindet. Wurde eine Ableitung gefunden, die größer als 0 ist, befindet sich die Nullstelle im vorhergehenden Intervall und kann einfach berechnet werden: t = t i 1 df2 dt i 1 t i t i 1 (4.20) df 2 dt i df2 dt i 1 Wobei mit i die Werte der aktuellen Stelle gekennzeichnet sind, mit i 1 die der vorigen. Falls jedoch im Verlauf der Berechnung ein t größer 1 erreicht wird, befindet sich der gesuchte Punkt nicht mehr auf dem Liniensegment - damit ist der Endpunkt mit t = 1 der nächstliegende Punkt zur Box. Der auf der Box liegende nächstliegende Punkt bestimmt sich wieder durch Projektion auf die Ebene der nächstliegenden Boxseitenfläche und clipping. Dabei werden alle Koordinaten, die größer sind, als die jeweilige Halblänge der Box auf die Halblänge gesetzt. Dieser Punkt muss noch in Weltkoordinaten transformiert werden. Der berechnete t-wert wird verwendet, um den Punkt auf der Linie in Weltkoordinaten zu berechnen. 4.6 Punkt-In-Dreieck-Test Im Folgenden wird ein einfacher Test vorgestellt, mit dem man bestimmen kann, ob sich ein Punkt in einem Dreieck befindet. Die Eckpunkte des Dreieck werden mit A,B und C bezeichnet, der zu testende Punkt mit p. Das Dreieck wird also von den Linien AB, BC und CA begrenzt. Jede dieser Linien teilt die Ebene des Dreiecks in zwei Teile - einen Teil der außerhalb des Dreiecks liegt und einen Teil, der teilweise innerhalb der Dreiecks liegt. Die gemeinsame Fläche aller potentiell enthaltenen Hälften ergibt genau die Dreiecksfläche. Was heißt, dass der Punkt p, wenn er in dem Dreieck ABC liegt, immer auf der richtigen Seite der Linien liegen muss. Diese Seite ist die Seite, auf der sich auch der jeweils dritte Eckpunkt des Dreiecks befindet. Man muss also beispielsweise bestimmen, ob sich p auf der selben Seite wie der Punkt C befindet. Dies ist dann der Fall, wenn das Kreuzprodukt der Vektoren AB und Ap in die gleiche Richtung zeigt, wie das Kreuzprodukt aus AB und AC. Das Skalarprodukt dieser Kreuzprodukte ist positiv, wenn sich p und C auf der selben Seite befinden und negativ, wenn dies nicht der Fall ist. Wenn das Ergebnis für alle drei Kanten positiv ist, befindet sich der Punkt innerhalb des Dreiecks, andernfalls außerhalb. Sehr hilfreich ist es auch, dass dieser Test auch im Raum funktioniert, wenn die Projektion des Punktes p entlang der Normalen des Dreiecks darauf getestet werden soll, ob sie sich im Dreieck befindet. Dabei ist es nicht notwendig die Projektion vor dem Test auszuführen. 33

46 KAPITEL 4. GEOMETRISCHE WERKZEUGE Abbildung 4.8: Test ob sich die Punkte p 1 und p 2 relativ zu AB im Dreieck befinden könnten. Der Vektor AB Ap1 zeigt aus dem Blatt heraus, AB Ap2 dagegen in das Blatt hinein. Wenn sich ein Punkt im Dreieck befindet, liegt er immer auf derselben Seite von AB wie C. 34

47 Kapitel 5 Kollisionsalgorithmen In diesem Kapitel werden die Kollsionsfunktionen aller Körper beschrieben. Da jeweils die Kollision zweier Körper berechnet wird, gibt es für jede Kombination von Körpern eine Funktion für Kollisionserkennung und Kollisionsbestimmung. In Ersterer wird festgestellt, ob beide Körper kollidieren, in Zweiter welches die Kontaktpunkte und die Kollisionsnormale sind. 5.1 Kugel-Kugel-Kollision Kollisionserkennung Die Länge des Vektors vom Mittelpunkt der ersten Kugel zum Mittelpunkt der zweiten Kugel wird mit den addierten Radien beider Kugeln verglichen. Falls sie kleiner ist, gibt es eine Kollision. Also: c s 1 c s 2 < r s 1 + r s 2 (5.1) Abbildung 5.1: Kugel-Kugel-Kollisionserkennung Kontaktpunkterzeugung Wenn eine Kollision stattfindet, wird der Kontaktpunkt zweier Kugeln auf der Normale der Kollision erzeugt, welche die Verbindung beider Kugelmittelpunkte ist. Er befindet sich in der Mittel beider kollidierender Oberflächenpunkte. 35

48 KAPITEL 5. KOLLISIONSALGORITHMEN Abbildung 5.2: Kollision der Kugeln s 1 und s 2 mit Normale n und Kontaktpunkt p. 5.2 Kugel-Ebenen-Kollision Kollisionserkennung Der Mittelpunkt der Kugel wird in die Ebenengleichung eingesetzt. Falls der Abstand kleiner ist als der Radius der Kugel, ist eine Kollision erfolgt. c s n d < r s (5.2) Kontaktpunkterzeugung Bei einer Kollision zwischen einer Kugel und einer Ebene wird ein Kontaktpunkt p auf der Ebene durch Projektion des Kugelmittelpunktes entlang der Ebenennormale auf die Ebene berechnet. p = c s ( c s n) n (5.3) Die Normale dieser Kollision ist die Ebenennormale n. 5.3 Kugel-Box-Kollision Kollisionserkennung In diesem Test wird in jeder Dimension der Box der Punkt gesucht, der am nächsten zur Kugel liegt. Diese Berechnung ist im Raum der Box sehr einfach durchzuführen und wird noch einfacher dadurch, dass es nicht interessiert, an welcher Seite der Box die Kollision erfolgt und außerdem der Koordinatenursprung der Mittelpunkt der Box ist. Daher kann man den Kugelmittelpunkt in box-relativen Koordinaten t als im positiven Oktanten liegend betrachten, indem man von jeder Komponente des Kugelmittelpunkts den Betrag errechnet. Der Abstand f u von der Box in der Dimension u ist jetzt beispielsweise t u h u Jetzt kann man die quadrierten Abstände aller drei Dimensionen aufaddieren, es sei denn, der Mittelpunkt befindet sich in dieser Dimension innerhalb der Box. Dieser Wert wird mit dem quadrierten Radius der Kugel unter Berücksichtigung des contactthreshold verglichen. Ist er kleiner, überlappen die Kugel und die Box. bool SphereBoxTest ( SphereID s, BoxID b ) i { Vector3 t = b >PointFromWFtoBF ( s >GetPosition ( ) ) ; Vector3 h =. 5 b >GetLengths ( ) ; r e a l sqrd = 0 ; 36

49 5.4. KUGEL-KAPSEL-KOLLISION } for ( unsigned i n t i = 0 ; i < 3 ; ++ i ) { i f ( fabs ( t [ i ] ) > h [ i ] ) { sqrd += Sqr ( fabs ( t [ i ] ) h [ i ] ) ; } } return ( sqrd < Sqr ( s >GetRadius ( ) + contactthreshold ) ) ; Kontaktpunkterzeugung Diese Berechnung ist sehr ähnlich zu der Kollisionserkennung, nur dass man hier explizit den Punkt auf der Box berechnet, welcher sich am nächsten an dem Kugelmittelpunkt befindet. Die Entfernung zwischen Box und Kugel wird wieder genauso akkumuliert wie in 5.3.1, allerdings wird jetzt zusätzlich die Komponente des nächsten Punktes auf der Box berechnet. Diese entspricht, abhängig von der relativen Position der Kugel, der positiven oder negativen Halblänge der Box. Falls der Kugelmittelpunkt jedoch innerhalb der Box liegt, ist diese Koordinate des nächsten Punktes die entsprechende Koordinate des Kugelmittelpunktes. Nun zieht man aus dem akkumulierten quadrierten Abstand die Wurzel und subtrahiert den Kugelradius r s, was die Distanz f zwischen der Kugel und der Box ergibt. Nach der Überprüfung, ob es sich um eine Kollision handelt, transformiert man den berechneten Oberflächenpunkt der Box in Weltkoordinaten o und berechnet die Kollisionsnormale n, welche vom Mittelpunkt der Kugel dem Oberflächenpunkt zeigt. n = o c s o c s (5.4) Aus der schon berechneten Distanz und der normalisierten Normale errechnet man den Kontaktpunkt p, welcher sich in der Mitte zwischen den Oberflächenpunkten auf der Box und der Kugel befindet, die im Idealfall kollidiert wären. p = c s + (r s + 0.5f) n (5.5) 5.4 Kugel-Kapsel-Kollision Kollisionserkennung Ob eine Kollision stattfindet, wird in diesem Fall im Raum der Kapsel getestet. Der Vorteil davon ist, dass man durch einfachen Vergleich der x-koordinate des relativen Kugelmittelpunktes t mit der halben Länge der Kapsel lc 2 bestimmen kann, ob die Kollision 1. im zylinderartigen Bereich der Kapsel oder 2. an einem der halbkugelförmigen Enden der Kapsel 37

50 KAPITEL 5. KOLLISIONSALGORITHMEN Abbildung 5.3: Die zwei Fälle einer Kugel-Kapsel-Kollisionserkennung: 1. mögliche Kollision der Kugel s 1 mit dem zylinderartigen Teil und 2. mögliche Kollision der Kugel s 2 mit einer der Halbkugeln am Ende der Kapsel. auftritt. Im ersten Fall wird der Vektor von der Mittelgeraden der Kapsel zum Mittelpunkt der Kugel nach einer Projektion in zwei Dimensionen bestimmt und anschließend dessen Länge berechnet. Die Projektion erfolgt durch Verwerfen der x-koordinate, welche die Richtung der Mittelachse in relativen Koordinaten ist, wodurch die Mittelgerade zu einem Punkt wird. Im zweiten Fall, einer Kollision mit einem der Enden der Kapsel, zieht man vom Absolutwert der x-koordinate der Kugel die halbe Länge der Kapsel ab. Anschließend wird die Länge des Vektors, der aus der Kombination dieses neuen x-wertes und der y- und z- Koordinate der Kugel entsteht, berechnet. Zuerst berechnet man die relative Position des Mittelpunktes der Kugel t. Mit diesem und der Länge der Kapsel kann man jetzt zwischen dem Fall der Kollision mit dem zylinderartigen Teil oder den an der Enden befindlichen Halbkugeln der Kapsel unterscheiden. Die Formel für die Berechnung der Distanz ist damit: ( t x lc 2 d = )2 + (t y ) 2 + (t z ) 2, wenn t x > lc 2 (5.6) (ty ) 2 + (t z ) 2, sonst Kontaktpunkterzeugung Dieser Algorithmus funktioniert wieder sehr ähnlich wie die Kollisionserkennung, jetzt wird allerdings die Berechnung eines Kontaktpunktes durchgeführt. Falls eine Kollision erkannt wird, berechnet man die Höhe auf der Mittelachse der Kapsel, auf der der Mittelpunkt einer 38

51 5.5. BOX-BOX-KOLLISION Abbildung 5.4: Eine Kollision mit einer in die Kapsel gelegten Kugel S 2 ist eine ausreichende Repräsentation der Kollision der Kapsel c mit der Kugel s. (Abbildung im Raum relativ zur Kapsel) angenommenen Kugel S 2 liegt, die in die Kapsel gelegt wird. Diese Kugel ist ausreichend, um die Kollision repräsentieren und den nötigen Kontaktpunkt sowie die Kollisionsnormale zu berechnen (siehe Bild 5.4). Der Mittelpunkt der Kugel S 2 befindet sich irgendwo auf der Mittelachse der Kapsel, die man sich auch als line swept sphere vorstellen kann. Dieser Mittelpunkt ist einer der Endpunkte der Mittelachse der Kapsel im obigen Fall 2 und liegt zwischen beiden Endpunkten im Fall 1. Nach einer Umrechnung des Mittelpunktes von S 2 in Weltkoordinaten berechnet man jetzt eine Kollision zweier Kugeln in Weltkoordinate (siehe 5.1.2). 5.5 Box-Box-Kollision Kollisionserkennung Für die Kollisionserkennung zwischen zwei Boxen kommte ein Algorithmus zum Einsatz, welcher das Separating Axis Theorem (siehe Seite 23 Abschnitt 3.3) verwendet. Auf Boxen angewandt ist diese Methode schneller als viele andere mögliche Berechnungsmethoden, wie beispielsweise das Berechnen der nächstliegenden Punkte. Im Folgenden wird die Kollisionerkennung zwischen einer Box A und einer Box B erläutert Dieser Test wird in dem Raum ausgeführt, der durch den Mittelpunkt einer Box A und deren Achsen aufgespannt wird. Die Box A ist in diesem Raum eine AABB, welche an den durch die Koordinatenachsen aufgespannten Ebenen symmetrisch ist. Die Box B ist relativ zu diesem Koordinatensystem mittels einer Verschiebung und einer Drehung definiert. Ziel ist es nun, eine Achse zu finden, auf der A und B getrennt sind. Im Ganzen müssen 15 39

52 KAPITEL 5. KOLLISIONSALGORITHMEN Abbildung 5.5: Kollisionserkennung zweier Boxen mittels Separating Axis Theorem Achsen getestet werden: 1. 3 orthogonal zu den Seitenflächen von A - also a u, a v und a w, 2. 3 orthogonal zu den Seitenflächen von B - also b u, b v und b w - sowie , also 9, Linearkombinationen der Kanten bzw. aufspannenden Vektoren beider Boxen - also a i b j, i {u,v,w}, j {u,v,w}. Der Test, ob eine Achse eine separierende Achse ist, wird ausgeführt, indem die Ausdehnungen beider Boxen auf diese Achse projiziert werden. Sind diese nicht-überlappend, so ist eine separierende Achse gefunden. Die Reihenfolge, in der die Achsen getestet werden, spielt eine große Rolle, wenn eine möglichst hohe Geschwindigkeit erreicht werden soll. Als Erstes werden die Tests im Raum von A ausgeführt, anschließend erfolgen die Überprüfungen der Achsen von B und zum Schluss die Kombinationen beider. Die orthogonalen Achsen ermöglichen eine möglichst frühe Erkennung trennender Achsen und die einfacheren Test werden zuerst ausgeführt. Sobald eine separierende Achse gefunden wurde, ist der Test beendet. Im Folgenden wird ein eine potentielle separierende Achse l genannt. Die Abstände d A und d B der Boxen auf der Achse l werden durch Projektion auf die Achse l gewonnen. Da 40

53 5.5. BOX-BOX-KOLLISION die halben Längen der Boxen h i immer positiv sind gilt für d A und d B also: d A = d B = i {u,v,w} i {u,v,w} Wenn l eine separierende Achse ist, dann gilt: h A i a i l (5.7) h B i b i l. (5.8) t l > d A + d B. (5.9) Als Vertreter für eine Achse orthogonal zu einer der Flächen von A wird im Folgenden der Test für die Achse l = a u hergeleitet. Es gilt, da wir uns im Koordinatensystem von A befinden und a u damit (1 0 0) T ist: t a u = t x. (5.10) Jetzt vereinfacht man die Gleichungen 5.7 nach Einsetzen der obigen Werten: d A = i {u,v,w} h A i a i a u = h A u (5.11) und 5.8: d B = h B i b i a u (5.12) i {u,v,w} = h B u bu x + hb v bv x + hb w bw x (5.13) = h B u r 00 + h B v r 01 + h B w r 02. (5.14) Wobei r 00 r 01 r 02 ( ) R = r 10 r 11 r 12 = b u b v b w r 20 r 21 r 22 (5.15) die relative Rotationsmatrix von B nach A ist: Somit wird die Bedingung für die Achse l = a u R = R AT R B. (5.16) t x > h A u + h B u r 00 + h B v r 01 + h B w r 02. (5.17) Falls dieser Test positiv ausfällt, sind die Boxen getrennt. Ebenso können die Tests für die Achsen l = a v und l = a w hergeleitet werden. t y > h A v + h B u r 10 + h B v r 11 + h B w r 12 (5.18) t z > h A w + hb u r 20 + h B v r 21 + h B w r 22 (5.19) 41

54 KAPITEL 5. KOLLISIONSALGORITHMEN Als Nächstes leiten wird der Test für die Achse l = b u hergeleitet: d B = d A = t l = t b u (5.20) i {u,v,w} = t x b u x + t y b u y + t z b u z (5.21) = t x r 00 + t y r 10 + t z r 20 (5.22) h A i a i l = i {u,v,w} h A i a i b u (5.23) = h A u bu x + ha v bu y + ha w bu z (5.24) = h A u r 00 + h A v r 10 + h A w r 20 (5.25) i {u,v,w} h B i b i l = i {u,v,w} Falls b u eine separierende Achse ist, muss also gelten: h B i b i b u = h B u. (5.26) t x r 00 + t y r 10 + t z r 20 > h A u r 00 + h A v r 10 + h A w r 20 + h B u. (5.27) Wiederum können Tests für die verbleibenden zwei Achsen von B, b v und b w analog hergeleitet werden. t x r 01 + t y r 11 + t z r 21 > h A u r 01 + h A v r 11 + h A w r 21 + h B v (5.28) t x r 02 + t y r 12 + t z r 22 > h A u r 02 + h A v r 12 + h A w r 22 + h B w (5.29) Zum Schluss bleiben noch die Linearkombinationen der bisherigen Achsen, hier an l = a u b v demonstriert: d A = t l = t ( a u b v ) (5.30) = t (0, b v z,b v y) (5.31) = t z b v y t y b v z (5.32) = t z r 11 t y r 21 (5.33) i {u,v,w} = i {u,v,w} = i {u,v,w} h A i a i l (5.34) h A i a i ( a u b v ) (5.35) h A i b v ( a u a i ) (5.36) = h A v b v a w + h A w b v a v (5.37) = h A v bv z + ha w bv y (5.38) = h A v r 21 + h A w r 11 (5.39) 42

55 5.5. BOX-BOX-KOLLISION d B = h B i b i l (5.40) i {u,v,w} = h B i b i ( a u b v ) (5.41) i {u,v,w} = h B i a u ( b i b v ) (5.42) i {u,v,w} = h B u a u b w + h B w a u b u (5.43) = h B u b w x + h B w b u x (5.44) = h B u r 02 + h B w r 00 (5.45) Zu testen ist also: t z r 11 t y r 21 > h A v r 21 + h A w r 11 + h B u r 02 + h B w r 00. (5.46) Die Tests für die anderen Achsen sind analog herleitbar Kontaktpunkterzeugung Zur Erkennung einer Kollision empfiehlt sich auch hier das für die Kollisionserkennung verwendete Separating Axis Theorem, wobei Abwandlungen nötig sind, da nun auch Kollisionspunkte und eine Kollisionsnormale berechnet werden sollen. Hierzu ist es nötig, die Achse zu finden, in der die Boxen minimal ineinander eingedrungen sind. Diese Achse wird dann als Kollisionsachse angenommen. Im Falle, dass mindestens eine Seitenfläche einer der Boxen an der Kollision beteiligt ist, bestimmt diese auch die Kollisionsnormale. Schwieriger sind Kollisionen zweier Kanten. Hierbei ist prinzipiell eine beliebige Normale denkbar, solang diese in Bezug zu beiden Boxen nach außen zeigt (für die zweite beteiligte Box natürlich mit umgekehrtem Vorzeichen). Ziel ist es, dass die Kollisionsnormale die Richtung angibt, in der die Überlappung beider Boxen auf kürzestem Wege aufgehoben werden kann. Der erste Schritt dieses Algorithmus ist sehr ähnlich zu dem Kollisionserkennungs- Verfahren. Es werden alle 15 Achsen auf Überlappungen getestet - mit dem Unterschied, dass nun die bis jetzt kleinste Penetrationstiefe mitsamt der zugehörigen Normale und der Nummer des Testes, in dem diese festgestellt wurde, gespeichert wird. Somit weiß man nach dem Test aller 15 Achsen, falls eine Kollision stattfindet, welches die Richtung der niedrigsten Eindring-Tiefe und die zugehörige Achse ist. Wenn eine Kollision in der Achse a u festgestellt wurde, werden folgende Werte gespeichert: die Eindringtiefe f = t x h A u + hb u r 00 + h B v r 01 + h B w r 02 (siehe 5.17), die Kontaktnormale n = (A 00,A 10,A 20 ) T = a u, den Kollisionsfall 1 und die Normalenrichtung - Vorzeichenumkehrung bei t x < 0. Wurde eine Kollision in der Achse b u festgestellt, sind folgende Werte zu speichern: 43

56 KAPITEL 5. KOLLISIONSALGORITHMEN die Eindringtiefe f = t x r 00 + t y r 10 + t z r 20 h A u r 00 + h A v r 10 + h A w r 20 + h B u (siehe 5.27), die Kontaktnormale n = (B 00,B 10,B 20 ) T = b u, den Kollisionsfall 4 und die Normalenrichtung - Vorzeichenumkehrung bei t x r 00 + t y r 10 + t z r 20 < 0. Im Fall einer Kombination von Vektoren beider Boxen, hier beispielsweise a u b v : die Eindringtiefe f = t z r 11 t y r 21 h A v r 21 + h A w r 11 + h B u r 02 + h B w r 00 (siehe 5.46), die Kontaktnormale n = den Kollisionsfall 8 und 1 r r 11 2 (0, r 21,r 11 ) T, die Normalenrichtung - Vorzeichenumkehrung bei t z r 11 t y r 21 < 0. Die zu den jeweils anderen Achsen zu speichernden Werte können analog aus den Formeln in berechnet werden. Falls die niedrigste Penetration in Richtung einer der 9 Linearkombinationen der Achsen liegt, handelt es sich um eine Kante-Kante-Kollision (siehe Bild 5.6). Box A ist im Folgenden als Box 1 bzw. Box B als Box 2 bezeichnet. Eine Transformation der Normalen in den Raum beider Boxen dient zum Berechnen eines Eckpunkts der kollidierenden Kanten beider Boxen. Am Beispiel der Box b1 und der Kollision mit dem Normalenvektor contactnormal ist dies folgende Berechnung: Vector3 pb1 = b1 >GetPosition ( ) ; Vector3 n_rel = b1 >GetRotation ( ). Transpose ( ) contactnormal ; Vector3 o f f s e t ; for ( i n t i =0; i <3; ++ i ) { i f ( n_rel [ i ] > 0) { o f f s e t [ i ] = 0.5 b1 >GetLengths ( ) [ i ] ; } else { o f f s e t [ i ] = 0. 5 b1 >GetLengths ( ) [ i ] ; } } pb1 += b1 >GetRotation ( ) o f f s e t ; In der Variablen pb1 ist jetzt der Eckpunkt, welcher am nächsten an der Stelle der Kollision beider Boxen liegt, abgespeichert. Für die zweite Box sieht diese Berechnung genauso aus, nur dass das Vorzeichen der Normale umgekehrt wird, da diese von Box 2 zu Box 1 zeigt. Anschließend benötigt man der Richtungsvektor beider Kanten, welcher mittels der Nummer des Tests der niedrigsten Eindring-Tiefe aus den Rotationsmatrizen der Boxen, welche auch die aufspannenden Vektoren angeben, extrahiert werden: 44

57 5.5. BOX-BOX-KOLLISION Abbildung 5.6: Kante-Kante-Kollision zweier Boxen mit einem Kontaktpunkt Vector3 db1, db2 ; for ( i n t i =0; i <3; i ++) { db1 [ i ] = b1 >GetRotation ( ) [ ( contactcase 7)/3 + i 3 ] ; db2 [ i ] = b2 >GetRotation ( ) [ ( contactcase 7)%3 + i 3 ] ; } Die daraus resultierenden Vektoren db1 und db2 sind je eine Seitenflächennormale der Boxen b1 und b2, welche mit der Richtung der gesuchten Kante übereinstimmt. Nun liefert ein einfacher 3D-Linien-Schnitttest (siehe 4.3) die Punkte nächster Annäherung und damit die kollidierenden Punkte auf beiden Boxen. Der Kontaktpunkt befindet sich nun in der Mitte dieser Punkte. Die Normale und die Eindring-Tiefe sind noch von obigem Test bekannt. Die Normale entspricht dem Kreuzprodukt der Richtungsvektoren der kollidierenden Kanten beider Boxen und hat die Richtung von Box 2 zu Box 1. Für eine Kante-Kante-Kollision ist ein Kontaktpunkt ausreichend. Der weitaus komplexere Fall tritt jedoch auf, falls eine Seitenfläche einer der Boxen mit einer Seitenfläche, Kante oder einem Eckpunkt der anderen Box zusammenstößt. Hierbei können, wie man sich leicht überlegen kann, mehrere Kontaktpunkte auftreten. Man könnte bei oberflächlicher Betrachtung annehmen, dass 4 Kontaktpunkte für 4 Eckpunkte einer Box-Seite ausreichen sollten, was jedoch falsch ist, da beispielsweise zwei annähernd gleichgroße, mittig aufeinandertreffende Boxseiten bis zu 8 Kontaktpunkte benötigen - die Kollisionsfläche ist ein Achteck (siehe Bild 5.7 und 5.8). 45

58 KAPITEL 5. KOLLISIONSALGORITHMEN (a) ein Rechteck (b) ein unregelmäßiges Achteck Abbildung 5.7: Verschiedene Möglichkeiten einer Box-Kollisionsfläche bei parallelen Seitenflächen, die untere Box ist A*, die obere B* (es könnte aber auch andersherum sein, da beide Seitenflächen beteiligt sind) (a) zwei Kontaktpunkte (eine Linie) (b) ein Kontaktpunkt Abbildung 5.8: Verschiedene Möglichkeiten einer Box-Box-Kollision, die untere Box ist A*, die obere B* 46

59 5.5. BOX-BOX-KOLLISION Die Berechnung der Kontakpunkte erfolgt in diesem Fall folgendermaßen: Die Box, deren Seitenfläche an der Kollision beteiligt ist, wird nun zu Box A*, die andere zu B*. Gegebenenfalls werden die Werte beider Boxen vertauscht. Ebenso muss im Falle der Vertauschung beider Boxen die Richtung der Kollisionsnormalen für die weitere Berechnung umgekehrt werden. Jetzt sind verschiedene Vorberechnungen nötig. Die Kollisionsnormale wird in den Raum der Box B* transformiert und die größte absolute Komponente bestimmt. Dies ist relativ zu der Box die Hauptkollisionsachse, welche in späteren Berechnungen wichtig ist. Falls die Kollision auch bei der Box B* eine Seitenfläche beinhaltet, ist es die, welche die Hauptkollisionsachse als Normale hat. Für die Box A* kann man diese Achse bestimmen, indem man die anfänglich gespeicherte Nummer des Tests verwendet. Die Hauptkollisionsachse von A* ist auch identisch mit der Normale der Kollision. Für die Box B* berechnet man die Eckpunkte der Seitenfläche mit der Hauptkollisionsachse als Normale. Diese transformiert man in den Raum der Box A* und erstellt für jeden Eckpunkt einen zwei-dimensionalen Punkt durch Projektion auf eine Ebene. Diese Ebene hat als Normale die Kollisionsnormale bzw. die Hauptkollisionsachse in Bezug zu A*. Jetzt können unter Beachtung der Tatsache, dass A* im eigenen Raum immer axis-aligned ist, im Zweidimensionalen die Schnitte der Kanten beider Vierecke der Seitenflächen von Box B* und Box A* berechnet werden. Als Beispiel dafür wird im Folgenden der Schnitt einer Kante ab, der Box B*, mit der Kante mit dem Abstand h x vom Mittelpunkt der Box A*, welche von h y bis h y geht, berechnet. Um eine unnötige Division zu vermeiden, überprüft man als Erstes, ob sich die x-koordinaten von a und b auf unterschiedlichen Seiten von h x befinden. Falls nicht, kann kein Schnitt existieren. Andernfalls berechnet man den Linienparameter s = h x a x b x a x. (5.47) Durch die Überprüfung auf die Lage von a und b zu h x vermeidet man auch eine mögliche Division durch 0 an dieser Stelle. Mit Hilfe des Parameters s errechnet man nun die y-koordinate des Schnittpunktes p: p y = a y + s (b y a y ) (5.48) Falls der Absolutwert von p y kleiner oder gleichgroß wie h y ist, wurde ein Schnittpunkt beider Vierecke gefunden. In diesem Fall speichert man den Parameter s und den zweidimensionalen Schnittpunkt. Diesen Test führt man für alle vier Kanten beider Vierecke durch. Die Schnittpunkte ergänzt man wieder um die dritte Dimension - im Falle von A* durch die halbe Länge der Box in der entsprechenden Dimension, im Fall von B* durch Einsetzen des Parameters s, den der Linien-Schnitt-Algorithmus zurückgibt, in die dreidimensionale Liniengleichung mit den Punkten relativ zu A*. Da eine Kollision zweier Seitenflächen stattfinden kann, muss jetzt noch beachtet werden, dass auch die Eckpunkte beider kollidierenden Flächen Kontaktpunkte sein können. Hierzu überprüft man im Raum der Box A*, ob Eckpunkte der Seitenfläche von B* in der Seitenfläche A* s enthalten sind und umgekehrt, ob Eckpunkte von A* in der Seitenfläche von B* 47

60 KAPITEL 5. KOLLISIONSALGORITHMEN enthalten sind. Dies ist wiederum nur ein zweidimensionaler Test, der eine anschließende Rücküberführung in den dreidimensionalen Raum und eine Umrechnung in Weltkoordinaten erfordert. Abschließend kann aus allen bisherigen Punkten je ein Kontaktpunkt erstellt werden, falls der Abstand der gefundenen Punkte auf beiden Boxen voneinander kleiner ist, als der contactthreshold. Damit werden in den meisten Fällen weniger Kontaktpunkte erzeugt, als vorher berechnet wurden. Diese Punkte sind allerdings notwendig, um die Stabilität auch bei aufeinander gestapelten Boxen sicher zu stellen. 5.6 Box-Kapsel-Kollision Kollisionserkennung Um diese Kollision zu berechnen, wird eine Hilfsfunktion verwendet, welche die nächsten Punkte zwischen einem Liniensegment und einer Box findet (siehe 4.5). Diese Funktion wird mit der Position, Rotation sowie Seitenlänge der Box und den Endpunkten des Liniensegments aufgerufen. Um die Endpunkte der Mittellinie der Kapsel zu berechnen, benötigt man den Richtungsvektor e entlang dieser Linie und die halbe Länge der Mittellinie der Kapsel: e = l 2 r 00 r 10 r 20 (5.49) Der Vektor (r 00 r 10 r 20 ) T ist die x-richtung der Kapsel in Weltkoordinaten. Der Vektor e einmal auf Position der Kapsel addiert, einmal von ihr abgezogen ergibt die Weltposition der Mittelpunkte der an den Enden befindlichen Kugeln der Kapsel. Nun ruft man die Funktion zur Berechnung der nächstliegenden Punkte auf einem Liniensegment und einer Box auf. Anschließend berechnet man zwischen den beiden Ergebnispunkten einen Abstand, welchen man mit dem Radius der Kapsel vergleicht und damit entscheiden kann, ob eine Kollision stattfindet Kontaktpunktberechnung Hier ist zu beachten, dass zwischen einer Box und einer Kapsel bis zu zwei Kontaktpunkte auftreten können. Wiederum greift man auf den oben verwendeten Algorithmus aus 4.5 zurück, berechnet den Abstand und ermittelt, ob eine Kollision auftritt. Falls dies zutrifft, muss man bestimmen, ob die Mittelachse der Kapsel parallel zu einer oder zwei Seiten der Box ist, so dass eventuell zwei Kontaktpunkte erzeugt werden müssen. Wenn keine Seite parallel ist, behandelt man den Fall wie eine Kugel-Box-Kollision (siehe 5.3.2) mit dem zur Box nächstliegenden Punkt auf dem Liniensegment als Kugelmittelpunkt. Die weiteren Berechnungen erfolgen im box-relativen Raum. Wenn hier ein oder zwei Komponenten des Richtungsvektors der Mittellinie der Kapsel (annähernd) gleich Null sind, werden die entsprechenden Dimensionen als parallel angenommen. Falls sich jedoch die 48

61 5.6. BOX-KAPSEL-KOLLISION (a) Kollision des kugelförmigen Endes (b) Kollision des zylinderförmigen Teils (c) zwei Kontaktpunkte bei Parallelität mit einer Boxseite (d) ein Kontaktpunkt bei Parallelität mit einer Boxseite Abbildung 5.9: Verschiedene Möglichkeiten einer Kapsel-Box-Kollision mit den zur Kontaktberechnung verwendeten gedachten Kugeln und den Kontaktpunkten p Position der Kapsel in einer dieser Richtungen zwischen den Seitenflächen der Box befindet, ist die Parallelität irrelevant, da die Kapsel nicht mit dieser Seite kollidieren kann (siehe Abbildung 5.9(d)). Wenn jetzt genau eine als parallel erkannte Seite übrig bleibt, erfolgt die weitere Rechnung in den verbleibenden zwei Dimensionen. Hier schneidet man jetzt das Liniensegment der Mittellinie der Kapsel mit einem Rechteck, was zwei Schnittpunkte ergeben kann, die man in eine Liste möglicher Kontaktpunkte einfügt. Falls sich jedoch ein oder zwei Endpunkte der Geraden innerhalb der Rechtecks befinden, fügt man diese der Liste der möglichen Kontaktpunkte hinzu. Die nötige dritte Dimension der Kontaktpunkte wird mit der halben Seitenlänge der Box bzw. der Position der Kapsel in dieser Dimension gleich gesetzt, das Vorzeichen bestimmt sich durch die relative Lage der Kapsel zur Box. Nun hat man zu möglichen Kontaktpunkten gehörige Punkte auf der Mittellinie der Kapsel bzw. der Oberfläche der Box. Für die Liste der möglichen Kontaktpunkte wird je eine Kugel-Box-Kollision in Weltkoordinaten durchgeführt, um sicherzustellen, dass nur für wirklich existente Kontakte Kontaktpunkte erzeugt werden. Als Letztes muss der Fall zweier paralleler Seiten der Box untersucht werden. Hier muss 49

62 KAPITEL 5. KOLLISIONSALGORITHMEN nur eine Dimension der Box mit der Mittellinie der Kapsel geschnitten werden - die anderen Koordinaten ergeben sich durch den Test, auf welcher Seite der Box sich die Kapsel befindet und das Setzen auf die jeweilige Ausdehnung der Box. Bei diesen Kollisionen kann es sich nur um Kollisionen der Kapsel mit einer Kante der Box handeln. Der eindimensionale Schnitttest (es werden zwei Intervalle auf Überschneidung getestet) ergibt wieder zwei Schnittpunkte. Diese werden anschließend in Weltkoordinaten transferiert. Nun geht man für jeden Kontaktpunkt wieder genauso vor wie bei Kugel-Box-Kollisionen. 5.7 Box-Ebenen-Kollision Kollisionserkennung Für die folgenden Berechnungen benötigt man die Normale der Ebene π in Relation zu der Box B: n B = R T r 00 r 10 r 20 n = r 01 r 11 r 21 n (5.50) r 02 r 12 r 22 Zuerst sucht man die Diagonale der Box, die in Richtung der Normalen der Ebene zeigt. In box-relativen Koordinaten ist das sehr einfach: man überprüft komponentenweise die Normale auf ihr Vorzeichen und speichert die Halblänge der Box mit jeweils zur Normale entgegengesetzten Richtung in einem Vektor. Dieser enthält nach Durchlauf aller drei Dimensionen die Ecke der Box, die am weitesten entgegen der Richtung der Normalen liegt. Diesen Vektor transformiert man in Weltkoordinaten und setzt ihn in die Ebenengleichung ein. Als Ergebnis erhält man die Information, ob sich der Punkt im positiven Halbraum - also außerhalb der Ebene - oder im negativen Halbraum - in der Ebene - befindet. Damit weiß man ob eine Kollision stattfindet. bool BoxPlaneTest ( BoxID b, PlaneID p ) { Vector3 n_rel = b >GetRotation ( ). Transpose ( ) p >GetNormal ( ) ; Vector3 min ; for ( unsigned i n t i = 0 ; i < 3 ; ++ i ) { i f ( n_rel [ i ] >= 0) { min [ i ] = 0.5 b >GetLengths ( ) [ i ] ; } else { min [ i ] = 0. 5 b >GetLengths ( ) [ i ] ; } } i f ( ( p >GetNormal ( ) b >PointFromBFtoWF ( min ) p > GetDisplacement ( ) ) > contactthreshold ) { return f a l s e ; } return true ; } 50

63 5.8. KAPSEL-KAPSEL-KOLLISION Abbildung 5.10: Kollisionserkennung zwischen einer Box und der Ebene π durch Bestimmung des Punktes p min, welcher im Falle einer Kollision auch ein Kontaktpunkt ist Kontaktpunktberechnung In der Kollisionserkennung wird schon ein benötigter Kontaktpunkt berechnet - allerdings können es bei dieser Kollision bis zu vier Kontaktpunkte sein, da alle vier Ecken der Box die Ebene berühren können. Nachdem man den ersten Kontaktpunkt berechnet hat, testet man die Seiten der Box auf Parallelität, indem man überprüft, ob Komponenten des relativen Normalenvektors n B (annähernd) gleich Null sind. Falls sich eine parallele Seite findet, werden zwei Kontaktpunkte erzeugt, bei zwei parallelen Seiten entsprechend vier. Diese Berechnung ist wieder im Raum relativ zur Box am einfachsten. Man merkt sich die jeweils parallele Seite und erzeugt einen zusätzlichen Kontaktpunkt mit in dieser Dimension umgekehrtem Vorzeichen. Um den vierten, dem erstem Kontaktpunkt diagonal gegenüberliegenden, Punkt zu erzeugen sind zwei umgekehrte Vorzeichen in beiden Dimensionen von Nöten. Diese Punkte werden im Raum der Box berechnet, da es sich bei den Eckpunkten um Kombinationen der positiven und negativen Halblängen der Box handelt, was allerdings eine anschließende Umrechnung in Weltkoordinaten erfordert. 5.8 Kapsel-Kapsel-Kollision Kollisionserkennung Durch die Verwendung der Funktion zur Berechnung der nächstliegenden Punkte auf zwei Liniensegmenten (siehe 4.4) ist dieser Test sehr kurz: Nachdem man die betreffenden Punkte errechnet hat, vergleicht man die Länge der Differenz beider Vektoren mit den addierten Radien beider Kapseln. Die Endpunkte der Mittellinie der Kapseln berechnet man wie in bool CapsuleCapsuleTest ( CapsuleID c1, CapsuleID c2 ) { 51

64 KAPITEL 5. KOLLISIONSALGORITHMEN } Vector3 c1_up =. 5 c1 >GetLength ( ) Vector3 ( c1 >GetRotation ( ) [ 0 ], c1 >GetRotation ( ) [ 3 ], c1 >GetRotation ( ) [ 6 ] ) ; Vector3 c2_up =. 5 c2 >GetLength ( ) Vector3 ( c2 >GetRotation ( ) [ 0 ], c2 >GetRotation ( ) [ 3 ], c2 >GetRotation ( ) [ 6 ] ) ; Vector3 cp1, cp2 ; ClosestLineSegmentPoints ( c1 >GetPosition ( ) + c1_up, c1 > GetPosition ( ) c1_up, c2 >GetPosition ( ) + c2_up, c2 > GetPosition ( ) c2_up, cp1, cp2 ) ; return ( ( cp1 cp2 ). SqrLength ( ) < Sqr ( c1 >GetRadius ( ) + c2 > GetRadius ( ) + contactthreshold ) ) ; Kontaktpunktberechnung Auch hier verwendet man die errechneten nächsten Punkte. Falls die Vektoren der Mittellinien der Kapseln parallel sind, werden zwei Kontaktpunkte erzeugt, andernfalls nur einer. Falls mehrere Kontaktpunkte existieren könnten, werden die Endpunkte der Mittellinien in kapsel-relativen Koordinaten einer der Kapseln auf die nicht-parallele Dimension reduziert und die entstehenden Intervalle der Kapseln auf Überschneidung getestet. Das Intervall in dem sich die Kapseln überschneiden wird um die beiden anderen Koordinaten ergänzt und in Weltkoordinaten umgewandelt. Die Kontaktpunkte werden genauso berechnet, als ob zwei Kugeln mit den ermittelten Punkten als Mittelpunkte kollidieren (siehe 5.1.2) Dabei wird im Falle der Parallelität der Kapsel noch einmal der Abstand berechnet und getestet, um sicher zu stellen, dass nur wirklich existente Kontaktpunkte erzeugt werden. 5.9 Kapsel-Ebenen-Kollision Kollisionserkennung Durch das Einsetzen der Endpunkte der Mittelgeraden der Kapsel in die Ebenengleichung ergibt sich ein Abstand der Punkte von der Ebene. Diese Punkte errechnet man wie in Anschließendes Vergleichen der Abstände mit dem Radius der Kapsel ergibt das Ergebnis des Tests. Falls eines der beiden Enden sich mit der Ebene schneidet, so ist eine Kollision gefunden Kontaktpunktberechnung Je nach Ergebnis des Kollisionstests beider Enden der Kapsel erzeugt man einen oder zwei Kontaktpunkte, indem man an einem oder beiden Enden eine Kugel-Ebenen-Kollision berechne (siehe 5.2.2). 52

65 5.10. DREIECKSNETZ-EBENE-KOLLISIONEN Abbildung 5.11: Kollisionserkennung zwischen einer Kapsel c und einer Ebene p. Abstände d 1 und d 2 zu beiden Enden der Kapsel Dreiecksnetz-Ebene-Kollisionen Kollisionserkennung Wenn sich alle Dreieckseckpunkte oberhalb der Ebene befinden, findet keine Kollision statt. Befindet sich ein Eckpunkt in oder auf der Ebene findet eine Kollision statt, in welchem Fall der Kollisionstest positiv ist Kontaktpunktberechnung Nun interessiert nicht mehr nur das Vorkommen einer Kollision bzw. eines kollidierenden Dreiecks, sondern deren exakte Position. Es werden alle Dreiecke auf Kollisionen getestet und deren Eindringtiefe in die Ebene bestimmt. Man könnte nun annehmen, dass das Dreieck oder die Dreiecke mit höchster Eindringtiefe den oder die Kollisionspunkte bestimmen. Dies wäre bei konvexen Dreiecksnetzen der Fall, da davon ausgegangen werden kann, dass nur ein Kontaktpunkt besteht. Falls jedoch, wie bei nicht-konvexen Netzen möglich, mehrere Kontaktpunkte existieren, würde die Erkennung nur eines einzelnen Kollisionspunktes zu einem nicht korrekten Verhalten führen. Eventuell werden die anderen Kontakte (zufällig) durch die Kollision an der ersten Stelle auch aufgelöst - im schlimmsten Fall wird durch eine entstehende Drehbewegung ein Schnitt des Dreiecksnetzes mit der Ebene sogar vergrößert anstatt verringert zu werden. Folglich muss für jedes Dreieck, das einen Schnitt mit der Ebene hat, mindestens einen Kontaktpunkt berechnet werden. Für jeden Eckpunkt, dessen Abstand f zur Ebene im Intervall (-contactthreshold, contactthreshold) liegt, wird ein Kontakt erzeugt. Falls ein Eckpunkt weiter in die Ebene eingedrungen sein sollte, 53

66 KAPITEL 5. KOLLISIONSALGORITHMEN Abbildung 5.12: Kollisionserkennung zwischen einer Kugel s und einem Dreieck. Der Schnitt eines aufgeblasenen Dreiecks mit einem Punkt ist äquivalent. werden Kontaktpunkte an den Stellen des Schnittes der Kanten des Dreiecks mit der Ebene erzeugt. Angenommen man hat zwei Eckpunkte v 1 und v 2 mit den Abständen zur Ebene f 1 contactthreshold und f 2 -contactthreshold, dann berechnet man den Schnittpunkt p wie folgt: p = v 1 + f 1 f 1 f 2 ( v 2 v 1 ) (5.51) Wenn ein Dreieck in einem Zeitschritt vollständig in die Ebene eingedrungen sein sollte, nämlich weiter als -contactthreshold, dann wird dieses Dreieck vernachlässigt, da es in jede Richtung um dieses Dreieck andere Dreiecke des Dreiecksnetzes geben muss, welche die Oberfläche der Ebene schneiden. Sollten solche Fälle allerdings häufiger auftreten, ist wahrscheinlich die Zeitauflösung zu niedrig Dreiecksnetz-Kugel-Kollisionen Um diese Tests zu verstehen, ist es hilfreich, sich eine Kugel-Dreieck-Kollision anders vorzustellen: als Kollision einer Punktes mit einem aufgeblasenen Dreieck ( puffy triangle ). Man könnte einen solchen, auf einem Dreieck basierenden Körper auch als triangle swept sphere beschreiben - womit die Verwandtheit mit der line-swept-sphere, auch Kapsel genannt, klar wird. Vorteilhaft ist diese Ähnlichkeit, da auch ähnliche Tests angewandt werden können um Schnitte zu finden. Weiterhin ist es einfacher, sich die Kollisionstests auf diese Weise vorzustellen (siehe Bild 5.12) Kollisionserkennung Der folgende Test wird für jedes Dreieck ausgeführt, bis eine Kollision gefunden wurde. Als Erstes wird geprüft, ob die Kugel überhaupt mit der Ebene, auf der sich das Dreieck befindet, kollidiert (siehe 5.2.1). Falls sich die Kugel vollständig innerhalb der Ebene befindet, kann eine Kollision (für dieses eine Dreieck) ebenso ausgeschlossen werden - eine Kollision 54

67 5.11. DREIECKSNETZ-KUGEL-KOLLISIONEN findet allenfalls mit dem Dreieck statt, welches das Dreiecksnetz auf der anderen Seite abschließt. Falls eine Kollision von vornherein ausgeschlossen ist, ist der Test dieses Dreiecks abgeschlossen. Andernfalls wird getestet, ob sich die Projektion des Kugelmittelpunktes innerhalb der Dreiecksfläche befindet. In diesem Fall wurde eine Kollision erkannt (siehe 4.6). Es gibt noch zwei weitere mögliche Kollisionsfälle: mit einer Kante des Dreiecks oder einem Eckpunkt. Zunächst bestimmt man den zum Kugelmittelpunkt nächstliegenden Punkt auf den Linien durch je zwei Eckpunkte des Dreiecks (siehe 4.1). Falls sich dieser innerhalb des Intervalls, welches durch die Eckpunkte gegeben ist, befindet, berechnet man den Abstand zum Kugelmittelpunkt. Wenn dieser kleiner ist als der Radius der Kugel, hat man einen Kontaktpunkt gefunden. Hier reicht nicht mehr der vorher berechnete Abstand entlang der Normalen, da sich der Mittelpunkt der Kugel nicht mehr über dem Dreieck befindet. Falls noch kein Schnitt gefunden wurde bleibt als letzte Möglichkeit die Kollision mit einem Eckpunkt. Hier reicht ein Vergleich des Punkt-Punkt-Abstandes zwischen jedem Dreieckseckpunkt und dem Kugelmittelpunkt mit dem Kugelradius. Falls jetzt noch kein Kontakt gefunden wurde, kollidiert dieses Dreieck nicht mit der Kugel. Falls ein einziges Dreieck positiv auf eine Kollision mit der Kugel getestet wird, kann der Algorithmus mit positivem Ergebnis zurückkehren Kontaktpunktberechnung Die Tests und deren Reihenfolge ist hier genauso wie bei der Kollisionserkennung. Allerdings kommt es hier sogar auf genau diese Reihenfolge an. Sie gibt ohne weitere Tests den der Kugel nächstliegenden Punkt auf dem Dreieck an. Falls die Kugel mit der Fläche des Dreiecks kollidiert, ist der Abstand zu einer der Kanten des Dreiecks mindestens genauso groß - meist jedoch größer - als der zur Dreiecksfläche. Ebenso verhält es sich zwischen Kanten- und Eckpunktkollisionen. Sobald ein Kontaktpunkt gefunden wurde, muss nicht nach weiteren gesucht werden, da eine Kugel nur einen Kontaktpunkt bei der Kollision mit einem Dreieck haben kann. Bei einer Kollision mit der Dreiecksfläche ist der Normalenvektor die Normale der Ebene des Dreiecks. Bei der Kollision mit einer Kante setzt man den errechneten Parameter in die Liniengleichung für die Dreieckskante ein und errechnet die Normale als normalisierten Vektor der Verbindung von diesem Punkt zum Mittelpunkt der Kugel. Bei einer Kollision mit dem Eckpunkt zeigt der Normalenvektor von dem Eckpunkt des Dreiecks zum Kugelmittelpunkt. Der Kontaktpunkt p wird dann aus dem Abstand f, der Normale n, dem Kugelmittelpunkt c und dem Radius r errechnet: p = c f + r n (5.52) 2 p liegt in der Mitte der kollidierenden Oberflächenpunkte der Kugel und des Dreiecksnetzes. Auch bei diesem Test erzeugt man aus jeder Kollision mit einem Dreieck einen Kontaktpunkt, da das Dreiecksnetz nicht-konvex sein kann und damit mehrere Kontaktpunkt wichtig für ein korrektes Verhalten sind. 55

68 KAPITEL 5. KOLLISIONSALGORITHMEN 5.12 Dreiecksnetz-Kapsel-Kollisionen Kollisionserkennung Es werden wieder alle Dreiecke einzeln getestet und ein einziger Schnitt reicht, um den Test positiv abzuschließen. Es sehr hilfreich, sich für diesen Test eine Kapsel als line-sweptsphere - also auf einer Linie verschobene Kugel vorzustellen. Als Erstes testet man die Kugeln an den Enden dieser Line auf Kollision mit der Ebene des Dreiecks (siehe 5.9.1). Falls die Kugelmittelpunkte weiter als der Radius der Kapsel von der Ebene entfernt sind, findet keine Kollision statt. Dasselbe Ergebnis gilt für den Fall, dass sich beide Mittelpunkte in der Ebene befinden - eine mögliche Kollision existiert dann an einer anderen Stelle des Dreiecksnetzes. Nicht verworfen werden darf der Fall, dass sich eine der Kugeln in der Ebene befindet und die andere darüber. Falls sich eines der Kapsel-Enden mit der Ebene der Dreiecks schneidet, prüft man, ob dieser Schnitt innerhalb des Dreiecks erfolgt (4.6). Falls sich kein Schnitt findet, testet man die Kanten des Dreiecks gegen die Mittellinie der Kapsel mittels des Algorithmus zur Berechnung der nächsten Annäherung zweier Liniensegmente (4.4). Die errechneten Abstände werden nun mit dem Radius verglichen. Falls keine Kollision erkannt wurde, wird der Test mit dem nächsten Dreieck fortgesetzt Kontaktpunktberechnung Dieser Algorithmus basiert auf der Kollisionserkennung, mit dem Unterschied, dass er bei einer gefunden Kollision nicht terminiert. Das Vorgehen ist dasselbe, nur dass jetzt Kollisionspunkte und Normalen berechnet werden müssen. Im Falle der Kollision eines oder beider Kapsel-Enden mit der Dreiecksfläche ist das weitere Verfahren genau wie bei der Kollision einer Kugel mit der Dreiecksfläche in Falls eine Kollision mit einer Dreieckskante erkannt wurde, ist die Kollisionsnormale die Verbindung des berechneten Punktes nächster Annäherung auf der Dreieckskante der Kontaktpunkt mit dem auf der Mittellinie der Kapsel. Der Kontaktpunkt errechnet sich mit der Formel 5.52 wobei c jetzt der berechnete Punkt auf der Mittellinie der Kapsel ist Dreiecksnetz-Dreiecksnetz-Kollisionen Da dieser Test für jedes Dreieck des ersten Körpers gegen jedes Dreieck des zweiten Körpers ausgeführt werden muss, ist es notwendig, einen sehr effizienten Algorithmus zu haben. Im Folgenden wird eine Methode beschrieben, die verschiedene Berechnungsweisen kombiniert, im Ansatz aber auf der interval overlap -Methode von Möller[5] basiert. Die Kollisionserkennung zwischen Dreiecksnetzen ist auch mit anderen Verfahren möglich. Algorithmen, die auf dem SAT (3.3) beruhen, scheiden aus, da für die Kollisionsbehandlung Kontaktpunkte benötigt werden. Eine zu der hier vorgestellten vergleichbar schnelle Methode ist der Dreieck/Dreieck-Schnitttest aus ERIT[3]. 56

69 5.13. DREIECKSNETZ-DREIECKSNETZ-KOLLISIONEN Kollisionserkennung Das zu lösende Problem ist es zu bestimmen, ob zwei Dreiecke T 1 = v 0 v 1 v 2 und T 2 = u 0 u 1 u 2 schneiden. Als Erstes berechnet man die Ebene π 1, auf der T 1 liegt. Da die Normale der Dreiecks abgespeichert ist, muss nur noch der Parameter d 1 berechnet werden: d 1 = n 1 v 0 (5.53) Nun bestimmt man durch Einsetzen der Eckpunkte von T 2 deren Abstand f zur Ebene π 1 : f ui = n 1 u i d 1, i = 0,1,2. (5.54) Um Stabilitätsprobleme zu vermeiden, werden die Abstände mit einem konstanten ǫ, dem contactthreshold, verglichen. Falls sich der entsprechende Eckpunkt näher an der Ebene befindet als dieser Wert, wird der Abstand auf 0 gesetzt. Damit wird erreicht, dass annähernd koplanare Dreiecke als koplanar erkannt werden, und es wird vermieden, dass im Folgenden mit sehr kleinen Werten dividiert wird. Wenn sich alle Punkte auf derselben Seite der Ebene befinden, also das gleiche Vorzeichen haben, findet keine Kollision statt. Dies ist genau dann der Fall, wenn (f u0 f u1 ) > 0 und (f u0 f u2 ) > 0. Derselbe Test wird auch mit T 1 zur Ebene von T 2 ausgeführt. Falls alle Abstände 0 sind, befinden sich beide Dreiecke auf einer gemeinsamen Ebene, was getrennt behandelt werden muss und später erläutert wird. Wenn die Dreiecke nicht auf einer gemeinsamen Ebene liegen, gibt es einen Schnitt beider Ebenen π 1 und π 2, und zwar eine Linie l = o + td, wobei d = n 1 n 2 und o ein beliebiger Punkt auf der Linie ist. Beide Dreiecke schneiden diese Linie auf einem Intervall. Falls sich diese Intervalle überschneiden, kollidieren die Dreiecke. Im Folgenden wird dieses Intervall für das Dreieck T 1 berechnen und angenommen, dass v 0 und v 2 auf derselben Seite der Ebene π 2 liegen, v 1 dem entsprechend auf der anderen. Als Erstes werden die Eckpunkte auf die Linie l projiziert: p vi = d ( v i o), i = 0,1,2. (5.55) Die Intervalle können ohne Veränderung des Ergebnisses (in Bezug auf den Schnitttest) beliebig verschoben werden, also kann statt Gleichung 5.55 vereinfacht p vi = d v i, i = 0,1,2. (5.56) verwendet werden, was die Berechnung eines Punktes o vermeidet. Als Nächstes benötigt man den Wert t c an der Stelle c, an welcher die Kante v 0 v 1 die Linie l schneidet. Über den Strahlensatz ist einfach herauszufinden, dass die Summe der absoluten Abstände von der Ebene f v0 und f v1 sich zu f v0 genauso verhalten wie die Längen von p v0 p v1 zu p v0 t c (siehe Abb. 5.13). Also kann t c wie folgt berechnet werden: t c = p v0 + f v0 f v0 f v1 (p v0 p v1 ). (5.57) Ebenso wird der Schnittpunkt von l und v 1 v 2 berechnet. Diese beiden Schnittpunkte bilden das gesuchte Intervall auf l. Dieselbe Vorgehensweise auf das Dreieck T 2 angewendet, 57

70 KAPITEL 5. KOLLISIONSALGORITHMEN Abbildung 5.13: Schnittpunkt c der Linie durch v 0 und v 1 mit der Ebene π 2. l ist die Schnittlinie der Ebenen π 1 und π 2, f i sind die (vorzeichenbehafteten) Abstände der Punkte v i von π 2, p vi sind die Projektionen der Punkte v i auf die Linie l. (a) Schnitt der Dreiecke auf der Linie l (b) kein Schnitt der Dreiecke auf der Linie l (c) Schnitt der Dreiecke auf einer gemeinsamen Ebene π (d) kein schnitt der Dreiecke auf einer gemeinsamen Ebene π Abbildung 5.14: Verschiedene Möglichkeiten der Lage zweier Dreiecke T 1 und T 2 auf den Ebenen π 1 und π 2 bzw. π. Alle anderen Möglichkeiten werden schon durch die Lage der Eckpunkte eines Dreiecks auf nur einer Seite der Ebene des anderen Dreiecks ausgeschlossen. 58

71 5.13. DREIECKSNETZ-DREIECKSNETZ-KOLLISIONEN resultiert in dessen Intervall. Falls diese Intervalle überlappen, schneiden sich die Dreiecke. Im Fall, dass die Dreiecke auf derselbe Ebene liegen, projiziert man sie auf die durch die Koordinatenachsen aufgespannte Ebene, auf der die Fläche der Dreiecke maximal ist. Dies geschieht durch Weglassen der Komponente, in welcher der maximale Absolutwert der Normalen gespeichert ist. Dies ist die Achse, auf der die Fläche der Dreiecke maximal ist und es wird vermieden durch die Projektion eine Linie zu erhalten. Jetzt werden die Dreiecke im Zweidimensionalen auf Überschneidung getestet. Erst werden alle Dreieckskanten von T 1 auf Schnitte mit den Kanten von T 2 getestet. Falls ein Schnitt existiert, schneiden sich die Dreiecke. Nun wird noch getestet, ob ein Dreieck vollständig im anderen liegt, indem mit je einem Eckpunkt ein Punkt-in-Dreieck-Test (siehe 4.6) durchgeführt wird Kontaktpunktberechnung Das Testverfahren ist dasselbe wie bei der Kollisionserkennung, nur müssen jetzt auch Kontaktpunkte berechnet werden. Beim Bestimmen der Schnittintervalle der Dreiecke mit der Linie l können die Endpunkte berechnet werden: p 1 = v 0 + t ( v 2 v 0 ). (5.58) Genauso können die anderen Intervallendpunkte berechnet werden. Nachdem bestimmt wurde, dass die Intervalle überlappen, müssen noch die richtigen Punkte ausgewählt werden. Dies geschieht durch Zuordnung der Punkte zu einem der t-wert in der obigen Berechnung. Nachdem festgestellt wurde, welche t-werte Überschneidungen auf l bilden, ist auch klar welche Punkte die Schnittlinie bildet. Am Ende bleiben zwei Punkte, welche als Kontaktpunkte zwischen den Dreiecken verwendet werden können. Falls die Dreiecke auf der selbe Ebene liegen, berechnet man erst alle Schnittpunkte der Kanten untereinander. Da hier die Dreiecke wieder in zwei Dimensionen betrachtet werden können reicht ein einfacher 2D-Linien-Schnitt-Algorithmus (siehe 4.2). Die erhaltenen Linien- Parameter werden dann mit den dreidimensionalen Punkten verwendet um die Schnittpunkte zu berechnen. Jetzt werden noch alle Punkte beider Dreiecke darauf getestet, ob sie im anderen Dreieck liegen (siehe 4.6). Die im jeweils anderen Dreieck enthaltenen Punkte sind auch Kontaktpunkte. Es entsteht die Kontaktfläche beider Dreiecke. Die Normale dieser Kollision ist die Normale der kollidierenden Dreiecke. Die Berechnung der Kollisionsnormale für nicht koplanaren Dreiecke gestaltet sich als schwieriger. Eine Möglichkeit ist es, die Differenz der Normalen beider Dreiecke zu berechnen und zu normalisieren: n = n 2 n 1 n 2 n 1 (5.59) Die entstehende Normale zeigt immer von Dreieck 2 zu Dreieck 1 und stellt somit in den meisten Fällen eine gut Approximation dar. Eine Division durch 0 sollte nicht vorkommen, da dies nur bei koplanaren Dreiecke auftreten kann und dieser Fall anderweitig behandelt wird. 59

72 KAPITEL 5. KOLLISIONSALGORITHMEN 5.14 Dreiecksnetz-Box-Kollisionen Hier kann ein ähnlicher Test verwendet werden, wie bei Dreiecksnetz-Dreiecksnetz- Kollisionen. Das Netz wird aus den Eckpunkten der Box, gegeben durch die Ausdehnung der Box berechnet. Für ein Test, der alle besonderen Eigenschaften der Box, wie die Symmetrie und Achsenausrichtung im eigenen Raum, ausnutzt, müssten sämtliche Dreiecke in den Raum der Box zu transformiert werden, was sicher ineffizient wäre. Stattdessen werden die Berechnungen in Weltkoordinaten ausgeführt. Auch hier gibt es besondere Eigenschaften einer Box, welche ausgenutzt werden können. Es ist sinnvoll die Seitenflächen der Box durch Vierecke zu repräsentieren, was nur geringe Änderungen an den Tests gegenüber dem Dreiecksnetz verursacht. Weiterhin sind die Seitenflächen paarweise parallel, was man ausnutzen kann, indem man das Skalarprodukt eines zu testenden Punktes in Gleichung 5.54 nur einmal pro Paar berechnet und für beide Seiten einen anderen Offset subtrahiert. Falls eine Boxseitenfläche und ein Dreieck koplanar sind, kann der Punkt-In-Dreieck-Test (4.6) für die Box wiederum vereinfacht werden, da die Skalarprodukte eines Vektors mit der Richtung zweier parallelen Kanten identisch sind. In allen Berechnungen müssen an Stelle der drei Eckpunkte oder Kanten eines Dreiecks vier verwendet werden Union-Kollisionen Da eine Union ein Aggregat mehrerer Primitive ist, gestaltet sich eine Kollision einer oder mehrerer Unions als einfach: Wenn an einem Kollisionstest eine oder zwei Unions beteiligt sind, werden alle Teilobjekte der Union durchiteriert. Für die Kollisionserkennung ist wieder ein einzelner Kontakt ausreichend. 60

73 Kapitel 6 Die Echtzeitvisualisierung In diesem Kapitel wird die Integration der Echtzeitvisualisierung in die pe Physikengine beschrieben. Weiterhin werden die Grundlagen der Darstellung von Geometrien mittels der Open Graphics Library (OpenGL) erläutert und es wird am Beispiel der Box gezeigt, wie die Darstellung eines Geometrieprimitivs abläuft. 6.1 Integration der Visualisierung Die Anzeige läuft in einem getrennten Thread ab, also getrennt von den Berechnungen der pe Engine. Es wird zu erst der Anzeigethread gestartet, welcher dann die Simulation in einem eigenen Thread startet. Dem Thread wird ein Zeiger auf die Welt übergeben, in der er die Objekte und Daten abspeichert, die zur Simulation gehören. In konfigurierbaren Intervallen wird vom Simulationsthread ein Signal ausgesandt, welches den Visualisierungsthread veranlasst, alle Objekte der Simulation neu einzulesen. Dabei werden für jeden Körper Rotation und Translation ausgelesen, sowie alle für den jeweiligen Körper charakteristische Daten (siehe 3.1). Diese Daten werden abgespeichert und bei jedem Neuzeichnen des Visualisierungsfensters ausgelesen. Bei der Visualisierung müssen aus den Daten der Objekte Dreiecksgeometrien (zumindest Polygongeometrien) erzeugt werden. Dabei wird soweit möglich auf Funktionen der Open Graphics Library zurückgegriffen. Sie bietet Befehle für die Anzeige geometrischer Primitive. Um Kugeln anzuzeigen, kann zum Beispiel glusphere genutzt werden, während eine Kapsel aus einer Kombination aus zweier glusphere und einem glucylinder besteht. Um Boxen darzustellen, werden für jede Seitenfläche zwei Dreiecke unter Zuhilfenahme der Seitenlängen als Eckpunktkoordinaten erstellt. Dabei muss man auch die richtigen Normalen angeben, damit die Beleuchtung der Box korrekt aussieht. Die Darstellung von Dreiecksnetzen ist sehr einfach, da diese ja Dreiecksgeometrien angeben, welche direkt mit OpenGL darstellbar sind. Diese Vorgehensweisen, aus den Objekten die nötigen Dreiecksgeometrien zu gewinnen, werden in Objektkoordinaten ausgeführt. In OpenGL reicht die Angabe der Rotationsmatrizen und der Translationen, um diese im Verlauf der dreidimensionalen Darstellung anzuwenden. Dabei ist zu beachten, dass der Betrachter in OpenGL in Richtung der negativen 61

74 KAPITEL 6. DIE ECHTZEITVISUALISIERUNG z-achse blickt und alle Geometrien an der x-y-ebene gespiegelt dargestellt werden müssen, um in OpenGL richtig angezeigt zu werden. Im Folgenden wird der Ablauf der Darstellung dreidimensionaler Geometrien mittels OpenGL erklären, welches die Grundlage für die Echtzeitvisualisierung darstellt. 6.2 Die OpenGL-Renderpipeline Die Aufgabe der Renderpipeline ist es, aus gegebenen dreidimensionalen Objekten, einer Kameraposition, Lichtquellen und Texturen ein zweidimensionales Bild zu berechnen - zu rendern. Die darzustellenden Objekte werden durch ihre Lage und Geometrie bestimmt. Ihr Aussehen wird durch die Materialeigenschaften, Lichtquellen, Texturen und Beleuchtungsmodelle bestimmt. Die Renderpipeline besteht aus verschiedenen Stufen. Die meisten Teile der Pipeline sind in Hardware implementiert und werden auf der Grafikkarte berechnet. Erst durchlaufen die darzustellenden Körper die Anwendungsstufe, in der jede beliebige Operation in Software ausgeführt werden kann. Als Nächstes folgt die Geometrie-Stufe. Hier werden die einzelnen Punkte, aus denen die darzustellenden Objekte bestehen, bearbeitet. Die Geometrie-Stufe besteht wieder aus einzelnen Teilen. Als Letztes kommt die Rasterisierungsstufe Die Anwendungsstufe Die Hauptaufgabe der Anwendungsstufe ist es, die darzustellende Geometrie in Primitive zu zerlegen, die von der verwendeten Hardware verarbeitet werden können. Dies beinhaltet beispielsweise die so genannte Triangulierung von Geometrischen Primitiven, wie Kugeln oder Boxen, da die Grafikkarte nur Dreiecke bzw. Vierecke als (hier relevante) Primitive darstellen kann. Aus Sicht der Computergrafik kann auch die Kollisionserkennung als Teil der Anwendungsstufe aufgefasst werden. Resultat der Anwendungsstufe sind also die Geometrien der darzustellenden Objekte sowie deren Rotation und Translation. Außerdem werden hier Eingaben durch Tastatur oder Maus behandelt, welche zu Veränderungen, etwa der Kameraposition, führen können Die Geometriestufe Hier werden vor allem die Operationen ausgeführt, die sich auf Dreiecke bzw. Eckpunkte beziehen. Man kann diese Stufe noch weiter unterteilen: Die Model- und View-Transformationen Am Anfang befindet sich jedes darzustellende Objekt in seinem eigenen Raum mit eigenem Model-Koordinatensystem. Nachdem die Model-Transformation ausgeführt wurde, befindet es sich im Welt-Koordinatensystem, in das auch alle anderen darzustellenden Objekte transformiert werden. Ein einzelnes Objekt kann auch mehreren Transformationen zugeordnet sein, so dass dieselbe Geometrie mit anderer Größe, Position und Drehung nochmals 62

75 6.2. DIE OPENGL-RENDERPIPELINE verwendet werden kann. Die Parameter der Kamera werden ebenfalls in Welt-Koordinaten angegeben. Die Kamera-Transformation sorgt nun dafür, dass sich die Kamera im Ursprung befindet und in die Richtung der negativen z-achse zeigt. Die y-achse zeigt nach oben und die x-achse nach rechts. Position und Richtung nach dieser View-Transformation sind abhängig von der API, die hier genannten Werte sind für OpenGL gültig. Die Model- und View-Transformation werden zusammengefasst zur Model-View-Transformation, die zugehörige Matrix nennt sich Model-View-Transformationsmatrix. Diese Matrizen sind alle 4x4- Matrizen, sie können also unter anderem Rotationen und Transformationen darstellen Die Beleuchtung und das Shading Hier werden der Szene eine oder mehrere Lichtquellen hinzugefügt. Dies ist notwendig, um vor allem bei untexturierten Objekten einen Eindruck einer räumlichen Darstellung zu vermitteln. Auf den Objekten, bei denen die Beleuchtung aktiviert ist, wird eine Beleuchtungsberechnung durchgeführt, welche die Beleuchtung in der wirklichen Welt simuliert. Diese Berechnung findet für jeden Eckpunkt statt und berücksichtigt die Materialeigenschaften und Farbe des Objektes sowie die Eigenschaften der Lichtquelle - zum Beispiel Farbe und Position. Es werden allerdings weder Reflexionen noch Schatten berechnet Die Projektion Nun kommt die Projektion, welche das Viewfrustrum in einen Würfel mit den gegenüberliegenden Eckpunkten (-1,-1,-1) und (1,1,1) transformiert. Dabei entstehen die normalized device coordinates. Den Vorgang nennt man Projektion, weil nach dieser Transformation die z-koordinaten nicht im entstehenden Bild abgespeichert werden. Es entsteht ein zweidimensionales Bild Clipping Da nur die Punkte, Linien und Dreiecke, die sich innerhalb des Viewfrustrums befinden, dargestellt werden, werden nur diese weiterverarbeitet. Befindet sich aber beispielsweise nur ein Punkt einer Linie im Viewfrustrum, muss die Linie abgeschnitten und am Schnittpunkt des Einheitswürfels mit der Linie ein neuer Punkt erstellt werden. Diesen Vorgang nennt man Clipping. Anschließend werden die übrig gebliebenen Primitive in Bildschirmkoordinaten transformiert. Die entstehenden Werte sind die x- und y-koordinaten, die später wirklich auf dem Ausgabegerät angezeigt werden Die Rasterisierungsstufe Nun kommt die dritte und letzte Stufe der Renderpipeline, die Rasterisierung. Sie weist jedem Pixel des Bildes den richtigen Farbwert im Colorbuffer zu. Außerdem wird hier entschieden, welche Objekte von der Kamera aus sichtbar sind und welche verdeckt. Dies geschieht mittels des z-buffers, in dem zu jedem Punkt der Tiefenwert gespeichert ist. 63

76 KAPITEL 6. DIE ECHTZEITVISUALISIERUNG Wenn der Tiefenwert eines neuen Pixels kleiner ist als der des im Color-Buffer befindlichen, wird der Farbwert und Tiefenwert durch den des neuen ersetzt, andernfalls wird der Pixel verworfen. Im Rasterisierer kann auch Texturierung stattfinden, dass heißt, das auf ein gerendertes Objekt ein Bild aufgebracht wird. 6.3 Darstellung einer Box als Beispiel der Visualisierung Die Darstellung einer Box b läuft folgendermaßen ab: GLdouble r o t a t i o n [ ] = { b >r o t a t i o n [ 0 ], b >r o t a t i o n [ 3 ], b >r o t a t i o n [ 6 ], 0, b >r o t a t i o n [ 1 ], b >r o t a t i o n [ 4 ], b >r o t a t i o n [ 7 ], 0, b >r o t a t i o n [ 2 ], b >r o t a t i o n [ 5 ], b >r o t a t i o n [ 8 ], 0, 0, 0, 0, 1 } ; GLdouble t r a n s l a t i o n [ ] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, b >p o s i t i o n [ 0 ], b >p o s i t i o n [ 1 ], b >p o s i t i o n [ 2 ], 1 } ; glpushmatrix ( ) ; glmultmatrixd ( t r a n s l a t i o n ) ; glmultmatrixd ( r o t a t i o n ) ; drawquboid ( 0. 5 b >lengths [ 0 ], 0. 5 b >lengths [ 1 ], 0. 5 b > lengths [ 2 ] ) ; glpopmatrix ( ) ; Zuerst erstellt man die zur Rotation und Translation in OpenGL nötigen Matrizen, wobei zu beachten ist, dass diese 4x4-matrizen in der row-first -Notation abgespeichert sind. Das bedeutet, dass Zeilen und Spalten im Vergleich mit der mathematischen und in pe verwendeten Notation vertauscht sind. Bevor die Matrizen angewendet werden, wird der aktuelle Zustand des Matrix-Stacks gesichert, damit die für diese eine Box nötigen Operationen nach dem Zeichnen wieder rückgängig gemacht werden können. Nun werden die Rotation und Translation angewendet und anschließend die Box gezeichnet. Die Funktion drawquboid erstellt die nötigen Dreiecke aus den Seitenlängen der Box. 64

77 Kapitel 7 Beispielszenen 7.1 Erstellen einer Szene Im Folgenden wird an einem Beispiel gezeigt, wie man in pe Simulationsszenarien mit verschiedenen Körpern erstellt. Als Erstes muß eine neue Simulationswelt geschaffen werden. An dieser wird ein für alle Objekte gültiger restititution -Wert eingestellt: WorldID world = CreateWorld ( ) ; world >S e t R e s t i t u t i o n ( 0. 4 ) ; Nun können der Welt verschiedene Objekte hinzugefügt werden: for ( i n t i = 0 ; i < 5 ; ++ i ) { BoxID b = world >CreateBox ( i, Vector3 (0 30 ( i %2), 0, 15 i ), 5 0, 1 0, 1, 1, 1 ) ; b >Rotate ( Vector3 ( 0, 1, 0 ), ( ( i %2)?1: 1) pe_pi /8) ; b >Fix ( ) ; } Hier werden fünf Boxen erstellt, die etwas zueinander versetzt und abwechselnd um +/ 12,5 gedreht werden. Abschließend werden die Boxen fixiert. Nun wird in die Szene eine Kugel eingesetzt: world >CreateSphere ( 1, Vector3 ( 1 2, 0, 80), 2, 1) ; Abschließend wird noch eine Ebene eingefügt: world >CreatePlane ( 1, Vector3 ( 0, 0, 1 ), 20,1) ; Es entsteht die Szene, welche in den Bildern A.3 dargestellt ist. Da nur eine Kugel erstellt wurde, existiert hier natürlich nur eine Kugel, so lang keine weiteren hinzugefügt werden. 65

78 KAPITEL 7. BEISPIELSZENEN 7.2 Benchmarks eigener Szenen Es wurden einige Szenen erstellt, welche geeignet sind, den Einfluss bestimmter Fähigkeiten der Kollisionsalgorithmen auf die Geschwindigkeit zu vergleichen. Es ist nicht sinnvoll, die Geschwindigkeit mit anderen Engines, etwa ODE[8], zu vergleichen, da diese eventuell andere Zielsetzungen, wie hohe Geschwindigkeit zu Lasten der Genauigkeit, haben. Die Geschwindigkeit wurde auf einem Athlon (1800 Megaherz) mit 1 Gigabyte Arbeitsspeicher gemessen Torrus vs. Kugeln Als Erstes werden 100 Kugeln auf einen im Raum fixierten Torrus fallen gelassen. Der Torrus besteht aus 400 Dreiecken und 1200 Eckpunkten. Die Kugeln befinden sich am Anfang sehr weit oberhalb des Torrus und treffen diesen nur zu Teilen (siehe Bild A.2). Damit sollte sich sehr gut der Einfluss der AABB zeigen lassen, da ein Test AABB gegen AABB wesentlich einfacher ist, als ein Test gegen 400 Ebenen (ein Test gegen eine Ebene sollte meist ausreichen um eine Kollision auszuschließen). mit AABB ohne AABB Simulationsdauer 6,2 sek 11,2 sek Tabelle 7.1: Benchmark: 100 Kugeln fallen auf Torrus - es wurden 2000 Zeitschritte der Größe 0,01 simuliert. Wie man sieht, erzielen die AABB fast eine Verdoppelung der Geschwindigkeit. Die Berechnung der Kollisionsreaktion und Anzahl der Kontakte wird mit AABB natürlich nicht verändert, wodurch eine gewisse Anzahl von Berechnungen immer notwendig ist Kugel rollen schräge Boxen hinab Der Zweck dieser Szene ist es, die Geschwindigkeit einer aus Dreiecken aufgebauten Box mit der von Boxprimitiven zu vergleichen. Es gibt fünf schräge Boxen, die leicht versetzt sind, so dass sie eine Bahn bilden. Über der obersten Box wird eine Kugel erstellt und rollt dann alle Boxen hinunter, bis sie am Ende über die Ebene weiterrollt (siehe Bild A.3). Jeden dreitausendsten Zeitschritt wird wieder eine Kugel erstellt, die dann den selben Weg nimmt wie die erste Kugel. Auch für diese Simulation wurde der Einfluss der AABB gemessen. 66

79 7.2. BENCHMARKS EIGENER SZENEN Boxprimitive Dreiecksnetz-Boxen mit AABB ohne AABB mit AABB ohne AABB Simulationsdauer 68,3 sek 69,8 sek 83,3 sek 98,4 Tabelle 7.2: Benchmark: Kugeln rollen schräge Boxen hinab - es wurden Zeitschritte der Größe 0,01 simuliert. Die Boxprimitive sind etwas etwas schneller als die Dreiecksnetze. Der geringe Unterschied ist sicher darauf zurückzuführen, dass die Berechnung der Reaktion auf eine Kollision mehr Zeit in Anspruch nimmt als die Kollisionsberechnung, da eine auf einer Box rollende Kugel aus Sicht der Engine ständig kollidiert. Der Einfluss der Hüllvolumen bei Boxprimitiven ist sehr gering, da der Test einer Kugel gegen eine Box relativ einfach ist und eine axis-aligned bounding box bei der Drehung der Boxen sehr groß ist. Es werden also oft erst die AABB getestet und anschließend noch die Primitive. Bei den Dreiecksgeometrien zeigt sich ein wesentlich größerer Einfluss der AABB, was wohl darauf zurückzuführen ist, dass für jedes Dreieck ein Test Ebene gegen Kugel ausgeführt werden muss und relativ häufig noch eine Bestimmung der Kollisionspunktes, bevor eine Kollision ausgeschlossen werden kann. 67

80 68 KAPITEL 7. BEISPIELSZENEN

81 Kapitel 8 Schluss 8.1 Ergebnisse Diese Arbeit hat die notwendigen Schritte demonstriert, um die pe Physikengine um die Geometrieprimitive Kapsel und Box zu erweitern. Zusätzlich wurde die Engine um Dreiecksnetze erweitert, welche beliebige Körpergeometrien ermöglichen. In Verbindung mit den schon existierenden Primitiven Ebene und Kugel ist die Physikengine damit in der Lage, bliebig komplexe Szenen zu simulieren. Während die Simulation mit Kugeln und Kapseln sowie fixierten Ebenen und Boxen gut funktioniert, gibt es Probleme bei Kollisionen zwischen Boxen. Kollisionen einer Box mit einer Seitenfläche einer anderen funktionieren problemlos, jedoch gibt es Probleme bei der Kollision von zwei Kanten. Hier wird die Kollision nicht richtig berechnet, da die zugrundeliegende Physiksimulation die Kollision zwischen Kanten noch nicht beherrscht. Dies ist darauf zurückzuführen ist, dass es bisher nur Kugeln und Ebenen gab, welche keine Kanten besitzen. Diese Probleme verschärfen sich bei der Verwendung von Dreiecksnetzen noch zusätzlich. Die Kollision von Kugeln, Kapseln und Dreiecksnetzen funktioniert wieder ziemlich gut. Allerdings wird eine aus 12 Dreiecken aufgebaute Box nicht exakt genauso simuliert, wie eine echte Box, was damit zusammenhängen könnte, dass an Dreieckskanten, welche sich auf einer Fläche der Box befinden eventuell zusätzliche Kontaktpunkte erzeugt werden, welche aber keine (genau) orthogonalen Kollisionsnormalen erzeugen, womit sehr kleine Abweichungen erzeugt werden, welche allerdings größere Änderungen im Ergebnis der Simulation erzeugen. Dem könnte eine zukünftige Erweiterung zur Erkennung von benachbarten koplanaren Dreiecken eines Körpers entgegenwirken. Die Visualisierungserweiterung ermöglicht eine sofortige Betrachtung und Beurteilung von Simulationsverläufen und -ergebnissen. Sie eigenet sich damit sehr gut als Hilfsmittel zur weiteren Entwicklung der pe Physikengine und zum Erstellen neuer Szenen. 69

82 70 KAPITEL 8. SCHLUSS

83 Anhang A Bilder A.1 Verschiedene Screenshots des Viewers Abbildung A.1: Szene: 100 Kapseln fallen auf Union aus 4 Boxen 71

84 ANHANG A. BILDER (a) (b) (c) (d) (e) Abbildung A.2: Szene: 100 Kugeln fallen auf Torrus 72

85 A.1. VERSCHIEDENE SCREENSHOTS DES VIEWERS (a) (b) (c) (d) (e) (f) Abbildung A.3: Szene: Kugeln rollen mehrere Boxen hinunter 73

86 ANHANG A. BILDER A.2 Vergleich einer Simulation mit Dreiecksnetz-Boxen und echten Boxen In den Abbildungen A.4 bis A.16 sieht man die Unterschiede einer Simulation mit Boxen als Box-Primitive (rechts) und solchen als Dreiecksnetze (links). Die Dreiecksnetze verhalten sich leicht anders, was nach ein paar Tausend Zeitschritten ein signifikant anderes Ergebnis produziert. Links sieht man jeweils die Dreiecksnetz-Boxen, rechts die Boxprimitive. Abbildung A.4: Zeitschritt 1000 Abbildung A.5: Zeitschritt

Kollisionserkennung

Kollisionserkennung 1 Kollisionserkennung von Jens Schedel, Christoph Forman und Philipp Baumgärtel 2 1. Einleitung Wozu wird Kollisionserkennung benötigt? 3 - für Computergraphik 4 - für Simulationen 5 - für Wegeplanung

Mehr

Darstellungsarten für 3D-Körper. Boundary Representation (BRep):

Darstellungsarten für 3D-Körper. Boundary Representation (BRep): Darstellungsarten für 3D-Körper Boundary Representation (BRep): Darstellung eines (verallgemeinerten) Polyeders durch das System seiner Ecken, Kanten und Facetten Abspeichern durch (Teilgraphen des) vef-graphen

Mehr

Kollisionserkennung Kapitel 12 Collision and Rigid Body Dynamics aus Jason Gregory: Game Engine Architecture. (Seite )

Kollisionserkennung Kapitel 12 Collision and Rigid Body Dynamics aus Jason Gregory: Game Engine Architecture. (Seite ) Universität zu Köln Historisch-Kulturwissenschaftliche Informationsverarbeitung Softwaretechnologie II (Teil 2): Simulation und 3D-Programmierung Sommersemester 2013 Dozent: Prof. Dr. Manfred Thaller Kollisionserkennung

Mehr

Algorithmen und Datenstrukturen Bereichsbäume

Algorithmen und Datenstrukturen Bereichsbäume Algorithmen und Datenstrukturen Bereichsbäume Matthias Teschner Graphische Datenverarbeitung Institut für Informatik Universität Freiburg SS 12 Überblick Einführung k-d Baum BSP Baum R Baum Motivation

Mehr

Einleitung 2. 1 Koordinatensysteme 2. 2 Lineare Abbildungen 4. 3 Literaturverzeichnis 7

Einleitung 2. 1 Koordinatensysteme 2. 2 Lineare Abbildungen 4. 3 Literaturverzeichnis 7 Sonja Hunscha - Koordinatensysteme 1 Inhalt Einleitung 2 1 Koordinatensysteme 2 1.1 Kartesisches Koordinatensystem 2 1.2 Polarkoordinaten 3 1.3 Zusammenhang zwischen kartesischen und Polarkoordinaten 3

Mehr

& sind die Vektorkomponenten von und sind die Vektorkoordinaten von. A x. a) Der Betrag eines Vektors

& sind die Vektorkomponenten von und sind die Vektorkoordinaten von. A x. a) Der Betrag eines Vektors Einführu hnung Was ist ein Vektor? In Bereichen der Naturwissenschaften treten Größen auf, die nicht nur durch eine Zahlenangabe dargestellt werden können, wie Kraft oder Geschwindigkeit. Zur vollständigen

Mehr

Lineare Algebra. Mathematik II für Chemiker. Daniel Gerth

Lineare Algebra. Mathematik II für Chemiker. Daniel Gerth Lineare Algebra Mathematik II für Chemiker Daniel Gerth Überblick Lineare Algebra Dieses Kapitel erklärt: Was man unter Vektoren versteht Wie man einfache geometrische Sachverhalte beschreibt Was man unter

Mehr

Seminar Computerspiele Räumliche Datenstrukturen. Ralf Pramberger

Seminar Computerspiele Räumliche Datenstrukturen. Ralf Pramberger Seminar Computerspiele Räumliche Datenstrukturen Ralf Pramberger Themen 2 1. Grundlagen Szene Sichtbarkeit (Raytracing) Culling 2. Räumliche Datenstrukturen Bounding Volume Hierarchie Quadtree/Octree BSP-Tree

Mehr

Parallele Algorithmen in der Bildverarbeitung

Parallele Algorithmen in der Bildverarbeitung Seminar über Algorithmen - SoSe 2009 Parallele Algorithmen in der Bildverarbeitung von Christopher Keiner 1 Allgemeines 1.1 Einleitung Parallele Algorithmen gewinnen immer stärker an Bedeutung. Es existieren

Mehr

Übung zur Vorlesung Algorithmische Geometrie

Übung zur Vorlesung Algorithmische Geometrie Übung zur Vorlesung Algorithmische Geometrie Dipl.-Math. Bastian Rieck Arbeitsgruppe Computergraphik und Visualisierung Interdisziplinäres Zentrum für Wissenschaftliches Rechnen 8. Mai 2012 B. Rieck (CoVis)

Mehr

Pflichtteilaufgaben zu Gegenseitige Lage, Abstand, Baden-Württemberg

Pflichtteilaufgaben zu Gegenseitige Lage, Abstand, Baden-Württemberg Pflichtteilaufgaben zu Gegenseitige Lage, Abstand, Baden-Württemberg Hilfsmittel: keine allgemeinbildende Gymnasien Alexander Schwarz wwwmathe-aufgabencom September 6 Abituraufgaben (Haupttermin) Aufgabe

Mehr

Vorkurs: Mathematik für Informatiker

Vorkurs: Mathematik für Informatiker Vorkurs: Mathematik für Informatiker Teil 4 Wintersemester 2017/18 Steven Köhler mathe@stevenkoehler.de mathe.stevenkoehler.de 2 c 2017 Steven Köhler Wintersemester 2017/18 Inhaltsverzeichnis Teil 1 Teil

Mehr

A Simple and Practical Method for Interactive Ray Tracing of Dynamic Scenes

A Simple and Practical Method for Interactive Ray Tracing of Dynamic Scenes A Simple and Practical Method for Interactive Ray Tracing of Dynamic Scenes Ingo Wald Carsten Benthin Philipp Slusallek Marco Lang Bisher Ray Tracing erstmals von Appel benutzt dutzende Algorithmen vor

Mehr

Dynamisches Huffman-Verfahren

Dynamisches Huffman-Verfahren Dynamisches Huffman-Verfahren - Adaptive Huffman Coding - von Michael Brückner 1. Einleitung 2. Der Huffman-Algorithmus 3. Übergang zu einem dynamischen Verfahren 4. Der FGK-Algorithmus 5. Überblick über

Mehr

Mathematik für das Ingenieurstudium

Mathematik für das Ingenieurstudium Mathematik für das Ingenieurstudium von Martin Stämpfle, Jürgen Koch 2., aktual. Aufl. Hanser München 2012 Verlag C.H. Beck im Internet: www.beck.de ISBN 978 3 446 43232 1 Zu Inhaltsverzeichnis schnell

Mehr

10.2 Linearkombinationen

10.2 Linearkombinationen 147 Vektorräume in R 3 Die Vektorräume in R 3 sind { } Geraden durch den Ursprung Ebenen durch den Ursprung R 3 Analog zu reellen Vektorräumen kann man komplexe Vektorräume definieren. In der Definition

Mehr

1 AVL-Bäume. 1.1 Aufgabentyp. 1.2 Überblick. 1.3 Grundidee

1 AVL-Bäume. 1.1 Aufgabentyp. 1.2 Überblick. 1.3 Grundidee AVL-Bäume. Aufgabentyp Fügen Sie in einen anfangs leeren AVL Baum die folgenden Schlüssel ein:... Wenden Sie hierbei konsequent den Einfüge /Balancierungsalgorithmus an und dokumentieren Sie die ausgeführten

Mehr

Prüfung WS 2006/07. Robotik

Prüfung WS 2006/07. Robotik Prüfung WS 26/7 Robotik Anmerkungen: Aufgabenblätter auf Vollständigkeit überprüfen Nur Blätter mit Namen und Matr.Nr. werden korrigiert. Keine rote Farbe verwenden. Zu jeder Lösung Aufgabennummer angeben.

Mehr

Testprüfung (Abitur 2013)

Testprüfung (Abitur 2013) Testprüfung (Abitur 2013) Steve Göring, stg7@gmx.de 3. April 2013 Bearbeitungszeit: Zugelassene Hilfsmittel: 270 Minuten Taschenrechner (nicht programmierbar, nicht grafikfähig), Tafelwerk Name: Punkte:

Mehr

Einführung. 1 Vektoren

Einführung. 1 Vektoren Einführung Die Vektorgeometrie beschreibt geometrische Sachverhalte in einer algebraischen Sprache. Sie gibt uns ein mathematisches Hilfsmittel in die Hand, mit welchem wir Geometrie nicht nur konstruktiv

Mehr

Algorithmische Geometrie 3. Schnitte von Liniensegmenten

Algorithmische Geometrie 3. Schnitte von Liniensegmenten Algorithmische Geometrie 3. Schnitte von Liniensegmenten JProf. Dr. Heike Leitte Computergraphik und Visualisierung Inhaltsverzeichnis 1. Einführung 2. Konvexe Hülle 3. Schnitte von Liniensegmenten 4.

Mehr

1 Fraktale Eigenschaften der Koch-Kurve

1 Fraktale Eigenschaften der Koch-Kurve Anhang Inhaltsverzeichnis Fraktale Eigenschaften der Koch-Kurve iii. Einführung.................................. iii.2 Defintion.................................... iii.3 Gesamtlänge der Koch-Kurve........................

Mehr

SCHRIFTLICHE ABITURPRÜFUNG 2006 Mathematik (Grundkursniveau) Arbeitszeit: 210 Minuten

SCHRIFTLICHE ABITURPRÜFUNG 2006 Mathematik (Grundkursniveau) Arbeitszeit: 210 Minuten Mathematik (Grundkursniveau) Arbeitszeit: 210 Minuten Es sind die drei Pflichtaufgaben und eine Wahlpflichtaufgabe zu lösen. Der Prüfling entscheidet sich für eine Wahlpflichtaufgabe. Die zur Bewertung

Mehr

2.2 Kollineare und koplanare Vektoren

2.2 Kollineare und koplanare Vektoren . Kollineare und koplanare Vektoren Wie wir schon gelernt haben, können wir einen Vektor durch Multiplikation mit einem Skalar verlängern oder verkürzen. In Abbildung 9 haben u und v die gleiche Richtung,

Mehr

P 0 f (0) schneidet die Gerade mit der Gleichung x Ermitteln Sie die Koordinaten von S.

P 0 f (0) schneidet die Gerade mit der Gleichung x Ermitteln Sie die Koordinaten von S. Zentralabitur 015 im Fach Mathematik Analysis 1 Im nebenstehenden Bild sind die Graphen dreier Funktionen f, g und h dargestellt Geben Sie an, bei welcher der drei Funktionen es sich um eine Stammfunktion

Mehr

Grundsätzliches Produkte Anwendungen in der Geometrie. Vektorrechnung. Fakultät Grundlagen. Juli 2015

Grundsätzliches Produkte Anwendungen in der Geometrie. Vektorrechnung. Fakultät Grundlagen. Juli 2015 Vektorrechnung Fakultät Grundlagen Juli 205 Fakultät Grundlagen Vektorrechnung Übersicht Grundsätzliches Grundsätzliches Vektorbegriff Algebraisierung der Vektorrechnung Betrag 2 Skalarprodukt Vektorprodukt

Mehr

Analytische Geometrie I

Analytische Geometrie I Analytische Geometrie I Rainer Hauser Januar 202 Einleitung. Geometrie und Algebra Geometrie und Algebra sind historisch zwei unabhängige Teilgebiete der Mathematik und werden bis heute von Laien weitgehend

Mehr

Grundwissen Abitur Geometrie 15. Juli 2012

Grundwissen Abitur Geometrie 15. Juli 2012 Grundwissen Abitur Geometrie 5. Juli 202. Erkläre die Begriffe (a) parallelgleiche Pfeile (b) Vektor (c) Repräsentant eines Vektors (d) Gegenvektor eines Vektors (e) Welcher geometrische Zusammenhang besteht

Mehr

Mathematische Grundlagen für die Vorlesung. Differentialgeometrie

Mathematische Grundlagen für die Vorlesung. Differentialgeometrie Mathematische Grundlagen für die Vorlesung Differentialgeometrie Dr. Gabriele Link 13.10.2010 In diesem Text sammeln wir die nötigen mathematischen Grundlagen, die wir in der Vorlesung Differentialgeometrie

Mehr

Analytische Geometrie Spatprodukt

Analytische Geometrie Spatprodukt Analytische Geometrie Spatprodukt David Schmid, Reto Da Forno Kantonsschule Schüpfheim Januar 2005 Analytische Geometrie: Das Spatprodukt 1 Das Spatprodukt Hinweis: Die Vektoren werden aus darstellungstechnischen

Mehr

Vektorrechnung Raumgeometrie

Vektorrechnung Raumgeometrie Vektorrechnung Raumgeometrie Sofja Kowalewskaja (*1850, 1891) Hypatia of Alexandria (ca. *360, 415) Maria Gaetana Agnesi (*1718, 1799) Emmy Noether (*1882 1935) Émilie du Châtelet (*1706, 1749) Cathleen

Mehr

Vektorgeometrie. 1. Vektoren eingeben, Norm, Skalarprodukt. 2 In einem kartesischen Koordinatensystem sind die Vektoren. , v. und. gegeben.

Vektorgeometrie. 1. Vektoren eingeben, Norm, Skalarprodukt. 2 In einem kartesischen Koordinatensystem sind die Vektoren. , v. und. gegeben. Vektorgeometrie 1. Vektoren eingeben, Norm, Skalarprodukt 2 In einem kartesischen Koordinatensystem sind die Vektoren u 14, 5 11 10 v 2 und w 5 gegeben. 10 10 a) Zeigen Sie, dass die Vektoren einen Würfel

Mehr

Vektoralgebra Anwendungen der Vektorrechnung VEKTORRECHNUNG. Prof. Dr. Dan Eugen Ulmet. Hochschule Esslingen 1/64

Vektoralgebra Anwendungen der Vektorrechnung VEKTORRECHNUNG. Prof. Dr. Dan Eugen Ulmet. Hochschule Esslingen 1/64 1/64 VEKTORRECHNUNG Prof. Dr. Dan Eugen Ulmet Hochschule Esslingen März 2011 2/64 Overview Vektoralgebra 1 Vektoralgebra 2 Was sind Vektoren? 3/64 Vektoren werden geometrisch definiert als Pfeilklassen:

Mehr

Conservative Volumetric Visibility with Occluder Fusion

Conservative Volumetric Visibility with Occluder Fusion Conservative Volumetric Visibility with Occluder Fusion Worum geht es? Ausgangspunkt komplexe Szene, wie Städte, Straßenzüge, etc. Ziel effiziente Berechnung von nicht sichtbaren Regionen Begriffe / Definitionen

Mehr

Wertebereich und Genauigkeit der Zahlendarstellung

Wertebereich und Genauigkeit der Zahlendarstellung Wertebereich und Genauigkeit der Zahlendarstellung Sowohl F als auch C kennen bei ganzen und Floating Point-Zahlen Datentypen verschiedener Genauigkeit. Bei ganzen Zahlen, die stets exakt dargestellt werden

Mehr

Wima-Praktikum 2: Bildsynthese-Phong

Wima-Praktikum 2: Bildsynthese-Phong Wima-Praktikum 2: Bildsynthese-Phong Wima-Praktikum 2: Prof. Dr. Lebiedz, M. Sc. Radic 1 Inhaltsverzeichnis 1 Einleitung 3 2 Kurze Beschreibung der Aufgabenstellung und dem Phong- Modell 3 3 Modellierung

Mehr

2 Darstellung von Zahlen und Zeichen

2 Darstellung von Zahlen und Zeichen 2.1 Analoge und digitale Darstellung von Werten 79 2 Darstellung von Zahlen und Zeichen Computer- bzw. Prozessorsysteme führen Transformationen durch, die Eingaben X auf Ausgaben Y abbilden, d.h. Y = f

Mehr

Kreis - Tangente. 2. Vorbemerkung: Satz des Thales Eine Möglichkeit zur Bestimmung der Tangente benutzt den Satz des Thales.

Kreis - Tangente. 2. Vorbemerkung: Satz des Thales Eine Möglichkeit zur Bestimmung der Tangente benutzt den Satz des Thales. Kreis - Tangente 1. Allgemeines 2. Satz des Thales 3. Tangente an einem Punkt auf dem Kreis 4. Tangente über Analysis (an einem Punkt eines Ursprungkreises) 5. Tangente von einem Punkt (Pol) an den Kreis

Mehr

Lineare Algebra: Theorie und Anwendungen

Lineare Algebra: Theorie und Anwendungen Lineare Algebra: Theorie und Anwendungen Sommersemester 2012 Bernhard Burgeth Universität des Saarlandes c 2010 2012, Bernhard Burgeth 1 VEKTOREN IN DER EBENE UND IM RAUM 2 1 Vektoren in der Ebene und

Mehr

2.4 Stoßprozesse. entweder nicht interessiert o- der keine Möglichkeit hat, sie zu untersuchen oder zu beeinflussen.

2.4 Stoßprozesse. entweder nicht interessiert o- der keine Möglichkeit hat, sie zu untersuchen oder zu beeinflussen. - 52-2.4 Stoßprozesse 2.4.1 Definition und Motivation Unter einem Stoß versteht man eine zeitlich begrenzte Wechselwirkung zwischen zwei oder mehr Systemen, wobei man sich für die Einzelheiten der Wechselwirkung

Mehr

Theoretische Physik 1, Mechanik

Theoretische Physik 1, Mechanik Theoretische Physik 1, Mechanik Harald Friedrich, Technische Universität München Sommersemester 2009 Mathematische Ergänzungen Vektoren und Tensoren Partielle Ableitungen, Nabla-Operator Physikalische

Mehr

Was bisher geschah. 1. Zerlegung in monotone Polygone 2. Triangulierung der monotonen Teilpolygone

Was bisher geschah. 1. Zerlegung in monotone Polygone 2. Triangulierung der monotonen Teilpolygone Was bisher geschah Motivation, Beispiele geometrische Objekte im R 2 : Punkt, Gerade, Halbebene, Strecke, Polygon, ebene Zerlegung in Regionen (planare Graphen) maschinelle Repräsentation geometrischer

Mehr

3.6 Einführung in die Vektorrechnung

3.6 Einführung in die Vektorrechnung 3.6 Einführung in die Vektorrechnung Inhaltsverzeichnis Definition des Vektors 2 2 Skalare Multiplikation und Kehrvektor 4 3 Addition und Subtraktion von Vektoren 5 3. Addition von zwei Vektoren..................................

Mehr

Anwendungsbeispiel Strahlensatz

Anwendungsbeispiel Strahlensatz Anwendungsbeispiel Strahlensatz L5 Das berühmteste Beispiel der Proportionalität ist der Strahlensatz aus der Geometrie (siehe dazu auch Geometrie). Hier noch einmal die Hauptsätze des Strahlensatzes:

Mehr

Rechnen mit Vektoren. 1. Vektoren im Koordinatensystem Freie Vektoren in der Ebene

Rechnen mit Vektoren. 1. Vektoren im Koordinatensystem Freie Vektoren in der Ebene Rechnen mit 1. im Koordinatensystem 1.1. Freie in der Ebene 1) Definition Ein Vektor... Zwei sind gleich, wenn... 2) Das ebene Koordinatensystem Wir legen den Koordinatenursprung fest, ferner zwei zueinander

Mehr

Lehrskript Mathematik Q12 Analytische Geometrie

Lehrskript Mathematik Q12 Analytische Geometrie Lehrskript Mathematik Q1 Analytische Geometrie Repetitorium der analytischen Geometrie Eine Zusammenfassung der analytischen Geometrie an bayerischen Gymnasien von Markus Baur, StR Werdenfels-Gymnasium

Mehr

2. Vorlesung Wintersemester

2. Vorlesung Wintersemester 2. Vorlesung Wintersemester 1 Mechanik von Punktteilchen Ein Punktteilchen ist eine Abstraktion. In der Natur gibt es zwar Elementarteilchen (Elektronen, Neutrinos, usw.), von denen bisher keine Ausdehnung

Mehr

VEKTOREN. Allgemeines. Vektoren in der Ebene (2D)

VEKTOREN. Allgemeines. Vektoren in der Ebene (2D) VEKTOREN Allgemeines Man unterscheidet im Schulgebrauch zwischen zweidimensionalen und dreidimensionalen Vektoren (es kann aber auch Vektoren geben, die mehr als 3 Komponenten haben). Während zweidimensionale

Mehr

A2.3 Lineare Gleichungssysteme

A2.3 Lineare Gleichungssysteme A2.3 Lineare Gleichungssysteme Schnittpunkte von Graphen Bereits weiter oben wurden die Schnittpunkte von Funktionsgraphen mit den Koordinatenachsen besprochen. Wenn sich zwei Geraden schneiden, dann müssen

Mehr

entspricht der Länge des Vektorpfeils. Im R 2 : x =

entspricht der Länge des Vektorpfeils. Im R 2 : x = Norm (oder Betrag) eines Vektors im R n entspricht der Länge des Vektorpfeils. ( ) Im R : x = x = x + x nach Pythagoras. Allgemein im R n : x x = x + x +... + x n. Beispiele ( ) =, ( 4 ) = 5, =, 4 = 0.

Mehr

Analytische Geometrie II

Analytische Geometrie II Analytische Geometrie II Rainer Hauser März 212 1 Einleitung 1.1 Geradengleichungen in Parameterform Jede Gerade g in der Ebene oder im Raum lässt sich durch einen festen Punkt auf g, dessen Ortsvektor

Mehr

a) Bestimmen Sie rechnerisch die Koordinaten und die Art der Extrempunkte von G. Betrachtet wird die Gleichung

a) Bestimmen Sie rechnerisch die Koordinaten und die Art der Extrempunkte von G. Betrachtet wird die Gleichung Analysis Aufgabe 1.1 Gegeben ist die Funktion f mit 1 3 2 f x x 4 3x 9x 5 und G f Definitionsmenge IR. Die Abbildung zeigt den Graphen von f. a) Bestimmen Sie rechnerisch die Koordinaten und die Art der

Mehr

Das isoperimetrische Problem

Das isoperimetrische Problem Das isoperimetrische Problem Thomas Peters Thomas Mathe-Seiten www.mathe-seiten.de 18. Oktober 3 Das isoperimetrische Problem, auch bekannt als das Problem der Dido, ist es, unter allen geschlossenen ebenen

Mehr

Geometrie 1. Roman Sommer. Informatik 2 Programmiersysteme Martensstraße Erlangen

Geometrie 1. Roman Sommer. Informatik 2 Programmiersysteme Martensstraße Erlangen Geometrie 1 Roman Sommer Informatik 2 Programmiersysteme Martensstraße 3 91058 Erlangen Grundlagen Punkte, Vektoren Schreibweise: Skalar: Vektor: Komponente: Punkt: (spitzer) Winkel zw. zwei Vektoren:

Mehr

Geometrische Algorithmen Einige einfache Definitionen: Ist ein Punkt in einem Polygon? Punkt-in-Polygon-Problem. Das Punkt-in-Polygon-Problem

Geometrische Algorithmen Einige einfache Definitionen: Ist ein Punkt in einem Polygon? Punkt-in-Polygon-Problem. Das Punkt-in-Polygon-Problem Geometrische Algorithmen Einige einfache Definitionen: Punkt: im n-dimensionalen Raum ist ein n-tupel (n Koordinaten) Gerade: definiert durch zwei beliebige Punkte auf ihr Strecke: definiert durch ihre

Mehr

Grundlagen der Vektorrechnung

Grundlagen der Vektorrechnung Grundlagen der Vektorrechnung Ein Vektor a ist eine geordnete Liste von n Zahlen Die Anzahl n dieser Zahlen wird als Dimension des Vektors bezeichnet Schreibweise: a a a R n Normale Reelle Zahlen nennt

Mehr

5 Lineare Algebra (Teil 3): Skalarprodukt

5 Lineare Algebra (Teil 3): Skalarprodukt 5 Lineare Algebra (Teil 3): Skalarprodukt Der Begriff der linearen Abhängigkeit ermöglicht die Definition, wann zwei Vektoren parallel sind und wann drei Vektoren in einer Ebene liegen. Daß aber reale

Mehr

Gundlagen Klasse 5/6 Geometrie. nach oben. Inhaltsverzeichnis

Gundlagen Klasse 5/6 Geometrie. nach oben. Inhaltsverzeichnis Inhaltsverzeichnis Grundbegriffe der Geometrie Geometrische Abbildungen Das Koordinatensystem Schnittpunkt von Geraden Symmetrien Orthogonale Geraden Abstände Parallele Geraden Vierecke Diagonalen in Vielecken

Mehr

2.3.4 Drehungen in drei Dimensionen

2.3.4 Drehungen in drei Dimensionen 2.3.4 Drehungen in drei Dimensionen Wir verallgemeinern die bisherigen Betrachtungen nun auf den dreidimensionalen Fall. Für Drehungen des Koordinatensystems um die Koordinatenachsen ergibt sich 1 x 1

Mehr

Vektorrechnung. 10. August Inhaltsverzeichnis. 1 Vektoren 2. 2 Grundlegende Rechenoperationen mit Vektoren 3. 3 Geometrie der Vektoren 5

Vektorrechnung. 10. August Inhaltsverzeichnis. 1 Vektoren 2. 2 Grundlegende Rechenoperationen mit Vektoren 3. 3 Geometrie der Vektoren 5 Vektorrechnung 0. August 07 Inhaltsverzeichnis Vektoren Grundlegende Rechenoperationen mit Vektoren 3 3 Geometrie der Vektoren 5 4 Das Kreuzprodukt 9 Vektoren Die reellen Zahlen R können wir uns als eine

Mehr

9 Minimum Spanning Trees

9 Minimum Spanning Trees Im Folgenden wollen wir uns genauer mit dem Minimum Spanning Tree -Problem auseinandersetzen. 9.1 MST-Problem Gegeben ein ungerichteter Graph G = (V,E) und eine Gewichtsfunktion w w : E R Man berechne

Mehr

Mögliche Lösung. Ebenen im Haus

Mögliche Lösung. Ebenen im Haus Lineare Algebra und Analytische Geometrie XX Ebenen im Raum Ebenen im Haus Ermitteln Sie die Koordinaten aller bezeichneten Punkte. Erstellen Sie für die Dachflächen E und E jeweils eine Ebenengleichung

Mehr

13. Klasse TOP 10 Grundwissen 13 Geradengleichungen 01

13. Klasse TOP 10 Grundwissen 13 Geradengleichungen 01 . Klasse TOP 0 Grundwissen Geradengleichungen 0 Punkt-Richtungs-Form Geraden sind gegeben durch einen Aufpunkt A (mit Ortsvektor a) auf der Geraden und einen Richtungsvektor u: x = a + λ u, λ IR. (Interpretation:

Mehr

Vektoren. Kapitel 3. 3.1 Skalare, Vektoren, Tensoren. 3.2 Vektoren

Vektoren. Kapitel 3. 3.1 Skalare, Vektoren, Tensoren. 3.2 Vektoren Kapitel 3 Vektoren 31 Skalare, Vektoren, Tensoren Viele physikalische Größen lassen sich bei bekannter Maßeinheit durch Angabe ihres Betrages als reelle Zahl vollständig angeben Solche Größen nennt man

Mehr

Oktaeder. Bernhard Möller. 22. Dezember 2010

Oktaeder. Bernhard Möller. 22. Dezember 2010 Oktaeder Bernhard Möller. Dezember 00 Ein Oktaeder ist ein regelmäßiges Polyeder, dessen Oberfläche aus acht kongruenten, gleichseitigen Dreiecken besteht. Jedes Oktaeder kann einem Würfel so einbeschrieben

Mehr

Algorithmen und Komplexität

Algorithmen und Komplexität Algorithmen und Komplexität Dynamische Programmierung Markus Ullrich Norbert Baum Fachbereich Informatik - IIb07 Hochschule Zittau/Görlitz 28. Mai 2009 1 / 29 Wie sieht es mit langen Ketten aus? A 1 A

Mehr

SCHRIFTLICHE ABITURPRÜFUNG Mathematik (Grundkursniveau) Arbeitszeit: 210 Minuten

SCHRIFTLICHE ABITURPRÜFUNG Mathematik (Grundkursniveau) Arbeitszeit: 210 Minuten Mathematik (Grundkursniveau) Arbeitszeit: 10 Minuten Es sind die drei Pflichtaufgaben und eine Wahlpflichtaufgabe zu lösen. Der Prüfling entscheidet sich für eine Wahlpflichtaufgabe. Die zur Bewertung

Mehr

Das Wichtigste auf einen Blick

Das Wichtigste auf einen Blick Das Wichtigste auf einen Blick Zusammenfassung Geometrie.Parameterform einer Geraden Eine Gerade ist wie auch in der Analysis durch zwei Punkte A, B im Raum eindeutig bestimmt einer der beiden Punkte,

Mehr

1 Krummlinige Koordinatensysteme

1 Krummlinige Koordinatensysteme 1 Krummlinige Koordinatensysteme 1.1 Ebene Polarkoordinaten Ebene Polarkoordinaten sind für zweidimensionale rotationssymmetrische Probleme geeignet. Die Länge der gedachten Verbindungslinie eines Punktes

Mehr

Geometrie. Bei der Addition von Vektoren erhält man einen Repräsentanten des Summenvektors +, indem man die Repräsentanten von aneinanderfügt:

Geometrie. Bei der Addition von Vektoren erhält man einen Repräsentanten des Summenvektors +, indem man die Repräsentanten von aneinanderfügt: Geometrie 1. Vektoren Die Menge aller zueinander parallelen, gleich langen und gleich gerichteten Pfeile werden als Vektor bezeichnet. Jeder einzelne Pfeil heißt Repräsentant des Vektors. Bei Ortsvektoren:

Mehr

Den Mittelpunkt zwischen zwei Punkten kannst du mithilfe der Ortsvektoren und Verbindungsvektoren berechnen.

Den Mittelpunkt zwischen zwei Punkten kannst du mithilfe der Ortsvektoren und Verbindungsvektoren berechnen. Wahlteil B2 Mathe > Abitur (GTR) > 2016 > Wahlteil B2 Aufgaben PLUS Tipps PLUS Lösungen TI PLUS Lösungen Casio PLUS Aufgabe 2.1. a) Darstellung der Pyramide der Schnittfläche im Koordinatensystem Der Aufgabenstellung

Mehr

(7) Normal Mapping. Vorlesung Computergraphik II S. Müller. Dank an Stefan Rilling U N I V E R S I T Ä T KOBLENZ LANDAU

(7) Normal Mapping. Vorlesung Computergraphik II S. Müller. Dank an Stefan Rilling U N I V E R S I T Ä T KOBLENZ LANDAU (7) Normal Mapping Vorlesung Computergraphik II S. Müller Dank an Stefan Rilling Einleitung Die Welt ist voller Details Viele Details treten in Form von Oberflächendetails auf S. Müller - 3 - Darstellung

Mehr

Grundlagen zur Delaunay-Triangulierung und zur konvexen Hülle. zum Begriff des Voronoi-Diagramms (vgl. auch Vorlesung "Algorithmische Geometrie"):

Grundlagen zur Delaunay-Triangulierung und zur konvexen Hülle. zum Begriff des Voronoi-Diagramms (vgl. auch Vorlesung Algorithmische Geometrie): Grundlagen zur Delaunay-Triangulierung und zur konvexen Hülle zum Begriff des Voronoi-Diagramms (vgl. auch Vorlesung "Algorithmische Geometrie"): 1 Erzeugung des Voronoi-Diagramms (siehe Vorlesung "Algorithmische

Mehr

Vorlesung Datenstrukturen

Vorlesung Datenstrukturen Vorlesung Datenstrukturen Graphen (1) Darstellung Traversierung Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 441 Generalisierung von Bäumen Verallgemeinerung (von Listen zu Graphen)

Mehr

Fehlgeschlagene Versuche zur Erklärung von Expansion des Universums und Urknall. Zchg. (a) Zchg. (b) Zchg. (c) Zchg. (d)

Fehlgeschlagene Versuche zur Erklärung von Expansion des Universums und Urknall. Zchg. (a) Zchg. (b) Zchg. (c) Zchg. (d) Fehlgeschlagene Versuche zur Erklärung von Expansion des Universums und Urknall Grundlage : Simon Singh in "Big Bang" Abb. 67 / S.265 siehe Anhang Hubbles Beobachtungen ließen den Schluss zu, dass das

Mehr

Projektion. Ebene geometrische Projektionen

Projektion. Ebene geometrische Projektionen Projektion - 1 - Ebene geometrische Projektionen Die ebenen geometrischen Projektionen sind dadurch charakterisiert, daß mit Projektionsstrahlen konstanter Richtung, d.h. entlang von Geraden, auf Ebenen

Mehr

1.1. Geradengleichung aus Steigung und y-achsenabschnitt

1.1. Geradengleichung aus Steigung und y-achsenabschnitt Version vom 4. Januar 2007 Gleichungen von Geraden in der Ebene 1999 Peter Senn * 1.1. Geradengleichung aus Steigung und y-achsenabschnitt In dieser Form lautet die Gleichung der Geraden wie folgt: g:

Mehr

9 Lineare Gleichungssysteme

9 Lineare Gleichungssysteme 9 Lineare Gleichungssysteme Eine der häufigsten mathematischen Aufgaben ist die Lösung linearer Gleichungssysteme In diesem Abschnitt beschäftigen wir uns zunächst mit Lösbarkeitsbedingungen und mit der

Mehr

Einführung in die Informatik I

Einführung in die Informatik I Einführung in die Informatik I Einige wichtige Datenstrukturen: Vektor, Matrix, Liste, Stapelspeicher, Warteschlange Prof. Dr. Nikolaus Wulff Datenstruktur / Datentyp Programme benötigen nicht nur effiziente

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 21 Einstieg in die Informatik mit Java Felder, eindimensional Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 21 1 Überblick: Was sind Felder? 2 Vereinbarung von Feldern

Mehr

ad Physik A VL2 (11.10.2012)

ad Physik A VL2 (11.10.2012) ad Physik A VL2 (11.10.2012) korrigierte Varianz: oder: korrigierte Stichproben- Varianz n 2 2 2 ( x) ( xi ) n 1 i1 1 n 1 n i1 1 Begründung für den Vorfaktor : n 1 Der Mittelwert der Grundgesamtheit (=

Mehr

2.4. Triangulierung von Polygonen

2.4. Triangulierung von Polygonen Als drittes Problem haben wir in Kapitel 1 die Triangulierung von Polygonen identifiziert, die etwa bei der Überwachung eines Museums durch Kameras auftritt. F70 F71 Definition und Theorie: Definition

Mehr

Vektoren, Vektorräume

Vektoren, Vektorräume Vektoren, Vektorräume Roman Wienands Sommersemester 2010 Mathematisches Institut der Universität zu Köln Roman Wienands (Universität zu Köln) Mathematik II für Studierende der Chemie Sommersemester 2010

Mehr

Übungsaufgaben Geometrie und lineare Algebra - Serie 1

Übungsaufgaben Geometrie und lineare Algebra - Serie 1 Übungsaufgaben Geometrie und lineare Algebra - Serie. Bei einer geraden Pyramide mit einer quadratischen Grundfläche von 00 cm beträgt die Seitenkante 3 cm. a) Welche Höhe hat die Pyramide? b) Wie groß

Mehr

Wahlteil Geometrie/Stochastik B 1

Wahlteil Geometrie/Stochastik B 1 Abitur Mathematik: Wahlteil Geometrie/Stochastik B 1 Baden-Württemberg 214 Aufgabe B 1.1 a) 1. SCHRITT: SKIZZE ANFERTIGEN Die Lage der Pyramide im Koordinatensystem ist wie folgt: 2. KOORDINATENGLEICHUNG

Mehr

Einführung Vektoralgebra VEKTORRECHNUNG. Prof. Dr. Dan Eugen Ulmet. Hochschule Esslingen. October 6, 2007

Einführung Vektoralgebra VEKTORRECHNUNG. Prof. Dr. Dan Eugen Ulmet. Hochschule Esslingen. October 6, 2007 Hochschule Esslingen October 6, 2007 Overview Einführung 1 Einführung 2 Was sind Vektoren? Vektoren werden geometrisch definiert als Pfeilklassen: Strecken mit gleichem Betrag, gleicher Richtung und Orientierung.

Mehr

5 BINÄRE ENTSCHEIDUNGS- DIAGRAMME (BDDS)

5 BINÄRE ENTSCHEIDUNGS- DIAGRAMME (BDDS) 5 BINÄRE ENTSCHEIDUNGS- DIAGRAMME (BDDS) Sommersemester 2009 Dr. Carsten Sinz, Universität Karlsruhe Datenstruktur BDD 2 1986 von R. Bryant vorgeschlagen zur Darstellung von aussagenlogischen Formeln (genauer:

Mehr

Computergrafik Sommersemester 2004 Übungen

Computergrafik Sommersemester 2004 Übungen Sommersemester 4 Freiwillige Zusatzübung Aufgabe 6: Transformationen im zweidimensionalen aum Berechnen Sie die Transformationsmatri, die eine Szene zuerst um 3 Grad um den Ursprung dreht und anschließend

Mehr

Terme und Gleichungen

Terme und Gleichungen Terme und Gleichungen Rainer Hauser November 00 Terme. Rekursive Definition der Terme Welche Objekte Terme genannt werden, wird rekursiv definiert. Die rekursive Definition legt zuerst als Basis fest,

Mehr

Symmetrie von Naturgesetzen - Galilei-Transformationen und die Invarianz der Newton schen Gesetze

Symmetrie von Naturgesetzen - Galilei-Transformationen und die Invarianz der Newton schen Gesetze Symmetrie von Naturgesetzen - Galilei-Transformationen und die Invarianz der Newton schen Gesetze Symmetrie (Physik) (aus Wikipedia, der freien Enzyklopädie) Symmetrie ist ein grundlegendes Konzept der

Mehr

Featurebasierte 3D Modellierung

Featurebasierte 3D Modellierung 1 Featurebasierte 3D Modellierung Moderne 3D arbeiten häufig mit einer Feature Modellierung. Hierbei gibt es eine Reihe von vordefinierten Konstruktionen, die der Reihe nach angewandt werden. Diese Basis

Mehr

1 Körper. Wir definieren nun, was wir unter einem Körper verstehen, und sehen dann, dass es noch andere, ganz kleine Körper gibt:

1 Körper. Wir definieren nun, was wir unter einem Körper verstehen, und sehen dann, dass es noch andere, ganz kleine Körper gibt: 1 Körper Sie kennen bereits 2 Beispiele von Zahlkörpern: (Q, +, ) (R, +, ) die rationalen Zahlen mit ihrer Addition und Multiplikation die reellen Zahlen mit ihrer Addition und Multiplikation Vielleicht

Mehr

Lernunterlagen Vektoren in R 2

Lernunterlagen Vektoren in R 2 Die Menge aller reellen Zahlen wird mit R bezeichnet, die Menge aller Paare a 1 a 2 reeller Zahlen wird mit R 2 bezeichnet. Definition der Menge R 2 : R 2 { a 1 a 2 a 1, a 2 R} Ein Zahlenpaar a 1 a 2 bezeichnet

Mehr

ABITURPRÜFUNG 2002 GRUNDFACH MATHEMATIK (HAUPTTERMIN)

ABITURPRÜFUNG 2002 GRUNDFACH MATHEMATIK (HAUPTTERMIN) ABITURPRÜFUNG 00 GRUNDFACH MATHEMATIK (HAUPTTERMIN) Arbeitszeit: Hilfsmittel: 10 Minuten Taschenrechner (nicht programmierbar, nicht grafikfähig) Tafelwerk Der Prüfungsteilnehmer wählt von den Aufgaben

Mehr

Mathematische Grundlagen der dynamischen Simulation

Mathematische Grundlagen der dynamischen Simulation Mathematische Grundlagen der dynamischen Simulation Dynamische Systeme sind Systeme, die sich verändern. Es geht dabei um eine zeitliche Entwicklung und wie immer in der Informatik betrachten wir dabei

Mehr

Lernmaterialblatt Mathematik. Vektorrechnung eine Einführung. Anwendung Mathematik I. Einleitung:

Lernmaterialblatt Mathematik. Vektorrechnung eine Einführung. Anwendung Mathematik I. Einleitung: Vektorrechnung eine Einführung Einleitung: Um beispielsweise das Dreieck ABC in der Abbildung an die Position A'B'C' zu verschieben, muss jeder Punkt um sieben Einheiten nach rechts und drei nach oben

Mehr

Vektoren - Basiswechsel

Vektoren - Basiswechsel Vektoren - Basiswechsel Grundprinzip Für rein geometrische Anwendungen verwendet man üblicherweise die Standardbasis. Damit ergibt sich in den Zahlenangaben der Koordinaten kein Unterschied zu einem Bezug

Mehr

3 Vektoren. 3.1 Kartesische Koordinaten in Ebene und Raum. Höhere Mathematik 60

3 Vektoren. 3.1 Kartesische Koordinaten in Ebene und Raum. Höhere Mathematik 60 Kartesische Koordinaten in Ebene und Raum 3 Vektoren 3.1 Kartesische Koordinaten in Ebene und Raum In der Ebene (mathematisch ist dies die Menge R 2 ) ist ein kartesisches Koordinatensystem festgelegt

Mehr

Darstellung dreidimensionaler Figuren in der Ebene. Schrägbild

Darstellung dreidimensionaler Figuren in der Ebene. Schrägbild Mathematik Bl Darstellung dreidimensionaler Figuren in der Ebene Schrägbild Das Bild bei einer schrägen Parallelprojektion heisst Schrägbild und wird durch folgende Merkmale bestimmt: - Zur Zeichenebene

Mehr