创建一个保留其世界坐标的固定光源

时间:2011-06-01 17:54:51

标签: opengl

我想在固定在某个地点的场景中放置一盏灯。以下是OpenGL site对此所说的内容:

  

如何让我的灯光相对于我的场景保持固定?当我改变观点时,如何在角落里放一盏灯让它留在那里?

     

随着视图的变化,您的ModelView矩阵也会发生变化。这意味着您需要重新指定灯光位置,通常在每个帧的开头。典型的应用程序将显示具有以下伪代码的帧:

     
      
  • 设置视图转换。
  •   
  • *设置灯光位置// glLightfv(GL_LIGHT_POSITION,...)*
  •   
  • 向下发送场景或模型几何体。
  •   
  • 交换缓冲区。
  •   
     

如果光源是灯具的一部分,您可能还需要指定建模变换,因此灯光位置与周围灯具几何图形位于同一位置。

所以我将其添加到paintGL()函数。

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
gluLookAt(0.0, 5.0, 0.0,
    0.0, 0.0, 0.0,
    0.0, 1.0, 0.0);
GLfloat l0pos[] = {0.0, 0.0, 0.0, 1.0};
glLightfv(GL_LIGHT0, GL_POSITION, l0pos);
glPopMatrix();

当我静止不动时似乎没问题,但是当我移动相机的眼睛位置或相机的中心位置时,灯光会闪烁。我做错了什么?


Update2 :我最终使用了这段代码,但我仍然遇到问题。灯不再移动,但其位置不准确。堆栈顶部的矩阵是由gluLookAt命令生成的矩阵,表示摄像机位置。

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslatef(xCoordinate, yCoordinate, zCoordinate);
GLfloat lpos[] = {0.0, 0.0, 0.0, w};
glLightfv(GL_LIGHT0, GL_POSITION, lpos);
glPopMatrix();

1 个答案:

答案 0 :(得分:4)

然而,我不完全确定这是否是导致症状的原因:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
gluLookAt(0.0, 5.0, 0.0,
    0.0, 0.0, 0.0,
    0.0, 1.0, 0.0);

您可以在此处查看一些内容。

首先,根据在线文档,gluLookAt 通过相机变换矩阵将堆栈顶部的矩阵乘以,而不是设置它(此外,glPushMatrix保留当前矩阵)。因此,在进行相机转换之前确保当前矩阵是单位矩阵是个好主意。推/弹通常就足够了,但是如果你在任何其他转换之后或之内调用gluLookAt,就会发生不好的事情。

其次,您需要使用实际的相机坐标,以便GL可以正确转换灯光位置。否则,灯光将不会随场景几何体移动。我建议做一次gluLookAt,然后在再次弹出相机变换矩阵之前,一次性转换灯光和绘制几何图形。这样你可以确定你的灯光和几何形状按预期保持在一起。