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

标签 math geometry euler-angles

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

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

最佳答案

看看我的理解是否正确。这是关于三维空间中刚体的方向,就像飞行中的飞机一样。该飞机的机头指向方向矢量

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) .

最后,对于倾斜角,我们考虑机翼的方向,假设机翼垂直于 body 。如果飞机直线飞向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标准化,标准化因子就会相互抵消。

关于math - 如何将方向向量转换为欧拉角?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21622956/

相关文章:

java - 将整数表示为连续正整数之和

algorithm - 包含一组点的多边形

swift - 如何将无人机相机的欧拉角和高度转换为像心坐标?

iphone - 使用横滚、俯仰和偏航或四元数或旋转矩阵从 CMAttitude 计算高度和方位角

python - 斐波那契在 Python 中很奇怪

c# - 无需 GA/GC 即可最佳获取千分之一秒字符串

c# - 如何根据两个坐标计算角度?

algorithm - 寻找算法 : skeleton generation for raster images

math - 基于四元数的 3D 相机应该累积四元数还是欧拉角?

javascript - jQuery 或数学使用宽度百分比减去 div 的像素 - jSfiddle