01.03.2013 Aufrufe

Diplomarbeit (*.pdf - 5,3MB) - Faculty of Computer Science ...

Diplomarbeit (*.pdf - 5,3MB) - Faculty of Computer Science ...

Diplomarbeit (*.pdf - 5,3MB) - Faculty of Computer Science ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!