线性变换旋转矩阵的推导过程

设向量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)]

= [

[(cosΘ *xv + (1-cosΘ)*x2n * xv) + ((1-cosΘ)*xn *yn *yv +sinΘ*zn*yv)+ ((1-cosΘ)*x*zn *zv - sinΘ*yn*zv)] ,

[ ((1-cosΘ)*x*y*xv - sinΘ*zn*xv) +(cosΘ*yv +(1-cosΘ)*y2n*yv) +((1-cosΘ)*yn*zn*zv + sinΘ*xn*zv)],

[((1-cosΘ)*x*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]

]

 

 

 

原文地址:https://www.cnblogs.com/begodlike/p/5559328.html