提问者:小点点

OpenGL 围绕全局轴、俯仰和滚动旋转物体


我对此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度。

tl; dr这个代码确实通过它自己的轴移动我的对象,一个接一个,我需要它围绕起点旋转,改变俯仰和滚动而不改变它的标题

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

我已经试过不调用translateF,或者调用rotations和translate f,然后用负值再次调用它们,看起来都不起作用。

编辑:添加了youtube视频,显示了我的问题,或者更确切地说是我试图达到的效果https://www.youtube.com/watch?v=zc8b2Jo7mno


共1个答案

匿名用户

在花了几个小时阅读了关于euler agles和四元数的文章之后,当我几乎放弃的时候,我突然顿悟了。为了让事情在我的情况下运行,交换两行代码就足够了:

那就是:

 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);