Проблема с освещением OpenGL при повороте камеры
Вопрос
Я рисую здания в своем игровом мире, я заштриховываю их с помощью следующего кода:
GLfloat light_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat light_position[] = {135.66f, 129.83f, 4.7f, 1.0f};
glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glColorMaterial(GL_FRONT, GL_AMBIENT);
Это прекрасно работает.
Но когда я начинаю летать по миру, освещение реагирует на это так, как если бы мир был объектом, который вращается.Таким образом, освещение меняется, когда меняется угол обзора моей камеры.
Как мне отменить это вращение?таким образом, освещение будет думать, что я на самом деле не вращаю мир, и тогда я мог бы придать своим зданиям статическое затенение, которое менялось бы в зависимости от положения солнца на небе.
Редактировать:вот код рендеринга:
int DrawGLScene()
{
// stuff
glLoadIdentity();
glRotatef(XROT, 1.0f, 0.0f, 0.0f);
glRotatef(YROT, 0.0f, 1.0f, 0.0f);
glRotatef(ZROT, 0.0f, 0.0f, 1.0f);
glTranslatef(-XPOS, -YPOS, -ZPOS);
// draw world
}
Решение
http://www.opengl.org/resources/faq/technical/lights.htm
Смотрите #18.050
Короче говоря, вам нужно убедиться, что вы определяете положение вашего источника света в правильной системе отсчета и применяете соответствующие преобразования для каждого кадра, чтобы сохранить его там, где вы хотите.
Другие советы
Я полагаю, что ваша проблема возникает из-за того факта, что источники света OpenGL указаны в мировых координатах, но хранятся внутри в координатах камеры.Это означает, что как только вы разместите источник света, всякий раз, когда вы перемещаете камеру, ваш источник света будет перемещаться вместе с ней.
Чтобы исправить это, просто меняйте положение источников света всякий раз, когда вы перемещаете камеру.