Kapitel 8 Kollisionserkennung Lukas Zimmer
Gliederung Einführung Kollision mit einer Ebene Kugel - Ebene Quader - Ebene Räumliche Aufteilung Allgemeine Kugel Kollisionen Sliding Kollision von zwei Kugeln
Einführung Mit Kollisionserkennung wird überprüft, wann zwei Objekte miteinander interagieren Meist wird Kollision zwischen einem sich bewegenden Objekt und der Umgebung überprüft
Objekt bewegt sich linear, zwischen zwei Frames Kleine Objekte werden durch ihren Mittelpunkt repräsentiert Rückführung auf Geradenschnitt Größere Objekte werden durch einfache Grundformen approximiert
Kollision mit einer Ebene Bestimmung des Schnittpunktes von Objekt und Ebene Nützliches Verfahren in räumlich aufgeteilten Umgebungen
Kugel - Ebene Kugel K: (X-P)² = r² Ebene L = <N,D> Kugel tangiert Ebene, wenn L P = r N P + D = r N P + D - r = 0 definiere L = <N,D-r> P liegt auf L, wenn L P = 0
Kugel bewegt sich von P₁ zur Zeit t = 0 nach P₂ zur Zeit t = 1 Kollidiert die Kugel mit der Ebene L? Liege P₁ auf der positiven Seite der Ebene, also L P₁ r Falls ebenfalls L P₂ r, findet keine Kollision währen 0 t 1 statt
P(t) = P₁ + tv, mit V = P₂ - P₁ Kollision wenn L P(t) = 0 t = - L P₁ L V L V N V, N V = 0 Kugel bewegt sich parallel zur Ebene N V 0 Kollisionspunkt C = P(t) - rn
Quader - Ebene Quader mit Mittelpunkt Q und den Richtungen R, S und T gegeben reff = ½( R N + S N + T N ) Quader bewegt sich von Q₁ zur Zeit t = 0 nach Q₂ zur Zeit t = 1 Q(t) = Q₁ + tv, mit V = Q₂ - Q₁ Schnittpunkt bei t = - mit L = <N,D-reff> L Q₁ L V
Liege Q₁ auf der positiven Seite der Ebene, also L Q₁ r Falls ebenfalls L Q₂ r, findet keine Kollision währen 0 t 1 statt
Wenn R N, S N, T N 0 liegt der Kollisionspunkt auf einem der 8 Eckpunkte Z = Q(t) ± ½R ± ½S ± ½T Vorzeichen so, dass ±K N, K {R,S,T} jeweils negativ ist
C N R < 0, N S > 0, N T > 0 C = Q(t) + ½R - ½S - ½T
Wenn R N, S N 0 und T N = 0 liegt der Kollisionspunkt auf der Kante mit Eckpunkten C₁,₂ = Q(t) ± ½R ± ½S + ± ½T Vorzeichen so, dass ±K N, K {R,S} jeweils negativ ist
Wenn R N 0 und S N, T N = 0 liegt der Schnittpunkt auf der Seitenfläche mit Eckpunkten C₁,₂,₃,₄ = Q(t) ± ½R + ± ½S + ± ½T Vorzeichen so, dass ±R N negativ ist
Räumliche Aufteilung Kollisionserkennung mit einer Ebene hilft bei räumlich aufgeteilten Umgebungen (Octree, BSP) Rechenleistung zu sparen Überprüfung, ob ein Objekt überhaupt in einen Knoten eintritt, bevor man Kollisionen mit Geometrien darin betrachtet
Objekt mit effektivem Radius reff bewegt sich innerhalb eines Frames von P₁ nach P₂ L = <N,D> unterteilt den Raum Wenn L Pi reff (i=1,2), so braucht man das Objekt nicht auf Kollisionen mit Geometrien auf der negativen Seite der Ebene zu testen. Analoges gilt für L Pi reff (i=1,2)
Allgemeine Kugel Kollisionen Kollision einer Kugel mit beliebigen Polygon Mögliche Kollisionspunkte - Eckpunkt - Punkt auf Kante - Punkt auf Seitenfläche
Kugel (X-P)² = r² gegeben Expansion des Polygons um r Fläche: Ebene L parallel verschoben um r Kante: Zylinder Z mit Radius r und Kante als Achse Eckpunkt: Kugel V mit Radius r um Eckpunkt
Liegt P in L (siehe Kugel - Ebene) Kollision mit Seitenfläche Liegt P auf der Oberlfäche von Z Kollision mit Kante Liegt P auf der Oberlfäche der Kugel V (siehe 5.2.3. Schnitt von Gerade & Kugel) Kollision mit Eckpunkt
Schnitt mit Innerem von Z ist bedingt durch Schnitt mit L
Bestimmung des Schnittpunktes mit Oberfläche Koordinatentransformation um -E₁ B liegt auf Z, wenn r² = B² - (projab)² Einsetzen von P(t) - E₁ ergibt: [(P₀+tV) A]² r² = (P₀+tV)² - A² mit P₀ = P₁ - E₁ und A = E₂ - E₁ des Zylinders Z mit Eckpunkten E₁, E₂ und Radius r
Ergibt quadratische Gleichung at² + 2bt + c = 0, mit a = V² - (V A)²/A² b = S₀ V - (S₀ A)(V A)/A² c = S₀² - r² - (S₀ A)²/A² b² - ac < 0 keine Kollision -b - b² - ac b² - ac 0 t = a
Im Falle eines Schnittes bei t₁ gilt L = proja(p(t₁)-e₁) = [P(t₁)-E₁] A A Der Schnittpunkt liegt zwischen E₁ und E₂, wenn 0 < L < A 0 < [P(t₁)-E₁] A < A² Sonst liegt der Schnittpunkt außerhalb von Z
Nur wenige Kollisionsüberprüfungen durchführen, um Rechenleistung zu sparen Dazu Umkugel um Polygon bilden auf Kollision überprüfen Erst bei positiven Test auf Kollision mit Seitenfläche, Kante oder Eckpunkt prüfen
Eckpunkte (bzw. Kanten), deren angrenzende Kanten (bzw. Flächen) in einem Winkel β mit 0 β 180 stehen, werden nicht beachtet [N₁x(E₂-E₁)] N₂ 0, mit N₁,N₂ Normalenvektoren der angrenzenden Flächen (N₁ zur Fläche mit E₁, E₂ gegen den Uhrzeigersinn)
Sliding Bei Kollision einer Kugel mit einem Objekt bewegt sich die Kugel senkrecht zum Normalenvektor des Kollisionspunktes Die Länge wird durch den Eintrittswinkel bestimmt
P₃ = P₂ - [(P₂-Q) N]N Es können weitere Kollisionen mit dem Objekt zwischen Q und P₃ auftreten Verfahren wird wiederholt, bis keine Kollision mehr auftritt, oder Q-Pi < ε
Kollision zweier Kugeln Gegeben sind zwei sich bewegende Kugeln. Es soll überprüft werden, ob die Kugeln für 0 t 1 kollidieren
K₁: (X-P)² = rp² K₂: (X-Q)² = rq² P(t) = P₁ + tvp Q(t) = Q₁ + tvq mit Vi = i₂-i₁, i {P,Q} Abstand der Kugeln d = P(t) - Q(t) = P₁-Q₁ + t(vp-vq) ist bei Kollision rp + rq
Umformen in quadratisches Problem: (rp + rq)² = P₁-Q₁ + t(vp-vq) ² = A² + 2t(A B) + t²b² mit A = P₁ - Q₁ und B = VP - VQ t = -(A B)- (A B)²-B ²[A ²-(rP + rq)²] B² falls t [0,1) findet keine Kollision statt für B² = 0 bewegen sich die Kugeln parallel und es bedarf keine Kollisionsüberprüfung
Um Rechenleistung zu sparen, berechnet man das Minimum von d² 2B²t + 2(A B) = 0 t = - A B B² (A B)² Falls d² = A² - > (rp + rq)² B² findet keine Kollision statt
Findet eine Kollision statt und hat man t bestimmt, so gilt für den Kollisionspunkt C = P(t) + rp N, mit N Normaleneinheitsvektor zu Q(t) - P(t)
Zum Schluss ein Beispiel
Bestimme den Zeitpunkt t, zu dem eine Kugel mit einem Radius von 2 Metern mit einer Ebene x = 10m kollidiert, wenn ihr Mittelpunkt zum Zeitpunkt t = 0 im Ursprung liegt und sie sich mit (2,0,1)m/s bewegt. L = <(-1,0,0), 10> L = <(-1,0,0),8> P(t) = t(2,0,1) L P₁ = <(-1,0,0),8> <(0,0,0),1> = 8 L V = <(-1,0,0),8> <(2,0,1),0> = -2 t = -8/-2 = 4 Nach 4 Zeiteinheiten kollidiert die Kugel mit der Ebene im Punkt (8,0,4)-2(-1,0,0)=(10,0, 4)
Vielen Dank für Ihre Aufmerksamkeit!