Title: Kollisionserkennung
1Kollisionserkennung
- Eine Präsentation für das Proseminar
- Game Design
- von
- Florian Liegsalz
- am 04.12.07
2Überblick
- Kollisionserkennung Was ist das und wofür
brauche ich es? - Was muss ich bei der Kollisionserkennung
beachten? - Welche Methoden der Kollisionserkennung gibt es?
- Ausblick
04.11.07 Florian Liegsalz
Überblick
2
3Collision Detection Was ist das und wofür
brauche ich es?
Grundlagen
- Bei der Kollisionserkennung geht es darum
herauszufinden, wann und wo 2 oder mehr Objekt
sich berühren oder überschneiden. - Kollisionserkennung wird in vielen Bereichen
benötigt. Dazu zählen - Entwicklung von beweglichen Maschinen
- Autocrashtests
- Robotik
- Realitätssimulationen
- Computerspiele
04.11.07 Florian Liegsalz
3
4Collision Detection Was ist das und wofür
brauche ich es?
3 Phasen
- Kollisionserkennung findet in 3 Phasen statt
- 1.Phase Ausschließung von Objekten, die nicht
kollidieren können - 2.Phase Überprüfung der möglichen Kollisionen
der Restobjekte - 3.Phase Ausführung genauer Schnitttests mit
spezifischen Methoden
04.11.07 Florian Liegsalz
4
5Überblick
- Kollisionserkennung Was ist das und wofür
brauche ich es? - Was muss ich bei der Kollisionserkennung
beachten? - Welche Methoden der Kollisionserkennung gibt es?
- Ausblick
04.11.07 Florian Liegsalz
Überblick
5
6Was muss ich bei der Kollisionserkennung
beachten? Teil 1
Ein einfaches Modell
Eigentlich ist Kollisionserkennung ganz einfach,
oder
c Kollisionsobjekt colObs new
Kollisionsobjektn foreach (Kollisionsobjekt o
in colObs) o.move() foreach
(Kollisionsobjekt p in colObs) if (o!p)
o.checkForCollision(p) /c
- Welche Probleme treten auf?
- Offensichtlich Laufzeit O(n²)
- Wie implementiere ich eigentlich
checkForCollision? Also wie finde ich heraus,
ob 2 Objekte kollidieren?Und was mache ich dann
mit Ihnen?
04.11.07 Florian Liegsalz
6
7Was muss ich bei der Kollisionserkennung
beachten? Teil 2
Noch mehr Einfaches
Geht man wie in meinem Beispiel von Kugeln aus,
ist das ganze relativ einfach
c public override FloatPoint
checkForColBall(ColOb ob) float dX
pos.X - ob.pos.X float dY pos.Y
- ob.pos.Y float l
(float)Math.Sqrt(dX dX dY dY)
if (l lt this.radius ob.radius)
dir.X 0 dir.Y 0 ob.dir.X
0 ob.dir.Y 0 return pos
return null /c
- Welche Probleme treten auf?
- Was passiert, wenn unser Objekt zu schnell ist?
- Was tun, wenn unser Objekt nicht rund ist?
04.11.07 Florian Liegsalz
7
8Was muss ich bei der Kollisionserkennung
beachten? Zusammenfassung
Zwischenergebnisse
- Eine Laufzeit von O(n²) ist definitiv
unerwünscht. - bessere Speichermöglichkeit finden und
Ausschlussverfahren entwickeln - Wenn Elemente zu schnell sind, können sie sich
überspringen. - Wir bilden aus unseren Objekten ein
Vergleichsobjekt. Aber wie? - Unrunde Elemente führen zu Lücken, wenn man über
den Mittelpunkt und den Radius abfragt. - Wir suchen uns genauere Abfragemethoden
04.11.07 Florian Liegsalz
8
9Überblick
- Kollisionserkennung Was ist das und wofür
brauche ich es? - Was muss ich bei der Kollisionserkennung
beachten? - Welche Methoden der Kollisionserkennung gibt es?
- Ausblick
04.11.07 Florian Liegsalz
Überblick
9
10Welche Methoden der Kollisionserkennung gibt es?
Teil 1
Das Prinzip der Bounding Boxes
- Wie wir gesehen haben, sind runde Bounding
Boxes nicht sehr praktikabel, da der Orbit um
ein Objekt sehr schnell zu groß wird. - Daher werden normalerweise Rechtecke als
Bounding Box verwendet. - Davon gibt es im wesentlichen 3 Arten
- AABB axis aligned bounding boxes
- OBB oriented bounding boxes
- k-DOP k-Discrete Oriented Polytop
04.11.07 Florian Liegsalz
10
11Welche Methoden der Kollisionserkennung gibt es?
Teil 2
Die 3 Modelle
04.11.07 Florian Liegsalz
11
12Welche Methoden der Kollisionserkennung gibt es?
Teil 3
04.11.07 Florian Liegsalz
12
13Welche Methoden der Kollisionserkennung gibt es?
Teil 4
Kollisionsverfeinerung
Dies ist ein Quadtree, da wir im 2D-Raum sind.
Im 3-dimensionalen hätten wir einen Octree.
04.11.07 Florian Liegsalz
13
14Welche Methoden der Kollisionserkennung gibt es?
Teil 5
Kollisionsausschluss
- Ein weiterer wichtiger Bestandteil der
Kollisionserkunnungsabteilung ist die Minimierung
der nötigen Vergleiche . - Dafür gibt es wiederum verschiedene Verfahren.
- Bessere Speichermöglichkeiten finden als ein
Array. - Ausschlusskriterien festlegen, z.B.
- Objekte klassifizieren in statisch und dynamisch
- Regeln festlegen, wie Projektile kollidieren
nicht
04.11.07 Florian Liegsalz
14
15Welche Methoden der Kollisionserkennung gibt es?
Speicherung
Speicherung
- Für die Speicherung gibt es wiederum verschiedene
Vor-gehensweißen. - Da wären z.B.
- die uniforme Raumunterteilung
- Quad- / Octree
- BSP Baum (Binary Space Partitioning)
- Sweep and Prune
- Man muss aber unterscheiden! Verschieden
klassifizierte Objekte können mit verschiedenen
Methoden gespeichert werden. Objekte selber
können wiederum andere Methoden zur Speicherung
und Unterteilung benutzen.
04.11.07 Florian Liegsalz
15
16Welche Methoden der Kollisionserkennung gibt es?
die uniforme Raumunterteilung
Die uniforme Raumunterteilung
Hier wird wieder mit einem Array oder Ähnlichem
gearbeitet, nur dass diesmal nicht nur die
Objekte im Array gespeichert werden, sondern die
gesamte Fläche.
Der große Nachteil an dieser Speicherart ist,
dass sobald die gespeicherten Objekte in Bewegung
sind, man auch jeweils das gesamte Raster
aktualisieren muss.
04.11.07 Florian Liegsalz
16
17Welche Methoden der Kollisionserkennung gibt es?
Quad- / Octree
Quad- / Octree
Der Quadtree funktioniert in diesem Fall ähnlich
wie bei der Speicherung der Bounding Box.
Problematisch ist diese Struktur nur bei sehr
beweglichen Strukturen, da der Baum relativ
schwierig zu aktualisieren ist.
04.11.07 Florian Liegsalz
17
18Welche Methoden der Kollisionserkennung gibt es?
BSP - Baum
BSP Baum
BSP-Bäume sind in der 3D-Graphik ein häufig
benutztes Mittel. Hierbei werden Polygone mit
Ebenen geschnitten und dadurch wird ein Binärbaum
erzeugt. Ich habe ein Applet gefunden, mit dem
ich erklären möchte, wie die Erstellung eines
BSP-Baumes funktioniert. http//www-lehre.inform
atik.uni-osnabrueck.de/vcprakt/ifc/part1/html/bsp
applet.html
04.11.07 Florian Liegsalz
18
19Welche Methoden der Kollisionserkennung gibt es?
Sweep and Prune
Sweep and Prune
Bei diesem Verfahren wird jedes Element in n
sortierten Listen gespeichert, wobei n die Anzahl
der Dimensionen ist. Wir speichern in jeder
Liste das jeweilige Objekt anhand der
dazugehörigen Koordinate auf der Achse. Da wir
durch die im Objekt gespeicherten Daten die
Breite des Objekts wissen, können wir dadurch
dann die Kollision abprüfen. Das Gute an diesen
Listen ist, dass wir eigentlich nur immer ein
Element in den Listen aktualisieren müssen.
Dadurch haben wir mittels Insert-Sort eine
ungefähre Laufzeit von O(n).
04.11.07 Florian Liegsalz
19
20Überblick
- Kollisionserkennung Was ist das und wofür
brauche ich es? - Was muss ich bei der Kollisionserkennung
beachten? - Welche Methoden der Kollisionserkennung gibt es?
- Ausblick
04.11.07 Florian Liegsalz
Überblick
20
21Ausblick
Ausblick
Es gibt noch viele andere Verfahren. Eines der
wichtigsten davon ist z.B. I-Collide. Dieses ist
eine Kombination von AABB und Sweep and Prune und
arbeitet daher sehr effizient. Diese Verfahren
sind natürlich nicht fix implementiert, sondern
nur eine ungefähre Vorgehensweiße, d.h. jeder
muss das selber programmieren. Daraus ergeben
sich teilweise schnellere und bessere
Algorithmen. Ebenso werden die vorhandenen
Algorithmen auch weiterentwickelt. Aus I-Collide
wurde z.B. V-Collide.
04.11.07 Florian Liegsalz
21
22Ende
Ende
04.11.07 Florian Liegsalz
22