Вычисление нормалей граней полигона OpenGL

Я пытаюсь добавить освещение к многоугольнику, созданному из файла точечного многоугольника. Моя проблема заключается в том, что при создании векторов из точек я освещаю только определенный участок полигонов, а затем, если я инвертирую расчет нормалей (от Ax - Cx до Cx - Ax), он освещает участок, который ранее не был освещен. Код и картинки ниже.

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;

person zylski    schedule 30.09.2014    source источник
comment
Проблема, похоже, заключается в отсечении лиц, а не в нормалях, но перед заключением необходимо просмотреть остальную часть кода. Не имеет значения, но вычисление нормалей можно выполнить гораздо проще.   -  person elimad    schedule 01.10.2014


Ответы (1)


Этот код кросс-продукта сильно сломан:

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;

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

person Reto Koradi    schedule 01.10.2014