OpenGL Calculating Normals (Quads)

Моя проблема касается OpenGL и нормалей, я понимаю математику, стоящую за ними, и у меня есть некоторые успехи.

Функция, которую я добавил ниже, принимает чередующийся массив вершин и вычисляет нормали для каждых 4 вершин. Они представляют собой квадроциклы, имеющие одинаковые направления. Насколько я понимаю, эти 4 вершины должны иметь один и тот же нормаль. Пока они смотрят в одну сторону.

Проблема, с которой я столкнулся, заключается в том, что мои QUADS визуализируют диагональный градиент, примерно так: Эффект света - За исключением того, что тень находится посередине, а свет - по углам.

Я рисую свои КВАДРАТЫ последовательно. TopLeft, TopRight, BottomRight, BottomLeft и вершины, которые я использую для вычисления нормалей, это TopRight - TopLeft и BottomRight - TopLeft.

Надеюсь, кто-нибудь сможет увидеть что-то, в чем я допустил грубую ошибку, но я занимался этим уже несколько часов, но безуспешно.

Для записи я визуализирую Куб и Чайник рядом с моими объектами, чтобы проверить, работает ли мое освещение, поэтому я почти уверен, что нет никаких проблем с положением источника света.

void CalculateNormals(point8 toCalc[], int toCalcLength)
{
    GLfloat N[3], U[3], V[3];//N will be our final calculated normal, U and V will be the subjects of cross-product
    float length;

for (int i = 0; i < toCalcLength; i+=4) //Starting with every first corner QUAD vertice
{
    U[0] = toCalc[i+1][5] - toCalc[i][5]; U[1] = toCalc[i+1][6] - toCalc[i][6]; U[2] = toCalc[i+1][7] - toCalc[i][7]; //Calculate Ux Uy Uz 
    V[0] = toCalc[i+3][5] - toCalc[i][5]; V[1] = toCalc[i+3][6] - toCalc[i][6]; V[2] = toCalc[i+3][7] - toCalc[i][7]; //Calculate Vx Vy Vz

    N[0] = (U[1]*V[2]) - (U[2] * V[1]);
    N[1] = (U[2]*V[0]) - (U[0] * V[2]);
    N[2] = (U[0]*V[1]) - (U[1] * V[0]);

    //Calculate length for normalising
    length = (float)sqrt((pow(N[0],2)) + (pow(N[1],2)) + (pow(N[2],2)));

    for (int a = 0; a < 3; a++)
    {
        N[a]/=length;
    }

    for (int j = 0; i < 4; i++)
    {
                    //Apply normals to QUAD vertices (3,4,5 index position of normals in interleaved array)
        toCalc[i+j][3] = N[0]; toCalc[i+j][4] = N[1]; toCalc[i+j][5] = N[2];
    }
}
}

0
задан Nicol Bolas 17 January 2012 в 16:48
поделиться