Я пытаюсь найти нормализацию вектора для произвольного объекта, загруженного в программу opengl. Я пытаюсь вычислить нормали для всех вершин. Я собрал в том, что мне нужно сначала вычислить нормали для граней, а затем найти среднее значение нормалей для вершин.Нормализация вектора освещения OpenGL
Когда я запускаю программу, часть объекта горит правильно, но по большей части это не так. Треугольники на каждом отдельном лице кажутся правильно освещенными, но не смежными. Чтобы вычислить нормаль каждой вершины, я бы предположил, что я найду нормализованное среднее из шести соединительных треугольников, пытаясь сделать это, похоже, не работает.
Вот код, который я использую, чтобы попытаться вычислить нормали каждого лица.
vec3 one, two;
for(int i = 0; i < vertices.vertexNumber; i += 3)
{
one.x = point3[i+1].x - point3[i].x;
one.y = point3[i+1].y - point3[i].y;
one.z = point3[i+1].z - point3[i].z;
two.x = point3[i+2].x - point3[i].x;
two.y = point3[i+2].y - point3[i].y;
two.z = point3[i+2].z - point3[i].z;
vec3 normal = normalizevec3(crossvec3(one, two));
normalized[i] = normal;
}
и функции я использую, чтобы нормализовать векторы
vec3 normalizevec3(vec3 v) {
float vecLength = lengthvec3(v);
vec3 dividebyzero = {0.0, 0.0, 0.0};
if (vecLength == 0)
return dividebyzero;
float X, Y, Z;
X = v.x/vecLength;
Y = v.y/vecLength;
Z = v.z/vecLength;
vec3 u = {X, Y, Z};
return u;
}
После некоторых рефакторинга некоторые здесь то, что мой куб выглядит.
Нормальные значения я получаю являются
0.000000, 0.000000, 1.000000
0.000000, 0.000000, 1.000000
0.000000, 0.000000, 1.000000
0.000000, 0.000000, 1.000000
-1.000000, 0.000000, -0.000000
-1.000000, 0.000000, 0.000000
-1.000000, 0.000000, -0.000000
-1.000000, 0.000000, 0.000000
0.000000, -1.000000, 0.000000
-0.000000, -1.000000, 0.000000
0.000000, -1.000000, 0.000000
-0.000000, -1.000000, 0.000000
Если вы пытаетесь сгенерировать нормали для произвольной сетки (у которой еще нет нормалей), вам понадобится кросс-продукт и каким-то образом разделить одну и ту же вершину между несколькими треугольниками (если только ваш сетки никогда не используют вершину дважды) - каждый треугольник будет иметь другое значение, но вы должны указать его на основе вершин – Dave