2009-12-16 3 views
3

рисует здание в моем игровом мире, я тень их со следующим кодом: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); 

Это прекрасно работает.

Но когда я начинаю летать в мире, освещение реагирует на это, как будто мир был объектом, который вращается. Таким образом, свет меняется, когда меняет угол камеры.

Как вернуть это вращение? поэтому освещение подумает, что я на самом деле не вращаю мир, и тогда я мог бы сделать свои здания статичным затенением, которое изменилось бы в зависимости от того, где солнце находится на небе.

Edit: Вот код рендеринга:

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

проблема, вероятно, в вашем коде движения/вращения, сообщение также. – DShook

+0

Добавлен код рендеринга – 2009-12-16 21:18:38

ответ

4

http://www.opengl.org/resources/faq/technical/lights.htm

См # 18,050

Короче говоря, вы должны убедиться, что вы определяете ваш свет позиции в правой ссылки и применяя соответствующие преобразования для каждого кадра, чтобы сохранить его там, где вы хотите.

+0

ах, вот и все, спасибо! – 2009-12-16 21:37:52

1

Я считаю, что ваша проблема возникает из-за того, что огни OpenGL указаны в мировых координатах, но хранятся внутри координат камеры. Это означает, что, когда вы размещаете свет, всякий раз, когда вы перемещаете камеру, ваш свет будет двигаться вместе с ней.

Чтобы исправить это, просто перемещайте свои огни всякий раз, когда вы перемещаете камеру.

Смежные вопросы