设向量v和向量n,并且 ||n|| = 1,计算向量v绕向量n顺时针旋转Θ的旋转矩阵R。
如上图所示,把向量v分成两部分:平行于n的部分projn(v)和垂直于n的部分v⊥,其中v⊥ = v - projn(v) . projn(v)为v在n方向上的投影, projn(v) = (n.v)n.
平行于n的部分在旋转时不会发生变化,所以只需考虑垂直于n的部分的旋转即可。V⊥的旋转结果记为Rn (V⊥). Rn (V⊥) = cosΘ*V⊥ +sinΘ*(nxv).
最后 Rn(V) = projn(v) + Rn (V⊥)
= (n.v)n + cosΘ*V⊥ +sinΘ*(nxv)
= (n.v)n + cosΘ* (v - projn(v)) +sinΘ*(nxv)
= cosΘ*v + (1-cosΘ)(n.v)n+sinΘ*(nxv)
设向量v为[xv,yv,zv],向量n为[xn,yn,zn]. 展开上式右边 =
= cosΘ*[xv,yv,zv] + (1-cosΘ)*(xn*xv,yn*yv,zn*zv)[xn,yn,zn]T + sinΘ[(yn * zv - zn* yv),(zn * xv - xn* zv),(xn * yv - yn* xv)]T
= [
[(cosΘ *xv + (1-cosΘ)*x2n * xv) + ((1-cosΘ)*xn *yn *yv +sinΘ*zn*yv)+ ((1-cosΘ)*xn *zn *zv - sinΘ*yn*zv)] ,
[ ((1-cosΘ)*xn *yn *xv - sinΘ*zn*xv) +(cosΘ*yv +(1-cosΘ)*y2n*yv) +((1-cosΘ)*yn*zn*zv + sinΘ*xn*zv)],
[((1-cosΘ)*xn *zn *xv + sinΘ*yn*xv) +((1-cosΘ)*yn*zn*yv - sinΘ*xn*yv) +((1-cosΘ)*z2n*zv + cosΘ*zv)]
]
设R 为[ [R11,R12,R13] ,[R21,R22,R23],[R31,R32,R33]]
左边 = [xv,yv,zv]* R
= [
[xv* R11 + yv* R21 + zv* R31] ,
[xv* R12 + yv* R22 + zv* R32],
[xv* R13 + yv* R23 + zv* R33]
]
由于左边 = 右边 ,对应相等,并记 cosΘ 为 c , sinΘ 为 s,则R =
[
[(c+ (1-c)*x2n) + ((1-c)*xn *yn+s*zn)+ ((1-c)*xn *zn- s*yn)] ,
[ ((1-c)*xn *yn - s*zn) +(c +(1-c)*y2n) +((1-c)*yn*zn + s*xn)],
[((1-c)*xn *zn + s*yn) +((1-c)*yn*zn - s*xn) +((1-c)*z2n + c)]
]
特别的,当n为[1,0,0],[0,1,0],[0,0,1]时,R分别为
[
[1,0,0,0],
[ 0,c,s,0],
[0,-s,c,0],
[0,0,0,1]
]
、
[
[c,0,-s,0],
[ 0,1,0,0],
[s,0,c,0],
[0,0,0,1]
]
、
[
[c,s,0,0],
[-s,c,0,0],
[0,0,1,0],
[0,0,0,1]
]