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】:

这有点像在不知道实际行为的情况下在黑暗中拍摄,但您可以尝试将调用顺序切换到 glRotatefglTranslatef

【讨论】:

这几乎肯定是问题所在。在他的代码中,它将首先将对象移动到eye,然后围绕位于 (0, 0, 0) 处的 Y 轴旋转,如果eye 远离原点,则会将对象移动一个巨大的弧线。【参考方案2】:

在 OpenGL 中,眼睛位于 0,0,0 并向下看负 Z 轴。因此,如果您想使用基于眼睛/相机坐标的系统,那么您需要在开始时按以下顺序做两件事:

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

然后您可以转换到对象的位置,并相应地旋转和渲染它们。几年前我对此做了一些笔记,这就是我当时在查看代表玩家位置第一人称风格的 The Eye 坐标时的做法。

【讨论】:

以上是关于OpenGL旋转和平移问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL 固定功能旋转和平移 2D 图像

OpenGL旋转和平移

旋转前后的 OpenGL 平移

OpenGL 链式平移/旋转

OpenGL:组合平移/旋转/缩放矩阵或将它们分开?

OpenGL ES平移矩阵和旋转矩阵的左乘与右乘效果