如何在 OpenGL 中围绕 Z 轴中心旋转对象?

Posted

技术标签:

【中文标题】如何在 OpenGL 中围绕 Z 轴中心旋转对象?【英文标题】:How do I rotate object around its center in Z axis in OpenGL? 【发布时间】:2019-09-09 17:22:18 【问题描述】:

当我使用旋转矩阵围绕 Z 轴旋转我的正方形时,它实际上是围绕它制作小圆圈,而不是实际旋转到位。我希望它像***一样旋转。

我试过先旋转然后平移,然后反之亦然,但它不起作用。我已经阅读了人们在网上提出的一些问题,但都是在旧的 OpenGL 中。

我的矩阵码:

public static Matrix4f createTranslateMatrix(Vector3f t) 
        Matrix4f tM = new Matrix4f();

        Matrix4f.translate(t, tM, tM);

        return tM;

    

    public static Matrix4f createRotateMatrixZ(float z) 
        Matrix4f zM = new Matrix4f();

        Matrix4f.rotate((float) Math.toRadians(z), new Vector3f(0,0,1), zM, zM);

        return zM;
    

渲染代码:

GL30.glBindVertexArray(cube_model.vaoID);
                    GL20.glEnableVertexAttribArray(0);
                    GL20.glEnableVertexAttribArray(1);



                        Matrix4f translateM = Maths.createTranslateMatrix(new Vector3f(0.0f, Display.getWidth() - 200f, 0.0f));
                    Matrix4f rotateM = Maths.createRotateMatrixZ(increaseRotation);
                    Matrix4f translateM2 = Maths.createTranslateMatrix(new Vector3f(0.0f, 0.0f, 0.0f));


                    Matrix4f modelM = new Matrix4f();
                    modelM.setIdentity();

                    Matrix4f.mul(translateM2, rotateM, modelM);
                    Matrix4f.mul(modelM, translateM, modelM);


                    shader.loadModelMatrix(modelM);



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

                        increaseRotation += 1f;
                        if(increaseRotation == 360.0f) 
                            increaseRotation = 0;
                        


                    GL20.glDisableVertexAttribArray(0);
                    GL20.glDisableVertexAttribArray(1);
            GL30.glBindVertexArray(0);

四:

    private static final float vertices[] = 
            -Display.getWidth() / 5, 0.0f, 0.0f,                        1.0f,1.0f,1.0f,1.0f,
            Display.getWidth() / 5, 0.0f, 0.0f,                         0.0f,1.0f,1.0f,1.0f,
            -Display.getWidth() / 5, Display.getHeight() / 5, 0.0f,     1.0f,1.0f,1.0f,1.0f,

            Display.getWidth() / 5, 0.0f, 0.0f,                         1.0f,1.0f,1.0f,1.0f,
            Display.getWidth() / 5, Display.getHeight() /5, 0.0f,       0.0f,1.0f,1.0f,1.0f,
            -Display.getWidth() / 5, Display.getHeight() / 5, 0.0f,     1.0f,1.0f,1.0f,1.0f
    ;

正交矩阵:

public static Matrix4f createOrthoMatrix(final float l, final float r, final float b, final float t, final float n, final float f ) 
         Matrix4f orthoM = new Matrix4f();

         orthoM.m00 = 2 / (r - l);
         orthoM.m03 = -(r+l)/(r-l);
         orthoM.m11 = 2/(t-b);
         orthoM.m13 = -(t+b)/(t-b);
         orthoM.m22 = -2/(f-n);
         orthoM.m23 = -(f+n)/(f-n);
         orthoM.m33 = 1;


        return orthoM;


    

正交矩阵初始化:

        loadProjectionMatrix(Maths.createOrthoMatrix(-Display.getWidth(), Display.getWidth(), -Display.getHeight(), Display.getHeight(), 0.1f, 1000));

我希望对象在原地旋转而不是围绕它的某些边缘旋转。

【问题讨论】:

我已经更新了帖子中Quad的代码。 好的。您的三角形以 z 轴为中心。那你为什么要使用那些翻译矩阵呢?它们基本上将旋转原点从世界中心移开。 我正在尝试一些东西。我不太明白你的意思?谢谢你帮助我,你能告诉我我该怎么做才能理解吗?这不是我为学习 OpenGL 而创建的我自己的项目的作业。刚才我尝试只使用 createRotationMatrix 并且它也在做同样的事情。它绕着某个点旋转,它不像***一样在原地旋转。 【参考方案1】:

旋转总是围绕坐标系的原点进行。因此,您首先必须将几何体平移到原点,然后旋转,然后再平移回来。

【讨论】:

您好,感谢您的回复。我已经尝试过了,但我不确定我是否做得正确。我首先做了那个 createTranslate 并放入 Vector3f 0,0,0 然后放入旋转,然后再次在 y 中使用 Display.height() 进行 createTranslate。它仍然没有正确旋转到位。 @GoldSpark:请注意,从世界空间来看,操作顺序是“向后”的。我建议你试试如果你颠倒 translate-rotate-translate 的顺序会发生什么。 我在这里尝试过,现在立方体围绕点做了更大的圆圈。我在渲染器中更新了相关代码。

以上是关于如何在 OpenGL 中围绕 Z 轴中心旋转对象?的主要内容,如果未能解决你的问题,请参考以下文章

opengl 围绕固定轴旋转对象

围绕对象旋转的矩阵乘法opengl

如何围绕任意轴旋转一个点?

围绕世界轴OpenGL旋转对象

如何在 OpenGL 中更改旋转中心

通过滑块在世界空间中围绕轴 x、y、z 旋转图元