2012-05-16 23 views
7

Ho 2 triangoli e vertici p0, p1, p2, p3. Questi due triangoli condividono un vantaggio. Da questi due triangoli voglio fare un tetraedro dato dai 4 vertici. La libreria con cui lavoro richiede che "i 4 vertici debbano essere dati in modo tale che i quattro vertici dei vertici che definiscono le facce del tetraedro nel disegno appaiano in senso antiorario quando vengono visualizzati dall'esterno" drawing. Supponendo che uno dei due triangoli sia p0, p1, p2, io calcolo il normale come (p1-p0) (croce) (p2-p0). Qualcuno può dirmi un modo per assicurarmi che questa condizione sia soddisfatta?Orientamento tetraedro per mesh triangolari

+2

È un peccato che tu abbia fatto tutto il possibile per fornire un diagramma molto chiaro e poi usato le etichette sbagliate per i vertici nel testo della tua domanda. La prima volta che l'ho letto ero molto confuso. –

+1

Avresti bisogno di un altro modo per decidere all'esterno - spesso questo deriva dall'algoritmo di meshing (cubi marching ecc.) –

+0

Se entrambi i triangoli hanno le normali calcolate nello stesso modo come menzionato nella descrizione, non potrei semplicemente scegliere un lato (quello che sta puntando il normale) e lo consideri davanti o dietro? – Ray

risposta

10

Risposta breve:

La condizione è che p3 deve essere sul lato corretto del piano determinato da (p0, p1, p2).

Così, dopo il calcolo del normale per questo piano, è necessario determinare se il vettore da (diciamo) p0 a p3 sia rivolta nella stessa direzione del normale, o nella direzione opposta, prendendo il prodotto scalare dot(normal, p3-p0).


Ulteriori matematicamente parlando:

è necessario trovare il determinante della matrice 4x4 formata dalle coordinate omogenee dei quattro punti. Il segno del determinante determina se la condizione è soddisfatta; il segno appropriata dipende dalle precise convenzioni utilizzate, ma idealmente dovrebbe essere positiva:

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 ] 

Se un particolare insieme ordinato di punti ha un determinante negativo, è possibile risolvere il problema scambiando due qualsiasi dei punti (che sarà negare il determinante):

e.g., swapping p0 and p2: 

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

o, più in generale, il passaggio tra even and odd permutations dei quattro vertici.

Se il determinante è zero, i quattro punti sono complanari e non possono essere corretti in questo modo.


Infine, il codice:

Un modo relativamente semplice per calcolare questo determinante con 3-d matematica vettoriale:

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

Il determinante finale è anche conosciuto come "prodotto misto" di v1, v2 e v3.

Nota che ho esitato a provare a decodificare la convenzione del segno esatto (vale a dire, se hai bisogno che il determinante sia positivo o negativo) dalla tua domanda: il testo e il diagramma che fornisci è più che un po 'confuso.

Dato che si dispone della libreria originale e della relativa documentazione, tuttavia, si è nella posizione migliore per rispondere a questa domanda. Come ultima risorsa, puoi provare il metodo empirico: prova entrambi i segnali e scegli quello che non esplode ...

+0

Grazie mille per la risposta chiarificatrice. Ha funzionato come un fascino – Ray

Problemi correlati