【问题标题】:Find rotation matrix in OpenGL在OpenGL中查找旋转矩阵
【发布时间】:2020-08-05 03:16:26
【问题描述】:

对此持保留态度,我对线性代数几乎一无所知。也就是说,我的问题在于我已经多次乘以当前矩阵的旋转矩阵。本质上,我试图能够在转换之前获得原始矩阵(正确的术语?)。所以理论上,我应该能够“撤消”旋转矩阵。我听说过转置已应用旋转矩阵的矩阵,但是我什至不知道如何获得它。我对如何做到这一点进行了理论化的每种方法最终都导致在将旋转矩阵应用于原始矩阵之前必须知道原始矩阵是什么(或以某种方式找出)。有没有办法在 OpenGL 和/或数学上做到这一点?

提前致谢。最好的问候。

【问题讨论】:

    标签: c# linear-algebra opentk


    【解决方案1】:

    在与 Mike 进行了多次交谈后,我确定他存在一些潜在问题,在尝试解决此问题之前首先需要解决这些问题。似乎他正在使用已弃用的 OpenGL (glPush/Pop),并且无法访问相关矩阵。我已指示他学习现代 opengl,然后在以后再回到这个主题。

    但是,我发现您确实可以从 RTS 变换矩阵中提取旋转。在他正在使用的 OpenTK 中,这是通过使用 Matrix4 的ExtractRotation() 来完成的,它为您提供了四分之一。然后,您使用四元数的ToEulerAngles() 函数来获得一个以弧度表示旋转的 Vector3。最后一步是将这些弧度转换为度数,使用如下所示:

            /// <summary>
            /// Converts radians to degrees.
            /// </summary>
            /// <param name="radians">The angle in radians.</param>
            public static float ToDegrees(float radians)
            {
                return radians * 57.29578f;
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="radians"></param>
            /// <returns></returns>
            public static Vector3 ToDegrees(Vector3 radians)
            {
                return new Vector3(ToDegrees(radians.X),ToDegrees(radians.Y), ToDegrees(radians.Z));
            }
    

    这将使您获得 xy 和 z 分量的旋转。最后应该注意的是,这仅适用于 RTS 转换。最后的意见是,这些都不应该用在性能敏感的代码中;相反,我建议将旋转存储在某处,以便您可以快速引用它而不是尝试提取它,并且如果需要,同步并在其下方的图层上构建转换矩阵。

    【讨论】:

    • 谢谢,抱歉这么晚才回复。感谢您的帮助,我终于解决了这个问题!
    • @MikeFernandez 编码快乐,老兄!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多