Непонимание норм OpenGL?

Я пытаюсь заставить свое освещение работать в OpenGL, используя LWJGL в качестве библиотеки реализации. Проблема, с которой я столкнулся, заключается в том, что я неправильно установил нормали, и поэтому освещение не работает под определенными углами. Вот код куба, который я тестирую:

glBegin(GL_QUADS);

glColor3f(r,g,b);

glNormal3f(position.x, position.y, position.z - radius - 0.1f);
glVertex3f(position.x + radius, position.y + radius, position.z - radius);
glVertex3f(position.x + radius, position.y - radius, position.z - radius);
glVertex3f(position.x - radius, position.y - radius, position.z - radius);
glVertex3f(position.x - radius, position.y + radius, position.z - radius);

glNormal3f(position.x, position.y, position.z + radius + 0.1f);
glVertex3f(position.x + radius, position.y + radius, position.z + radius);
glVertex3f(position.x + radius, position.y - radius, position.z + radius);
glVertex3f(position.x - radius, position.y - radius, position.z + radius);
glVertex3f(position.x - radius, position.y + radius, position.z + radius);

glNormal3f(position.x - radius - 0.1f, position.y, position.z);
glVertex3f(position.x - radius, position.y + radius, position.z + radius);
glVertex3f(position.x - radius, position.y - radius, position.z + radius);
glVertex3f(position.x - radius, position.y - radius, position.z - radius);
glVertex3f(position.x - radius, position.y + radius, position.z - radius);

glNormal3f(position.x + radius + 0.1f, position.y, position.z);
glVertex3f(position.x + radius, position.y + radius, position.z + radius);
glVertex3f(position.x + radius, position.y - radius, position.z + radius);
glVertex3f(position.x + radius, position.y - radius, position.z - radius);
glVertex3f(position.x + radius, position.y + radius, position.z - radius);

glNormal3f(position.x, position.y - radius - 0.1f, position.z);
glVertex3f(position.x + radius, position.y - radius, position.z + radius);
glVertex3f(position.x - radius, position.y - radius, position.z + radius);
glVertex3f(position.x - radius, position.y - radius, position.z - radius);
glVertex3f(position.x + radius, position.y - radius, position.z - radius);

glNormal3f(position.x, position.y + radius + 0.1f, position.z);
glVertex3f(position.x + radius, position.y + radius, position.z + radius);
glVertex3f(position.x - radius, position.y + radius, position.z + radius);
glVertex3f(position.x - radius, position.y + radius, position.z - radius);
glVertex3f(position.x + radius, position.y + radius, position.z - radius);

glEnd();

person Philippe Paré    schedule 09.03.2013    source источник
comment
Итак... что это предполагает делать и что оно делает на самом деле?   -  person Nicol Bolas    schedule 10.03.2013
comment
Я просто хочу убедиться, что мои нормали в порядке, потому что я не совсем понимаю, как их вычислить... это точка перед поверхностью? правильно ?   -  person Philippe Paré    schedule 10.03.2013
comment
@PhilippeParé: Нет, это не точка перед поверхностью, а направление, перпендикулярное поверхности, представленное вектором длины 1. Вы вычисляете их в R³, используя векторное произведение векторов, охватывающих треугольник.   -  person datenwolf    schedule 10.03.2013


Ответы (1)


Векторы нормалей относятся к самой вершине и всегда нормализованы (т.е. имеют длину один).

Итак, такая строка:

glNormal3f(position.x, position.y, position.z - radius - 0.1f);

Следует заменить на:

glNormal3f(0.0f, 0.0f, 1.0f);
person Martijn Courteaux    schedule 09.03.2013