2014-09-30 6 views
0

Я пытаюсь добавить освещение к многоугольнику, созданному из файла многоугольника. Моя проблема заключается в том, что при создании векторов из точек я получаю только определенный участок многоугольников, а затем, если я инвертирую вычисление для нормалей, (от A.x - C.x до C.x - A.x), он загорается секцией, которая ранее не была освещена. Код и рисунки ниже.Вычисление OpenGL Face Normalals of Polygon

A.x - D.x

D.x - A.x

h_vector V1;//= (p2 - p1); 
    // A = 0 B = 1 C = 2 D =3 
    V1.x = vertices[1].x - vertices[0].x; 
    V1.y = vertices[1].y - vertices[0].y; 
    V1.z = vertices[1].z - vertices[0].z; 


    h_vector V2;// = (p3 - p1); 

    V2.x = vertices[3].x - vertices[0].x; 
    V2.y = vertices[3].y - vertices[0].y; 
    V2.z = vertices[3].z - vertices[0].z; 
    /* 

    h_vector V1;//= (p2 - p1); 
    V1.x = vertices[0].x - vertices[1].x; 
    V1.y = vertices[0].y - vertices[1].y; 
    V1.z = vertices[0].z - vertices[1].z; 


    h_vector V2;// = (p3 - p1); 

    V2.x = vertices[0].x - vertices[3].x; 
    V2.y = vertices[0].y - vertices[3].y; 
    V2.z = vertices[0].z - vertices[3].z; 
    */ 

    surfaceNormal.x = (V1.y*V2.z) - (V1.z-V2.y); 
    surfaceNormal.y = - ((V2.z * V1.x) - (V2.x * V1.z)); 
    surfaceNormal.z = (V1.x-V2.y) - (V1.y-V2.x); 
    float normalize = sqrtf((pow(surfaceNormal.x,2) + pow(surfaceNormal.y,2) + pow(surfaceNormal.z,2))); 

    surfaceNormal.x = surfaceNormal.x/normalize; 
    surfaceNormal.y = surfaceNormal.y/normalize; 
    surfaceNormal.z = surfaceNormal.z/normalize; 
+0

Проблема, похоже, устраняет лицо, а не нормали, но перед тем, как завершить, нужно увидеть остальную часть кода. Не имеет значения, но нормальная калькуляция может быть выполнена гораздо проще. – elimad

ответ

2

Этот крест код продукта сломана:

surfaceNormal.x = (V1.y*V2.z) - (V1.z-V2.y); 
surfaceNormal.y = - ((V2.z * V1.x) - (V2.x * V1.z)); 
surfaceNormal.z = (V1.x-V2.y) - (V1.y-V2.x); 

Выражения в скобках должны все иметь оператор умножения, но половина из них вычитаний вместо этого в коде выше.

Расчет кросс продукт должен быть:

surfaceNormal.x = V1.y * V2.z - V1.z * V2.y; 
surfaceNormal.y = V1.z * V2.x - V1.x * V2.z; 
surfaceNormal.z = V1.x * V2.y - V1.y * V2.x; 

Вы можете посмотреть в использовании матрица/вектор библиотеки. Многие из них свободно доступны, если вы занимаетесь поиском.