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

时间:2011-07-29 08:23:57

标签: xcode opengl matrix rotation

我在OpenGL中提取模型矩阵 glGetFloatv(GL_MODELVIEW_MATRIX,(float *)x)

并且想从得到的4x4矩阵中提取x,y和z轴旋转。我怎样才能做到这一点 ? 谢谢!

3 个答案:

答案 0 :(得分:3)

首先你应该知道,称为欧拉角的x,y,z轴旋转存在严重的数值问题。他们也不是毫不含糊的。因此,要么存储旋转角度和旋转轴,从而有效地伪装形成四元数,要么坚持使用完整的旋转矩阵。

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

答案 1 :(得分:1)

我正在编写一个类似CAD的应用程序,所以我理解你的问题,我们在业务中'知道Euler角度对于线性变换有多糟糕 - 但最终用户发现它们比矩阵或四元数更直观。

对于我的应用程序,我解释了Ken Shoemake的精彩算法,它是支持任意轮换命令的极少数算法之一。它来自'93,所以它是纯C代码 - 不适合胆小的人!

http://tog.acm.org/resources/GraphicsGems/gemsiv/euler_angle/

答案 2 :(得分:0)

这样的事情会给你你想要的东西。

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个四元数之间进行插值时,我使用它作为实用函数打印出摄像机角度,这些四元数是从2个4x4矩阵中导出的(即2个3D点之间的摄像机移动)。