【发布时间】:2012-06-23 15:42:02
【问题描述】:
我正在尝试从旋转矩阵中提取欧拉角。 我的约定: 矩阵列主要,右手坐标系,右手正角,旋转顺序 YXZ(先航向,然后是姿态,然后是坡度)
我找到了这个,但无法使用它,因为他们使用其他轴顺序:(http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToEuler/index.htm)
/** this conversion uses conventions as described on page:
* http://www.euclideanspace.com/maths/geometry/rotations/euler/index.htm
* Coordinate System: right hand
* Positive angle: right hand
* Order of euler angles: heading first, then attitude, then bank
* matrix row column ordering:
* [m00 m01 m02]
* [m10 m11 m12]
* [m20 m21 m22]*/
public final void rotate(matrix m) {
// Assuming the angles are in radians.
if (m.m10 > 0.998) { // singularity at north pole
heading = Math.atan2(m.m02,m.m22);
attitude = Math.PI/2;
bank = 0;
return;
}
if (m.m10 < -0.998) { // singularity at south pole
heading = Math.atan2(m.m02,m.m22);
attitude = -Math.PI/2;
bank = 0;
return;
}
heading = Math.atan2(-m.m20,m.m00);
bank = Math.atan2(-m.m12,m.m11);
attitude = Math.asin(m.m10);
}
【问题讨论】:
-
您确定要“态度、航向、银行”吗?我假设在飞机术语中,姿态意味着俯仰,航向意味着偏航。如果您不首先进行标题,则它不再是具有地理意义的标题。
-
你是对的,我已经改变了问题,我想要实现的旋转顺序是偏航、俯仰、滚动。问题是我的轴与我发布的示例中的轴不同。我使用,yaw=Y,pitch=X,roll=Z,而示例使用yaw=Y,pitch=Z,roll=X。
标签: c++ matrix-multiplication opengl-3