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;

}