如何将方向矢量转换为欧拉角?

时间:2014-02-07 08:40:32

标签: math geometry euler-angles

我正在寻找一种方法将方向矢量(X,Y,Z)转换为欧拉角(航向,俯仰,坡度)。我知道方向矢量本身不足以得到倾斜角度,因此还有另一个所谓的向上矢量。

有方向向量(X,Y,Z)和向上向量(X,Y,Z)如何将其转换为欧拉角?

2 个答案:

答案 0 :(得分:23)

让我们看看我是否理解正确。这是关于三维空间中刚体的定向,如飞行期间的空中飞机。该飞机的机头指向方向向量

D=(XD,YD,ZD) .

靠近屋顶的是向上

U=(XU,YU,ZU) .

然后标题 H将是投射到地球表面的方向向量D

H=(XD,YD,0) ,

具有关联角度

angle_H=atan2(YD,XD) .

音高 P将是鼻子相对于地平线的上/下角度,如果方向向量D被标准化,则可以从

获得
ZD=sin(angle_P)

导致

angle_P=asin(ZD) .

最后,对于倾斜角度,我们考虑机翼的方向,假设机翼垂直于机身。如果飞机直接飞向D,机翼垂直于D并与地球表面平行:

W0 = ( -YD, XD, 0 )

这将是0的倾斜角度。预期的向上矢量将垂直于W0并垂直于D

U0 = W0 × D

×表示交叉产品。如果倾斜角为零,U等于U0,否则UU0之间的角度为倾斜角angle_B,可以从

cos(angle_B) = Dot(U0,U) / abs(U0) / abs(U)
sin(angle_B) = Dot(W0,U) / abs(W0) / abs(U) .

这里'abs'计算向量的长度。从那里你可以获得银行角度

angle_B = atan2( Dot(W0,U) / abs(W0), Dot(U0,U) / abs(U0) ) .

如果UD已标准化,则归一化因素会相互抵消。

答案 1 :(得分:5)

我们需要三个向量:用世界坐标系(WCS)表示的局部坐标系(LCS)的X1,Y1,Z1。下面的代码介绍了如何根据这3个向量计算三个欧拉角。

#include <math.h> 
#include <float.h> 

#define PI 3.141592653589793 
/**
 * @param X1x
 * @param X1y
 * @param X1z X1 vector coordinates
 * @param Y1x
 * @param Y1y
 * @param Y1z Y1 vector coordinates
 * @param Z1x
 * @param Z1y
 * @param Z1z Z1 vector coordinates
 * @param pre precession rotation
 * @param nut nutation rotation
 * @param rot intrinsic rotation
 */
void lcs2Euler(
        double X1x, double X1y, double X1z,
        double Y1x, double Y1y, double Y1z,
        double Z1x, double Z1y, double Z1z,
        double *pre, double *nut, double *rot) {
    double Z1xy = sqrt(Z1x * Z1x + Z1y * Z1y);
    if (Z1xy > DBL_EPSILON) {
        *pre = atan2(Y1x * Z1y - Y1y*Z1x, X1x * Z1y - X1y * Z1x);
        *nut = atan2(Z1xy, Z1z);
        *rot = -atan2(-Z1x, Z1y);
    }
    else {
        *pre = 0.;
        *nut = (Z1z > 0.) ? 0. : PI;
        *rot = -atan2(X1y, X1x);
    }
}