我在OpenGL中提取模型矩阵 glGetFloatv(GL_MODELVIEW_MATRIX,(float *)x)
并且想从得到的4x4矩阵中提取x,y和z轴旋转。我怎样才能做到这一点 ? 谢谢!
答案 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点之间的摄像机移动)。