我在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();
然后代码再次循环。我的绘制算法以glPushMatrix()
开头,以glPopMatrix()
结尾。
每次调用glRotatef()和glTranslatef()都会以向前的速度向视图方向推动视图。
然而,当我运行代码时,我的对象被绘制在正确的位置,但是当我移动时,运动是通过世界原点的方向(0,0,0 - 面向Z轴)完成的,而不是本地方向(我指向的位置)和旋转时,旋转大约是(0,0,0),而不是相机的位置。
我最终得到了我的相机在轨道上运行的奇怪效果(0,0,0),而不是在现场旋转。
我不会在循环内的任何地方调用glLoadIdentity()
,并且我确信矩阵模式在整个循环中设置为GL_MODELVIEW
。
另一个奇怪的效果是,如果我在glLoadIdentity()
)函数中放置一个draw(
调用(在PushMatrix和PopMatrix调用之间,屏幕就会变黑,无论我在哪里,我都找不到我画的对象。
为了制作这个轨道(0,0,0)而不是当场旋转,有人知道我搞砸了什么吗?
答案 0 :(得分:5)
glRotate()
围绕World Origin旋转ModelView Matrix,因此要围绕某个任意点旋转,您需要转换矩阵以使该点位于原点,旋转然后转换回您开始的位置。
我认为你需要的是这个
float x, y, z;//point you want to rotate around
glTranslatef(0,0,view.forwardSpeed*deltaTime); //move forwards
glTranslatef(x,y,z); //translate to origin
glRotatef(view.angularSpeed*deltaTime,0,1,0); //rotate
glTranslatef(-x,-y,-z); //translate back
//draw our vertices
draw();
//swap buffers
Swap_Buffers();
答案 1 :(得分:1)
交换你的旋转并翻译来电:)
由于他们将矩阵堆叠后加倍,所以被调用的最后一个是概念上应用的“第一”,如果你关心那种东西。
答案 2 :(得分:0)
我认为您首先必须将相机转换为点(0,0,0)然后旋转,然后将其翻译回来。