线性代数中的平移、缩放和旋转矩阵

平移矩阵 Translate Matrix

T=[100x 010y 001z 0001 ]

缩放矩阵 Scale Matrix

S=[x000 0y00 00z0 0001 ]

旋转矩阵 Rotate Matrix

绕(1,0,0)旋转\theta角度

R(1,0,0)=[1000 0cosθsinθ0 0sinθcosθ0 0001 ]

绕(0,1,0)旋转\theta角度

R(0,1,0)=[cosθ0sinθ0 0100 sinθ0cosθ0 0001 ]

绕(0,0,1)旋转\theta角度

R(0,0,1)=[cosθsinθ00 sinθcosθ00 0010 0001 ]

绕任意轴旋转\theta角度

设旋转轴为n,这是一个单位化的方向向量。设被旋转的向量为v,被旋转后是v

为了求出v,需要迂回地处理:

  • v 分解为 v=v+vv指的是vn平行的部分,v 指的是vn垂直的部分。
  • 分解为两部分后,可以分别对这两个部分做旋转,然后再合并,所以有: $\vec v’ = \vec v’{\perp }+\vec v’{\parallel }$
  • v 绕旋转轴n旋转θ角度,它依然保持不变,因为它和n是同方向的向量,所以有 v=v
  • 根据上一点,可以得到: $\vec v’ = \vec v’{\perp }+\vec v{\parallel }\vec v’{\perp }和\vec v{\parallel }$
  • 分析v,可以发现它相当于是vn上的投影,根据向量的点积公式:

AB=|A||B|cosα

代入vn后,得到:vn=|v||n|cosα=|v|cosα=|v|,即算出了v的长度,又因为vn方向一致、n长度为1,所以有:v=(vn)n

  • 上一步已经解决了v,剩下的就是求$\vec v’{\perp }\vec v’{\perp }\vec v_{\perp }\vec v_{\perp } = v - \vec v_{\parallel}$
  • 接着,需要计算一个新的向量ww=n×v (注意叉乘的顺序不能错),所以w是一个垂直于nv所构成平面的向量。
  • vw 分别当做是nv平面的x、y轴(2D坐标系),那么$\vec v’{\perp }\vec v{\perp }2D\theta$度。从而得到等式:

$\vec v’{\perp } = cos\theta \vec v{\perp } + sin\theta \vec w$

好了,所有变量都得到了,总结下最终的公式:

v=(vn)n

v=vv=v(vn)n

(1)w=n×v&=n×(vv)&=n×vn×v)&=n×v

$\vec v’{\perp } = cos\theta \vec v{\perp } + sin\theta \vec w= cos\theta (v - (\vec v\cdot \vec n) \vec n) + sin\theta (\vec n \times \vec v)$

$\vec v’ = \vec v’{\perp } + \vec v{\parallel }= cos\theta (v - (\vec v\cdot \vec n) \vec n) + sin\theta (\vec n \times \vec v) + (\vec v\cdot \vec n) \vec n$

加粗并居中:

v=cosθ(v(vn)n)+sinθ(n×v)+(vn)n

这就是绕任意轴的旋转公式了。

接下来是把这个公式转换成矩阵的形式。方法是,把vx=(1,0,0)vy=(0,1,0)vz=(0,0,1),分别代入上面的公式,分别得到:

vx=[nx2(1cosθ)+cosθ nxny(1cosθ)+nzsinθ nxnz(1cosθ)nysinθ ]T

vy=[nxny(1cosθ)nzsinθ ny2(1cosθ)+cosθ nynz(1cosθ)+nxsinθ ]T

vz=[nxnz(1cosθ)+nysinθ nynz(1cosθ)nxsinθ nz2(1cosθ)+cosθ ]T

最终的旋转矩阵为:

R(n,θ)=[nx2(1cosθ)+cosθnxny(1cosθ)+nzsinθnxnz(1cosθ)nysinθ0 nxny(1cosθ)nzsinθny2(1cosθ)+cosθnynz(1cosθ)+nxsinθ0 nxnz(1cosθ)+nysinθnynz(1cosθ)nxsinθnz2(1cosθ)+cosθ0 0001 ]

原文链接