C# OpenGL-OpenTK旋转问题

C# OpenGL-OpenTK旋转问题,c#,opengl,3d,matrix,rotation,C#,Opengl,3d,Matrix,Rotation,我是一个真正的noob,刚开始学习3d编程,我很难学习3d空间中的旋转。我的问题是,我似乎不知道如何使用对象的局部坐标旋转对象 我有一个3d对象的基本类,对于初学者来说,我想实现将对象在某个轴上旋转x度的函数。到目前为止,我有以下几点: public void RollDeg(float angle) { this.rotation = Matrix4.Mult(rotation, Matrix4.CreateRotationX(MyMath.

我是一个真正的noob,刚开始学习3d编程,我很难学习3d空间中的旋转。我的问题是,我似乎不知道如何使用对象的局部坐标旋转对象

我有一个3d对象的基本类,对于初学者来说,我想实现将对象在某个轴上旋转x度的函数。到目前为止,我有以下几点:

 public void RollDeg(float angle)
    {
        this.rotation = Matrix4.Mult(rotation, 
            Matrix4.CreateRotationX(MyMath.Conversions.DegToRad(angle)));
    }

    public void PitchDeg(float angle)
    {
        this.rotation = Matrix4.Mult(rotation, 
             Matrix4.CreateRotationY(MyMath.Conversions.DegToRad(angle)));
    }

    public void YawDeg(float angle)
    {
        this.rotation = Matrix4.Mult(rotation,
             Matrix4.CreateRotationZ(MyMath.Conversions.DegToRad(angle)));
    }
“旋转”是以单位矩阵开始的4x4矩阵。每次我想要滚动/俯仰/偏航对象时,我调用上面的函数之一

对于绘图,我使用另一个函数将矩阵推到ModelView堆栈上,将其与对象的平移、旋转和缩放矩阵相乘(按此顺序),然后开始绘制顶点。当然,最后我将矩阵从堆栈中弹出

问题是,上面的函数在全局轴上旋转对象,而不是在局部轴上旋转对象,即使根据我的理解,每次旋转对象时,局部系统都会更改其轴,然后,当在其他轴上应用新的旋转时,局部轴将用于新的旋转

我读了不同的教程,关于它背后的数学和如何旋转对象,但我找不到一个可以帮助我的


如果有人有时间,如果他能帮助我理解如何围绕局部轴旋转,也许更重要的是,我在当前实现中犯了什么错误,我将不胜感激。

如果您想按以下顺序执行转换:平移->旋转->缩放(这很有道理,这是通常需要的),你必须以相反的顺序乘以你的矩阵

在右手坐标系(即openGL使用的坐标系)中,矩阵乘法必须从右向左执行。这就是为什么:


ModelViewTransform=Transform*View*Model//只是吗?有趣多了:)@sje377:nop,不是万向节。每一个旋转都是全局进行的,这就是问题所在,我不是说轴重叠@卡尔文1602:我知道,这是最让我烦恼的事情:我不知道我错过了什么。没有使用调试器。也许我应该把整个班级都贴上去?问题可能隐藏在其他地方吗?抱歉,评论错误,请参阅答案。但关于调试器的评论仍然成立:使用iTook,所以:有平均值,有愚蠢,有非常愚蠢,有头脑清醒的愚蠢,还有我:我第一千次看到右手坐标系(感谢卡尔文)来考虑反转旋转矩阵乘法的顺序。问题是我将“oldnew”而不是“newold”相乘。我在RTS转换中遇到了这个麻烦的问题,并解决了它,即使是在x/y/z顺序下,也解决了它。我无法停下来让自己惊讶:“再次感谢!