2011-06-01 103 views
3

我想提出一个光在被固定在某个点现场固定的光源。下面介绍一下OpenGL site不得不说的是:创建,保留它的世界坐标

我怎样才能让我的光相对固定的留到我的场景?我怎样才能在角落里放一盏灯,让它留在那里,而我改变了我的看法?

随着你的看法的改变,你的模型视图矩阵也改变。这意味着您需要重新指定灯光位置,通常在每个帧的开始处。一个典型的应用程序将显示用下面的伪代码的帧:

  • 设置视图变换。
  • *设置光源的位置// 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(); 
+0

什么是在lpos [] = {0,0,0,w}中设置的变量'w';?它应该是一个,否则你会得到一些缩放效果。 – Zilchonum 2011-06-14 22:52:51

回答

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,然后再转换光线并绘制几何图形,然后再次弹出相机转换矩阵。这样,您可以确定您的灯光和几何图形如预期保持一致。

+0

我根据你的建议解决了这个问题。谢谢!为了帮助其他人解决这个问题,我附上我的代码来解决这个问题。 – Pieter 2011-06-02 20:13:41