Я пытаюсь найти нормализацию вектора для произвольного объекта, загруженного в программу 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