OpenGL旋转和平移问题
Posted
技术标签:
【中文标题】OpenGL旋转和平移问题【英文标题】:OpenGL rotate and translate problems 【发布时间】:2011-12-06 14:48:03 【问题描述】:我有一个平面对象,我希望它能够向前移动和左右旋转。我希望飞机朝着它所面对的方向前进。
这是我的代码,但它不起作用,我哪里出错了?
directionX=sin(heading*M_PI/180.0);
directionZ=-cos(heading*M_PI/180.0);
if(keys['W'])
eyeX += directionX;
eyeZ += directionZ;
if(keys['S'])
eyeX -= directionX;
eyeZ -= directionZ;
if(keys[VK_LEFT])
heading -= 1;
if(keys[VK_RIGHT])
heading += 1;
平面使用航向旋转,并使用 eyeX 和 eyeZ 平移。
//Aircraft
glPushMatrix();
glRotatef(-heading, 0,1,0);
glTranslatef(eyeX,eyeY,eyeZ);
model.speedDisplayFaceNormals();
//model.drawBoundingBox();
//model.drawOctreeLeaves();
glPopMatrix();
【问题讨论】:
你应该更清楚地描述它是如何不工作的。描述您如何选择坐标轴的方向也是有意义的。 另外,请发布您的 glRotate/glTranslate 代码,或者这些东西实际影响您的矩阵的代码。 但是它到底有什么问题呢?更具描述性。 【参考方案1】:这有点像在不知道实际行为的情况下在黑暗中拍摄,但您可以尝试将调用顺序切换到 glRotatef
和 glTranslatef
。
【讨论】:
这几乎肯定是问题所在。在他的代码中,它将首先将对象移动到eye
,然后围绕位于 (0, 0, 0) 处的 Y 轴旋转,如果eye
远离原点,则会将对象移动一个巨大的弧线。【参考方案2】:
在 OpenGL 中,眼睛位于 0,0,0 并向下看负 Z 轴。因此,如果您想使用基于眼睛/相机坐标的系统,那么您需要在开始时按以下顺序做两件事:
1 - 根据系统中相机的方向旋转场景 2 - glTranslatef(-EyeX,-EyeY,-EyeZ) 这会将您带到场景坐标系中的 0,0,0。
然后您可以转换到对象的位置,并相应地旋转和渲染它们。几年前我对此做了一些笔记,这就是我当时在查看代表玩家位置第一人称风格的 The Eye 坐标时的做法。
【讨论】:
以上是关于OpenGL旋转和平移问题的主要内容,如果未能解决你的问题,请参考以下文章