2011-12-06 136 views
0

我有一个平面对象,我希望它能够向前移动和左右旋转。我希望飞机能够朝着它所面对的方向前进。OpenGL旋转和翻译问题

这是我的代码,但它不工作,我哪里错了?

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(); 
+1

你应该更清楚地描述它是如何工作的。描述你如何选择定位你的坐标轴也是有意义的。 – unwind

+0

另外,请发布您的glRotate/glTranslate代码,或代码,这些东西实际上影响您的矩阵。 –

+0

我添加了它如何使用它.. – user195257

回答

2

这有点在黑暗中拍摄不知道你得到的实际行为,但你可以尝试调用的顺序切换到glRotatefglTranslatef

+0

这几乎肯定是问题所在。在他的代码中,它将首先将对象移动到“眼睛”,然后围绕居住在(0,0,0)的Y轴旋转,如果“眼睛”远离原点,则会将对象移动到一个巨大的弧。 –

0

在OpenGL中,眼睛位于0,0,0处,向下看负Z轴。所以,如果你想使用基于眼睛/相机协调的系统,那么你需要在开始时按照以下顺序做两件事:

1 - 根据系统中相机的方向旋转场景 2 - glTranslatef(-EyeX,-EyeY,-EyeZ)这会将您带到场景坐标系中的0,0,0。

然后,您可以转换为您的对象的位置,相应地旋转和渲染它们。几年前,我在这方面做了一些笔记,这就是当我看着表示玩家位置第一人称风格的眼球坐标时的情况。