【发布时间】:2014-06-14 17:10:15
【问题描述】:
我有一个 XYZ 坐标系,我按欧拉角旋转,从 X 开始,然后是 Y,然后是 Z。我需要将此旋转转换为等效的 XYZ 旋转,但相对于另一个坐标系,如指定通过四元数方向。不幸的是,我被卡住了。
【问题讨论】:
标签: c++ 3d rotation euler-angles
我有一个 XYZ 坐标系,我按欧拉角旋转,从 X 开始,然后是 Y,然后是 Z。我需要将此旋转转换为等效的 XYZ 旋转,但相对于另一个坐标系,如指定通过四元数方向。不幸的是,我被卡住了。
【问题讨论】:
标签: c++ 3d rotation euler-angles
没有简单的方法可以做到这一点,因为欧拉角仅在它们的无穷小版本中与旋转矩阵的乘积兼容。
在给定条件下最简单的方法是将现有角度转换为旋转的四元数,将两个四元数相乘并从乘积中提取新的欧拉角。
一个有用的链接,收集了许多(如果不是全部)轴旋转到四元数和反向变换:http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToQuaternion/index.htm
用 a,b,c 表示绕 X,Y,Z 轴旋转的半角,用 (ca,sa) 等表示相应的余弦-正弦对。那么绕X轴旋转2a角对应四元数
ca+sa*i
其中 i,j,k 是 x,y,z 方向的基四元数。旋转Rz(2c)*Ry(2b)*Rx(2a)对应四元数
r=(cc+sc*k)*(cb+sb*j)*(ca+sa*i)
如果q是另一个单位四元数,那么q对应的旋转的旋转基是qiq', qiq', qkq',其中q'是q的共轭。目的是在这个新的基础上用轴旋转来表示 r。如果新的半角是u,v,w,那么就必须解
r=(cw+sw*qkq')*(cv+sv*qjq')*(cu+su*qiq')
对于这些半角,由于 qq'=1=q'q 来简化
q'rq=(cw+sw*k)*(cv+sv*j)*(cu+su*i)
现在您可以再次使用网站上的公式了。
【讨论】: