OpenGL旋转对象围绕全局轴,俯仰和滚动

时间:2015-12-15 12:04:25

标签: opengl rotation lwjgl euler-angles

我对这个openGL代码有疑问:

        make3D();
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
        GL11.glClearColor(0.5f, 0.55f, 0.55f, 1.0f);
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
        GLU.gluLookAt(camX, camY, camZ, centerX, centerY, centerZ, upX, upY, upZ);

        // THE PROBLEM IS SOMEWHERE HERE
        // Rotate and render vehicle
        GL11.glPushMatrix();
        GL11.glTranslatef(0.0f, 0f, 0.0f);
        GL11.glRotatef(vehicleRoll, 0.0f, 0.0f, 1.0f);
        GL11.glRotatef(vehiclePitch, 1.0f, 0.0f, 0.0f);
        GL11.glTranslatef(-0.0f, -0f, -0.0f);
        scene.render(ObjectType.VEHICLE);
        GL11.glPopMatrix();

        // Render floor
        GL11.glPushMatrix();
        GL11.glRotatef(vehicleCourse, 0.0f, 1.0f, 0.0f);
        GL11.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        scene.render(ObjectType.ENVIROMENT_FLOOR);
        GL11.glPopMatrix();

        // Draw lights
        setUpLighting();

滚动旋转似乎没问题,物体向侧面旋转(只是翻转),但俯仰旋转无法正常工作。如果我首先将对象滚动30度,然后将音高旋转30度,我希望它能够向下滚动30度,但它会将我的对象旋转两个向量,最后它看起来像15度俯仰和15度旋转也会改变其前进方向。

tl; dr这段代码确实通过自己的轴一个接一个地移动我的对象,我需要它围绕orgin点旋转,在不改变其标题的情况下进行俯仰和滚动

除此之外,第二个对象(地板)是旋转到给定路线,它工作正常。车辆就是问题所在。

我已经尝试过不调用translateF,或者调用旋转并翻译f然后再用负值再次调用它们,似乎没什么可行的。

编辑:添加youtube视频可视化我的问题,或者更确切地说是我试图实现的效果https://www.youtube.com/watch?v=zc8b2Jo7mno&feature=youtu.be&t=111

1 个答案:

答案 0 :(得分:1)

在阅读了有关欧拉阿格勒斯和四元数的几个小时之后,当我几乎放弃时,我突然有了一个顿悟。为了让我的工作能够正常工作,交换两行代码就足够了:

这:

 GL11.glRotatef(vehicleRoll, 0.0f, 0.0f, 1.0f);
 GL11.glRotatef(vehiclePitch, 1.0f, 0.0f, 0.0f);

到那个:

 GL11.glRotatef(vehiclePitch, 1.0f, 0.0f, 0.0f);
 GL11.glRotatef(vehicleRoll, 0.0f, 0.0f, 1.0f);