Проблема с освещением OpenGL при повороте камеры - PullRequest
3 голосов
/ 17 декабря 2009

Я рисую здания в своем игровом мире, закрашиваю их следующим кодом:

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
}

Ответы [ 2 ]

4 голосов
/ 17 декабря 2009

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

См. # 18.050

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

1 голос
/ 17 декабря 2009

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

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

...