简单来说,用半角才能计算出正确的结果,这当然是一句废话,不过尚需证明这一点.
轴角欧拉向量/旋转向量(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 * (A·C) - C * (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 e)·e + 2*sin²θ*( v · e)*e + cos²θ*v + 2*cosθ*sinθ*(e x v) - sin²θ*(e·e)*v
= sin²θ*(v x e)·e + 2*sin²θ*( v · e)*e + cos²θ*v + 2*cosθ*sinθ*(e x v) - sin²θ*(|e|²)*v
= sin²θ*(v x e)·e + 2sin²θ*( v · e)*e + cos²θ*v + 2cosθsinθ*(e x v) - sin²θ*v
= sin²θ*(v x e)·e + 2sin²θ*( v · e)*e + (cos²θ- sin²θ)*v + 2cosθsinθ*(e x v) (4)
等式(4)与上面的等式(1)罗德里格公式相比, v'' ≠ v',说明使用θ构造四元数来计算向量v绕轴e的旋转θ结果v''是错误的.
而如果等式(4)使用半角,再看看计算结果:
等式(1)罗德里格公式相比,等式(5)还多了第1项,这也是最有趣的1项(第1次看到这一项一度以为计算过程有误,又检查了2遍才确认这一项应该等于0),下面具体计算一下看看这一项为什么会等于0.
设向量v与e的夹角为α,法向量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''.说明用四元数计算三维旋转必须用半角才能得到正确的结果.