4 Stimmen

Berechnen, ob zwei 3D-Dreiecke auf der gleichen Ebene liegen

Für eine 3D-Spiel-Engine, an der ich arbeite, muss ich berechnen, ob zwei 3D-Dreiecke auf der gleichen Ebene liegen, um sie entsprechend anzuzeigen. Wie kann ich die Winkel eines Dreiecks im 3D-Raum berechnen?

Würde die Berechnung einer Oberflächennormale und der Vergleich dieser jemals geben mir 2 gleichwertige Normalen?

3voto

tibur Punkte 11175

Warum wollen Sie das tun? Wie viele Dreiecke wollen Sie prüfen? Für einen Echtzeit-Rendering-Algorithmus scheint das ein wenig komplex zu sein!

Wie auch immer:

Berechnen Sie die normale n des Dreiecks. Berechnen Sie dann die Ebenengleichung: a.x + b.y + c.z + d = 0 con (a,b,c) dein Dreieck normal zu sein und d = - dot(n,P) (P ist einer der Eckpunkte deines Dreiecks). Machen Sie dasselbe für das zweite Dreieck.

Die beiden Ebenen sind identisch, wenn die vier Werte abcd gleich oder entgegengesetzt sind (alle zusammen).

3voto

Alexandre C. Punkte 53706

Was Sie verlangen, ist numerisch unmöglich. Rundungsfehler machen einen solchen Test völlig irrelevant.

~~

Vielleicht möchten Sie aber auch prüfen, ob zwei Dreiecke innerhalb einer bestimmten Toleranz auf der gleichen Ebene liegen. Dies ist sehr schwierig zu bewerkstelligen, und auch hier werden Rundungsfehler wahrscheinlich jede mögliche Methode vereiteln. Wenn die Dreiecke dünn sind, besteht eine große Unsicherheit bezüglich der Ebene, auf der sie liegen.

Ich könnte Sie auf Literatur verweisen, wenn Sie wirklich wollen (am besten wäre es, wenn Sie sich die CGAL Bibliothek und sehen Sie, ob sie etwas für Ihr Problem Relevantes implementiert haben). Alles, was damit zu tun hat, beinhaltet wahrscheinlich Fließkommazahlen beliebiger Genauigkeit, eine geschickte Umordnung von Operationen und wird in jedem Fall zu ungenauen Ergebnissen führen.

~~

Ich empfehle Ihnen daher dringend, einen anderen Ansatz für Ihr eigentliches Problem zu finden.

Rundungsfehler sind ein (großes) Problem, wenn man versucht, die Gleichung der Ebene zu berechnen, die durch drei Punkte verläuft, und dann die drei anderen Punkte prüft. Es gibt eine andere Lösung.

Sie können die Berechnung der Trägheitsmatrix deiner sechs Punkte, diagonalisiere sie und prüfe, ob ihr kleinster Eigenwert innerhalb eines winzigen Wertes der beiden anderen liegt. Dies bedeutet, dass Ihre sechs Punkte tatsächlich auf derselben Ebene liegen, innerhalb einer Toleranz.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X