Diplomarbeit (*.pdf - 5,3MB) - Faculty of Computer Science ...
Diplomarbeit (*.pdf - 5,3MB) - Faculty of Computer Science ...
Diplomarbeit (*.pdf - 5,3MB) - Faculty of Computer Science ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
oolean findCollisions(BVA, BVB) {<br />
}<br />
A B<br />
( T − T ) ⋅ n / n<br />
Abb. 4-25 Algorithmus für Test zweier BVHs<br />
Die Methode BVCollide testet zwei OBBs auf Überschneidungen nach der in<br />
Abschnitt 3.3.6 aufgeführten Gleichung. Im folgenden soll nun gezeigt werden,<br />
wie sich die Berechnung dieser Gleichung nach [Gottschalk00] optimieren<br />
lässt und wie Spezialfälle behandelt werden können.<br />
Optimierung: Struktur des zu testenden Vektors<br />
Angenommen der Mittelpunkt einer Box A befindet sich an der Stelle T A . Die<br />
A A A<br />
Einheitsvektoren R0 , R1<br />
, R2<br />
entsprechen den drei Achsen der Box und a0, a1,<br />
a2 den Halblängen entlang der entsprechenden Achsen. Selbiges sei äquivalent<br />
für eine Box B definiert.<br />
Die auf Separierung zu testende Achse sei eine Gerade durch den<br />
Koordinatenursprung, deren Richtung mit einem Vektor n bezeichnet wird, der<br />
nicht zwingend ein Einheitsvektor sein muss.<br />
Somit ergibt sich als Separierender- Achsen- Test folgender Ausdruck:<br />
A<br />
A<br />
A<br />
( a1<br />
R1<br />
⋅ n + a2<br />
R2<br />
⋅ n + a3<br />
R3<br />
⋅ n ) / n<br />
B<br />
B<br />
B<br />
( b1<br />
R1<br />
⋅ n + b2<br />
R2<br />
⋅ n + b3<br />
R3<br />
⋅ n ) / n<br />
(Gleichung 4-1)<br />
Da die zu testende Achse entweder der Normale auf einer Fläche der Boxen<br />
oder der Kombination ihrer Kanten entspricht, ergeben sich für n drei Fälle:<br />
n = R , n = R und n = R × R , mit i , j ∈{<br />
1,<br />
2,<br />
3}<br />
.<br />
A<br />
i<br />
if (!BVCollide(BVA,BVB) ) return false;<br />
if (isLeaf(BVA) and isLeaf(BVB))<br />
return PrimitiveCollide(BVA,BVB);<br />
if ((size(BVA)>size(BVB)) or isLeaf(BVB)){<br />
for all children BVC <strong>of</strong> BVA do<br />
findCollisions(BVC, BVB)<br />
}<br />
else {<br />
for all children BVC <strong>of</strong> BVB do<br />
findCollisions(BVA, BVC)<br />
}<br />
B<br />
i<br />
><br />
A<br />
i<br />
B<br />
j<br />
+<br />
90