我在 OpenGL 中实现了一个简单的相机系统。我在投影矩阵下设置了 gluPerspective,然后在 ModelView 矩阵上使用了 gluLookAt。在此之后,我有我的主渲染循环,它检查键盘事件,如果按下任何箭头键,则修改角速度和前进速度(我只通过 y 轴旋转并通过 z(向前)移动)。然后我使用以下代码移动视图(deltaTime 是自上一帧渲染以来的时间量,以秒为单位,以便将移动与帧速率分离):
//place our camera
newTime = RunTime(); //get the time since app start
deltaTime = newTime - time; //get the time since the last frame was rendered
time = newTime;
glRotatef(view.angularSpeed*deltaTime,0,1,0); //rotate
glTranslatef(0,0,view.forwardSpeed*deltaTime); //move forwards
//draw our vertices
draw();
//swap buffers
Swap_Buffers();
然后代码再次循环。我的绘图算法以 a 开头,以 aglPushMatrix()
结尾glPopMatrix()
。
每次调用 glRotatef() 和 glTranslatef() 都会以视图方向的向前速度向前推动视图。
但是,当我运行代码时,我的对象被绘制在正确的位置,但是当我移动时,移动是通过世界原点的方向(0,0,0 - 面向 Z 轴)而不是本地方向完成的(我指向的地方)并且当我旋转时,旋转大约是(0,0,0)而不是相机的位置。
我最终得到了我的相机绕行 (0,0,0) 而不是原地旋转的奇怪效果。
我根本不会glLoadIdentity()
在循环内的任何地方调用,并且我确信矩阵模式已设置GL_MODELVIEW
为整个循环。
另一个奇怪的效果是,如果我glLoadIdentity()
在draw(
) 函数中调用(在 PushMatrix 和 PopMatrix 调用之间,屏幕就会变黑,无论我在哪里看,我都找不到我绘制的对象。
有谁知道我为了使这个轨道(0,0,0)而不是当场旋转而搞砸了什么?