Processamento Gráfico - UFPE - Prof. Marcelo Walter
Cálculo do Vetor Normal
Esta nota objetiva explicar o procedimento para cálculo do vetor normal a uma face triangular. Isto possibilita acrescentarmos iluminação nas cenas sintetizadas com OpenGL. Este procedimento deve ser utilizado SOMENTE quando o arquivo que descreve o objeto não possui os vetores normais especificados.
O procedimento abaixo utiliza o produto vetorial de 2 vetores que são definidos a partir dos vértices do triângulo. Assumiremos então que todos os vértices têm o mesmo vetor normal. Com isto o código para renderização dos triângulos ficaria:
glNormal3f(n.x, n.y, n.z);
glBegin(GL_TRIANGLES);
glVertex3f(v1.x, v1.y, v1.z);
glVertex3f(v2.x, v2.y, v2.z);
glVertex3f(v3.x, v3.y, v3.z);
glEnd();
Se para cada vértice fosse especificado um vetor normal distinto, então a chamada glNormal3f apareceria 3 vezes, antes de glVertex.
O código C para encontrar o vetor normal a um plano definido por 3 vértices seria:
typedef struct p3d{
double x, y, z;
}Point3D;
void compVetorNormalTriangulo ( Point3D p1, Point3D p2, Point3D p3, Point3D *n )
{
Point3D v1, v2;
double len;
/* Encontra vetor v1 */
v1.x = p2.x - p1.x;
v1.y = p2.y - p1.y;
v1.z = p2.z - p1.z;
/* Encontra vetor v2 */
v2.x = p3.x - p1.x;
v2.y = p3.y - p1.y;
v2.z = p3.z - p1.z;
/* Calculo do produto vetorial de v1 e v2 */
n->x = (v1.y * v2.z) - (v1.z * v2.y);
n->y = (v1.z * v2.x) - (v1.x * v2.z);
n->z = (v1.x * v2.y) - (v1.y * v2.x);
/* normalizacao de n */
len = sqrt(n->x*n->x + n->y*n->y + n->z*n->z)
n->x /= len;
n->y /= len;
n->z /= len;
}