旋转相机时OpenGL照明问题

时间:2009-12-16 21:12:01

标签: 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);

效果很好。

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

如何恢复旋转?所以灯光会认为我实际上并没有旋转世界,然后我可以让我的建筑物有静态阴影,这会根据太阳在天空的位置而改变。

编辑:这是渲染代码:

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 个答案:

答案 0 :(得分:4)

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

参见#18.050

简而言之,您需要确保在右侧参照系中定义光线位置,并在每个帧中应用适当的变换以将其保持在您想要的位置。

答案 1 :(得分:1)

我认为您的问题源于OpenGL Lights在World Coordinates中指定,但内部存储在Camera Coordinates中。这意味着一旦你放置了一盏灯,每当你移动你的相机时,你的灯就会随之移动。

要解决此问题,只需在移动相机时重新定位灯光。