猿问

如何修复在 OpenGL 中沿 x 或 y 轴旋转时奇怪的对象拉伸?

当我使用旋转矩阵在 openGL 中旋转我的正方形时,当我想围绕 X 或 Y 轴旋转它时,整个对象消失并拉伸。Z 轴工作正常。问题可能是什么?


我尝试在 DrawArrays 之前加载uniformMatrix4f,但它不起作用。仍然是同样的问题。翻译工作正常且可扩展。


渲染方法


public void render(Player model, Cube cube_model, StaticShader shader) {


        GL30.glBindVertexArray(model.vaoID);

        GL20.glEnableVertexAttribArray(0);

        GL20.glEnableVertexAttribArray(1);


        shader.loadModelMatrix(Maths.createModelMatrix(new Vector3f(move_X,-Display.getHeight(),0f), 0f,0f,tilt_Y,1f));


        GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);


        GL20.glDisableVertexAttribArray(1);

        GL20.glDisableVertexAttribArray(0);


        GL30.glBindVertexArray(0);


        GL30.glBindVertexArray(cube_model.vaoID);

        GL20.glEnableVertexAttribArray(0);

        GL20.glEnableVertexAttribArray(1);

        shader.loadModelMatrix(Maths.createModelMatrix(new Vector3f(0f,Display.getHeight() - 200f,0f), 0f,increaseRotation,0f,0.5f));


        GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, 6);


        increaseRotation += 1f;

        GL20.glDisableVertexAttribArray(0);

        GL20.glDisableVertexAttribArray(1);

        GL30.glBindVertexArray(0);

    }

矩阵数学:


public static Matrix4f createModelMatrix(Vector3f t, float rx, float ry, float rz, float s) {

        Matrix4f modelMatrix = new Matrix4f();

        modelMatrix.setIdentity();


        Matrix4f.translate(t, modelMatrix, modelMatrix);

        Matrix4f.rotate((float) Math.toRadians(rx), new Vector3f(1,0,0), modelMatrix, modelMatrix);

        Matrix4f.rotate((float) Math.toRadians(ry), new Vector3f(0,1,0), modelMatrix, modelMatrix);

        Matrix4f.rotate((float) Math.toRadians(rz), new Vector3f(0,0,1), modelMatrix, modelMatrix);

        Matrix4f.scale(new Vector3f(s,s,s), modelMatrix, modelMatrix);


        return modelMatrix;

    }

我期望立方体正常地在 Y 轴上旋转到位,但它实际上正在旋转并消失,然后它的一条线在中间出现拉伸并消失。


拉风的咖菲猫
浏览 96回答 1
1回答

青春有我

我想围绕 X 或 Y 轴旋转它,整个对象消失并拉伸。Z 轴工作正常。当然。你的物体是一个二维物体。它只是一个具有二维 x 和 y 的平面。x 轴和 y 轴平行于视口。z 轴指向视口之外。如果绕 z 轴(在 xy 平面中)旋转,对象将保持其大小并旋转。但如果绕 x 轴旋转,则对象似乎沿 y 轴拉伸并以 90° 和 270° 的角度消失。如果绕 y 轴旋转,则对象似乎沿 x 轴拉伸。由于正交投影,围绕 x 和 y 轴的旋转看起来“平坦” 。实际上,您没有投影矩阵,因此场景是并行投影的(正交)。如果你想“看到”3维旋转,那么你必须使用透视投影
随时随地看视频慕课网APP

相关分类

Java
我要回答