Xcode 将OpenGL 4x4矩阵转换为旋转角度

Xcode 将OpenGL 4x4矩阵转换为旋转角度,xcode,opengl,matrix,rotation,Xcode,Opengl,Matrix,Rotation,我正在OpenGL中使用 glGetFloatv(GL_模型视图_矩阵,(float*)x) 并希望从生成的4x4矩阵中提取x、y和z轴旋转。我该怎么做? 谢谢 首先,您应该知道,x、y、z轴旋转(称为欧拉角)会遇到严重的数值问题。而且它们也不是明确的。因此,要么存储旋转角度和旋转轴,从而有效地伪装成一个四元数,要么使用完整的旋转矩阵 从旋转矩阵求四元数称为特征值问题。从技术上讲,你是在确定旋转矩阵的特征向量,它是轴,幅值表示角度。类似的东西应该会告诉你你想要什么 final double ro

我正在OpenGL中使用 glGetFloatv(GL_模型视图_矩阵,(float*)x)

并希望从生成的4x4矩阵中提取x、y和z轴旋转。我该怎么做?
谢谢

首先,您应该知道,x、y、z轴旋转(称为欧拉角)会遇到严重的数值问题。而且它们也不是明确的。因此,要么存储旋转角度和旋转轴,从而有效地伪装成一个四元数,要么使用完整的旋转矩阵


从旋转矩阵求四元数称为特征值问题。从技术上讲,你是在确定旋转矩阵的特征向量,它是轴,幅值表示角度。

类似的东西应该会告诉你你想要什么

final double roll = Math.atan2(2 * (quat.getW() * quat.getX() + quat.getY() * quat.getZ()),
            1 - 2 * (quat.getX() * quat.getX() + quat.getY() * quat.getY()));
final double pitch = Math.asin(2 * (quat.getW() * quat.getY() - quat.getZ() * quat.getY()));
final double yaw = Math.atan2(2 * (quat.getW() * quat.getZ() + quat.getX() * quat.getY()), 1 - 2 * (quat.getY()
            * quat.getY() + quat.getZ() * quat.getZ()));

当我使用SLERP在从2个4x4矩阵导出的2个四元数之间进行插值时,我使用这个实用函数来打印相机角度(即相机在2个3D点之间的移动)。

我正在编写一个类似CAD的应用程序,因此我理解您的问题,我们“业内人士”知道线性变换的欧拉角有多糟糕,但最终用户发现它们比矩阵或四元数直观得多

对于我的应用程序,我解释了Ken Shoemake的精彩算法,它是极少数支持任意旋转顺序的应用程序之一。它是93年的,所以它是纯C代码的-不适合胆小的人


看看这个SOQ谢谢,我尝试在其中应用脚本,但结果并不完全正确。例如,我设置为OpenGL xyz rot=[80,80,80],链接中的脚本返回我[-85,70,-85]。知道为什么会这样吗?谢谢旋转的顺序非常重要…xyz可能必须应用zyx(可能)通常它们被称为euler角并应用航向俯仰滚转。euler角的坏处(或一个坏处)是,每个人都使用不同的约定(轴及其顺序),并隐式假设他的约定是标准,因此,您应该经常仔细检查,您和其他人可能使用的12种约定中的哪一种。谢谢您的回答。然而,我的四元数是4x4矩阵,其中第一个3x3用于旋转。但是,我无法在您的代码中检索mat[0-1-2/4-5-6/8-9-10]与getX、Y、Z或W之间的映射。有什么提示吗?谢谢如果您使用Java和vecmath库,则可以通过
Quat4d quaternion=new Quat4d()创建四元数;四元数集(矩阵)。我之所以喜欢它,是因为我将角度存储在3个变量中,并且在OpenGL的绘图功能中,我对这些角度执行3x glRotate。现在,我想在这3个轴中的一个轴上进一步旋转,因此我使用glRotate的额外时间,并重新向系统请求矩阵,以重新存储我的新旋转角度。有更好的方法吗?@Laurent Crivello:请不要将旋转存储为Euler角,因为混乱和疯狂在它们的尽头等待着你。而是将旋转存储为单个四元数。通过乘以该四元数应用进一步的旋转。将四元数转换为旋转矩阵非常简单,可以使用glMultMatrix将其应用于OpenGL矩阵堆栈。此外,您不应将OpenGL视为数学库;OpenGL-3删除了所有矩阵操作函数,要求用户自己跟踪矩阵。这是为了让人们不知道你在做什么。所以基本上我不应该把x,y,z作为一个数组中的单独角度,使用glRotate命令,而是保留一个3x3旋转矩阵,然后乘以当前矩阵,对吗?@Laurent Crivello:是的,或者使用四分之一。