2015-04-25 2 views
0

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

После некоторых рефакторинга некоторые здесь то, что мой куб выглядит.

enter image description here

enter image description here

Нормальные значения я получаю являются

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 
+0

Если вы пытаетесь сгенерировать нормали для произвольной сетки (у которой еще нет нормалей), вам понадобится кросс-продукт и каким-то образом разделить одну и ту же вершину между несколькими треугольниками (если только ваш сетки никогда не используют вершину дважды) - каждый треугольник будет иметь другое значение, но вы должны указать его на основе вершин – Dave

ответ

-1

Нормальным для треугольника определяется порядком вершин.

То, что вы делаете, ошибочно, потому что вы вычеркиваете направления, а затем используете перекрестное произведение, чтобы получить перпендикулярное направление, что является просто абсурдом (вы можете вычесть два POINTS и получить из этого вектор, а затем нормализовать его к направлению, но в двух направлениях нет смысла их вычитать).

Если вы хотите найти среднюю нормаль треугольника (учитывая, что треугольник имеет разные нормали для каждого вектора), используйте среднее значение, а затем нормализуйте. Он будет работать нормально.

У вас уже есть нормальная информация (нормальный вектор). Этого достаточно для молнии!

Единственный раз, когда вам нужно вычислить вершину «нормальный», это когда вы на самом деле вычисляете ее касательную и бинормалью, чтобы применить нормальные карты. Сначала правильно настройте Phong shader, затем вы можете перейти на Normal Maps.