¿Cómo puedo obtener el vector normal para un plano a partir de un conjunto de vértices?

9

Estoy trabajando en un pequeño proyecto HLSL / C ++ para revisar mi trabajo de gráficos, y no estoy seguro de cómo obtener un vector de orientación de un polígono de vértice. Parece que no puedo encontrar la fórmula.

Las posiciones son P1, P2, P3

Vamos a llamarlos clase VertexPoint con P1.x, P1.y, P1.z por ejemplo?

RNewell122
fuente
pregunta estrechamente relacionada: gamedev.stackexchange.com/questions/11520/…
jhocking
Solo por lo correcto, la etiqueta en la imagen y el título de la pregunta debe ser " vector normal " en lugar de "vector normalizado". El vector normal en sí puede, por supuesto, normalizarse (su longitud es la unidad), pero no es necesario, y el producto cruzado no producirá un vector normalizado por defecto.
jjmontes
1
Buscar en Google el "triángulo vectorial normal", que es lo obvio para Google, da millones de visitas. 1 , 2 , 3 , 4 , 5 , 6 , ...
imallett
... 7 , 8 , 9 , 10 , 11 , 12 , 13 , ...
imallett
2
... 14 , 15 , 16 , 17 ... Cada uno de estos (y sin duda muchos otros) responde a la pregunta, y algunos incluso tienen el código C ++ / HLSL deseado. Seriamente. Esta pregunta ha sido tan golpeada hasta la muerte, que llamarla "duplicada" es inadecuada. "Parece que no puedo encontrar la fórmula" mi trasero, no lo intentaste .
imallett

Respuestas:

28

Puede encontrar fácilmente la normal calculando dos vectores, V1 = P2-P1 y V2 = P3-P1, y luego encontrar el producto cruzado N = V1 x V2. Luego normaliza N. Dependiendo del orden de los vértices (en sentido horario o antihorario) obtendrá una orientación normal hacia adelante o hacia atrás.

También debe asegurarse de que tres tres puntos no estén alineados, si lo están, debe elegir otro punto.

Hermetix
fuente