Моя проблема касается OpenGL и Normals, я понимаю математику позади них, и у меня есть некоторый успех.OpenGL Calculating Normals (Quads)
Функция, приведенная ниже, принимает перемеженный вершинный массив и вычисляет нормали для каждых четырех вершин. Они представляют собой QUADS, которые имеют одинаковые направления. По моему мнению, эти четыре вершины должны иметь один и тот же Normal. Пока они сталкиваются одинаково.
Проблема, с которой я сталкиваюсь, заключается в том, что мои QUADS - это рендеринг с диагональным градиентом, примерно так: Light Effect - За исключением того, что тень находится посередине, со светом в углах.
Я рисую свои 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];
}
}
}
Это C++; вы рассматривали использование математической библиотеки, например [GLM] (http://glm.g-truc.net/)? –
К сожалению, это для задания, и поэтому мы не поощряем использование библиотек. – LBHoward