我对这个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
答案 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);