当它们应该在Local Origin周围时,OpenGL围绕World Origin旋转

时间:2009-12-30 00:13:35

标签: c++ opengl matrix rotation transform

我在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)而不是当场旋转,有人知道我搞砸了什么吗?

3 个答案:

答案 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)然后旋转,然后将其翻译回来。