2012-05-16 3 views
7

Ich habe 2 Dreiecke und Ecken p0, p1, p2, p3. Diese zwei Dreieck teilen eine Kante. Aus diesen beiden Dreiecken möchte ich ein Tetraeder machen, das durch die 4 Ecken gegeben ist. Die Bibliothek, mit der ich arbeite, erfordert, dass "die 4 Eckpunkte so angegeben werden, dass die vier Vertex-Tripel, die die Tetraeder-Flächen in der Zeichnung definieren, in der Reihenfolge gegen den Uhrzeigersinn erscheinen, wenn sie von außen betrachtet werden" drawing. Wenn eines der beiden Dreiecke p0, p1, p2 ist, berechne ich die Normale als (p1-p0) (Kreuz) (p2-p0). Kann mir bitte jemand sagen, wie ich sicherstellen kann, dass diese Bedingung erfüllt wird?Tetrahedron Orientierung für Dreiecksnetze

+2

Es ist eine Schande, dass Sie sich alle Mühe gegeben haben, ein sehr übersichtliches Diagramm zu erstellen und dann zu verwenden die falschen Bezeichnungen für die Scheitelpunkte im Text Ihrer Frage. Das erste Mal, als ich es las, war ich sehr verwirrt. –

+1

Sie würden normalerweise einen anderen Weg brauchen, um sich nach draußen zu entscheiden - oft kommt das vom Meshing-Algorithmus (Marching Cubes etc.) –

+0

Wenn beide Dreiecke die Normalen auf die gleiche Weise wie in der Beschreibung beschrieben berechnet haben, kann ich nicht einfach eine Seite auswählen (dasjenige, auf das das Normale zeigt) und es vorne oder hinten betrachten? – Ray

Antwort

10

Kurze Antwort:

Voraussetzung ist, dass p3 auf der richtigen Seite der Ebene von (p0, p1, p2) bestimmt sein muss.

So, nachdem die normale für diese Ebene der Berechnung, müssen Sie bestimmen, ob der Vektor von (sagen wir) p0 zu p3 wird in der gleichen Richtung der Normalen, oder die entgegengesetzte Richtung, um das Skalarprodukt dot(normal, p3-p0) nehmen.


Mehr mathematisch gesprochen:

Sie müssen die Determinante der 4x4-Matrix durch die homogenen Koordinaten der vier Punkte gebildet finden. Das Vorzeichen der Determinante bestimmt, ob die Bedingung erfüllt ist; das entsprechende Zeichen hängt von den genauen Konventionen, sondern im Idealfall sollte es positiv:

require: 
    0 < det(p0, p1, p2, p3) 

    == det [ p0.x p0.y p0.z 1 ] 
     [ p1.x p1.y p1.z 1 ] 
     [ p2.x p2.y p2.z 1 ] 
     [ p3.x p3.y p3.z 1 ] 

Wenn eine bestimmte Punkte geordneten Satzes hat eine negative Determinante, können Sie es durch die zwei Punkte tauschen (was beheben wird negiert die Determinante):

e.g., swapping p0 and p2: 

det(p0, p1, p2, p3) = - det(p2, p1, p0, p3) 
    ^ ^   ^ ^

oder, allgemeiner, zwischen even and odd permutations der vier Eckpunkte Schalt.

Wenn die Determinante Null ist, sind die vier Punkte koplanar und können nicht so fixiert werden.


schließlich der Code:

Eine relativ einfache Art und Weise diese Determinante mit 3-D-Vektor math zu berechnen:

let: v1 = p1 - p0 
     v2 = p2 - p0 
     v3 = p3 - p0 
     norm12 = cross(v1, v2) 
    -> determinant = dot(norm12, v3) 

Die endgültige Determinante auch als "Dreifachprodukt" bekannt ist, von v1, v2 und v3.

Beachten Sie, dass ich gezögert habe, zu versuchen, die genaue Vorzeichenkonvention (d. H. Ob die Determinante positiv oder negativ sein muss) aus Ihrer Frage zu entschlüsseln: Der von Ihnen angegebene Wortlaut und das Diagramm sind mehr als ein bisschen verwirrend.

Da Sie die Originalbibliothek und ihre Dokumentation haben, sind Sie in der besten Position, diese Frage zu beantworten. Als letzten Ausweg können Sie die empirische Methode ausprobieren: Probieren Sie beide Zeichen aus, und wählen Sie dasjenige aus, das nicht explodiert ...

+0

Vielen Dank für die klärende Antwort. Es hat wie ein Zauber funktioniert – Ray