我在游戏世界中绘制建筑物,我用以下代码对它们进行着色:
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
}
答案 0 :(得分:4)
http://www.opengl.org/resources/faq/technical/lights.htm
参见#18.050
简而言之,您需要确保在右侧参照系中定义光线位置,并在每个帧中应用适当的变换以将其保持在您想要的位置。
答案 1 :(得分:1)
我认为您的问题源于OpenGL Lights在World Coordinates中指定,但内部存储在Camera Coordinates中。这意味着一旦你放置了一盏灯,每当你移动你的相机时,你的灯就会随之移动。
要解决此问题,只需在移动相机时重新定位灯光。