2012-05-16 16 views
7

Tengo 2 triángulos y vértices p0, p1, p2, p3. Estos dos triángulos comparten una ventaja. De estos dos triángulos quiero hacer un tetraedro dado por los 4 vértices. La biblioteca con la que trabajo requiere que "los 4 vértices se den de manera tal que los cuatro vértices triples que definen las caras del tetraedro en el dibujo aparezcan en el sentido contrario a las agujas del reloj cuando se ven desde el exterior" drawing. Suponiendo que uno de los dos triángulos es p0, p1, p2, calculo lo normal como siendo (p1-p0) (cruzado) (p2-p0). ¿Puede alguien decirme una forma de garantizar que se cumpla esta condición?Orientación del tetraedro para mallas triangulares

+2

Es una pena que haya tomado la molestia de proporcionar un diagrama muy claro y luego haya utilizado las etiquetas equivocadas para los vértices en el texto de su pregunta. La primera vez que lo leí estaba muy confundido. –

+1

En general, necesitaría otra forma de decidir en el exterior: a menudo esto proviene del algoritmo de mallado (cubos de marcha, etc.) –

+0

Si ambos triángulos tienen las normales calculadas de la misma forma que se menciona en la descripción, ¿no podría simplemente elegir un lado? (el que está apuntando lo normal) y lo consideran de frente o detrás? – Ray

Respuesta

10

respuesta corta:

La condición es que p3 debe estar en el lado correcto de la plano determinado por (p0, p1, p2).

Así, después de calcular la normal para este plano, es necesario determinar si el vector de (digamos) p0 a p3 está apuntando en la misma dirección de la normal, o la dirección opuesta, tomando el producto punto dot(normal, p3-p0).


Más matemáticamente hablando:

es necesario encontrar el determinante de la matriz de 4x4 formado por las coordenadas homogéneas de los cuatro puntos. El signo del determinante determina si se cumple la condición; el signo apropiado depende de las convenciones exactos utilizados, pero lo ideal es que debe ser positivo:

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 ] 

Si un determinado conjunto ordenado de puntos tiene un determinante negativo, se puede solucionar mediante el canje de dos cualquiera de los puntos (que se negar el determinante):

e.g., swapping p0 and p2: 

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

o, más generalmente, el cambio entre even and odd permutations de los cuatro vértices.

Si el determinante es cero, los cuatro puntos son coplanarios y no se pueden arreglar así.


Finalmente, el código:

una forma relativamente sencilla para calcular este determinante con 3-d vector matemáticas:

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

El determinante final también se conoce como el "producto triple" de v1, v2 y v3.

Tenga en cuenta que he dudado en intentar decodificar la convención de signos exacta (es decir, si necesita que el determinante sea positivo o negativo) de su pregunta: la redacción y el diagrama que proporciona son más que confusos.

Ya que tiene la biblioteca original y su documentación, está en la mejor posición para responder esta pregunta. Como último recurso, puede probar el método empírico: pruebe ambos signos y elija el que no explote ...

+0

Muchas gracias por la respuesta aclaratoria. Funcionó a las mil maravillas – Ray

Cuestiones relacionadas