为什么轴角转换为四元数计算三维旋转使用半角?

简单来说,用半角才能计算出正确的结果,这当然是一句废话,不过尚需证明这一点.

轴角欧拉向量/旋转向量(axis,angle)=(ex, ey, ez, θ).旋转轴对应的单位向量为e=< ex, ey, ez>.v=<x, y, z>绕e逆时针旋转θ到v'.注: v不一定是单位向量.

利用罗德里格旋转公式,旋转后的向量为v':  v' = cosθ*v + sinθ*(e x v) + (1 - cosθ)*(v·k)k     (1)

将轴角转换为单位四元数q:

为什么轴角转换为四元数计算三维旋转使用半角?

四元数q的共轭四元数为:

为什么轴角转换为四元数计算三维旋转使用半角?

设向量v对应的四元数为p: p = pw + pv = 0 + pv = pv = px + py + pz = v·<i,j,k>= <x,y,z>·<i,j,k>= xi + yj + zk.

旋转完成后最终求得v'对应的四元数p':   p' = q * p * p* = cosθ*v·<i,j,k> + sinθ*(e x v)·<i,j,k> + (1 - cosθ)*(v·e)*e·<i,j,k>.

这里需要使用到向量三重叉积内容: A x (B x C) = B x (A·C) - C x (A · B).

令q = qw + qv = qw + e·<i,j,k>*sinθ = cosθ + xsinθ*i + ysinθ*j + zsinθ*k.

则:q* = qw - qv = qw - e·<i,j,k>*sinθ = cosθ - (xsinθ*i + ysinθ*j + zsinθ*k).

计算p''得((注意: p''是四元数pv = v·<i,j,k>,这里是四元数叉乘):

p'' = q * p * q* = (qw + qv) x (pw + pv)x (qw - qv)

= (pw*qw - (qv · pv) + pw*qv + qw*pv + qv x pv) x (qw - qv)

= (0*qw - (qv · pv) + 0*qv + qw*pv + qv x pv) x (qw - qv)

= (-pv·qv + qw*pv + qv x pv) x (qw + (-qv))     (2)

设rw = -pv·qv; rv = qw*pv + qv x pv. 等式(2)转化为:

(rw + rv) x (qw + (-qv))            仍然是四元数的叉乘.

= rw* qw - rv·(-qv) + rw*(-qv) + qw*rv + rvx(-qv)

= rw* qw + rv·qv - rw*qv + qw*rv + qv x rv

= (-pv·qv)* qw + (qw*pv + qv x pv)·qv - (-pv·qv)*qv + qw*(qw*pv + qv x pv) + qv x (qw*pv + qv x pv)

= -(pv·qv)*qw + (qw*pv )·qv + (qv x pv)·qv + (pv·qv)*qv + qw²*pv + qw*(qv x pv) + qv x (qw*pv) + qv x (qv x pv)

= qw*(pv · qv) - qw*(pv · qv) + (qv x pv)·qv + (pv · qv)*qv + qw²*pv + qw*(qv x pv) + qw*(qv x pv) + qv x (qv x pv)

= (qv x pv)·qv + (pv · qv)*qv + qw²*pv + 2*qw*(qv x pv) + qv*(qv · pv) - pv*(qv · qv)

= (qv x pv)·qv + (pv · qv)*qv + qw²*pv + 2*qw*(qv x pv) + (pv · qv)*qv - (qv · qv)*Pv

= (qv x pv)·qv + 2*(pv · qv)*qv + qw²*pv + 2*qw*(qv x pv) - (qv · qv)*pv   (3)

等式(3)为四元数p'',转换为四元向量v'',qv => e*sinθ; pv => v; qw= cosθ;则:

v'' = ((e*sinθ) x v)·(e*sinθ) + 2*(v · (e*sinθ))*(e*sinθ) + cos²θ*v + 2*cosθ*((e*sinθ) x v) - ((e*sinθ) · (e*sinθ))*v

= sin²θ*(v x ee + 2*sin²θ*( v · e)*e + cos²θ*v + 2*cosθ*sinθ*(e x v) - sin²θ*(e·e)*v

= sin²θ*(v x ee + 2*sin²θ*( v · e)*e + cos²θ*v + 2*cosθ*sinθ*(e x v) - sin²θ*(|e|²)*v

= sin²θ*(v x ee + 2sin²θ*( v · e)*e + cos²θ*v + 2cosθsinθ*(e x v) - sin²θ*v

= sin²θ*(v x ee + 2sin²θ*( v · e)*e + (cos²θ- sin²θ)*v + 2cosθsinθ*(e x v)  (4)

等式(4)与上面的等式(1)罗德里格公式相比, v'' v',说明使用θ构造四元数来计算向量v绕轴e的旋转θ结果v''是错误的.

而如果等式(4)使用半角,再看看计算结果:

为什么轴角转换为四元数计算三维旋转使用半角?

等式(5)等式(1)罗德里格公式相比,等式(5)还多了第一项,这也是最有趣的一项,下面具体计算一下看看第一项到底是什么值.

设向量ve的夹角为α,法向量n.  n = <(y*ez - z*ey), (z*ex - x*ez) , (x*ey - y*ex)>

为什么轴角转换为四元数计算三维旋转使用半角?

经过(6)式计算,等式(5)第一项值居然为0,那么用半角计算v''的值为: v'' = (1-cosθ)*(v·e)e + cosθ*v + sinθ*(e x v)

与上面等式(1)罗德里格公式计算的结果一样: v' = v''.说明用四元数计算三维旋转必须用半角才能得到正确的结果.