旋转相机时的OpenGL照明问题

4 opengl lighting

我在游戏世界中绘制建筑物,并使用以下代码对其进行着色:

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);
Run Code Online (Sandbox Code Playgroud)

效果很好。

但是,当我开始在世界上飞行时,灯光会对此做出反应,就好像世界是一个正在旋转的物体一样。因此,当我的相机角度改变时,灯光也会改变。

我如何还原该旋转?因此照明会认为我实际上并没有旋转世界,然后我可以使建筑物具有静态阴影,该阴影会根据太阳在天空上的位置而变化。

编辑:这是渲染代码:

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
}
Run Code Online (Sandbox Code Playgroud)

Ron*_*lic 5

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

参见#18.050

简而言之,您需要确保在正确的参考帧中定义光源位置,并在每个帧中应用适当的变换以使其保持在所需位置。