线性代数之平移、缩放、旋转矩阵

Tags: ,

平移矩阵 Translate Matrix

T=[100x010y001z0001]

缩放矩阵 Scale Matrix

S=[x0000y0000z00001]

旋转矩阵 Rotate Matrix

绕(1,0,0)旋转θ角度

R(1,0,0)=[10000cosθsinθ00sinθcosθ00001]

绕(0,1,0)旋转θ角度

R(0,1,0)=[cosθ0sinθ00100sinθ0cosθ00001]

绕(0,0,1)旋转θ角度

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

绕任意轴旋转θ角度

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

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

  • v 分解为 v=v+vv指的是vn平行的部分,v 指的是vn垂直的部分。

  • 分解为两部分后,可以分别对这两个部分做旋转,然后再合并,所以有: v=v+v

  • v 绕旋转轴n旋转θ角度,它依然保持不变,因为它和n是同方向的向量,所以有 v=v

  • 根据上一点,可以得到: v=v+v。因此,问题简化为求vv

  • 分析v,可以发现它相当于是vn上的投影,根据向量的点积公式:

AB=|A||B|cosα

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

v=(vn)n

上一步已经解决了v,剩下的就是求v。求v之前需要先求出v,而显然v=vv

接着,需要计算一个新的向量ww=n×v (注意叉乘的顺序不能错),所以w是一个垂直于nv所构成平面的向量。

vw 分别当做是垂直于n的2D平面的x、y轴(因为已经有正交关系),那么v的含义就是指v在这个2D坐标系下绕原点旋转θ度(Rotation of axes)。从而得到等式:

v=cosθv+sinθw

可以这么理解:首先因为 w=n×v,可知 wv等长,假设长度为r,那么可用极坐标表示v=(r,θ),极坐标用笛卡尔坐标表示就是示v=(rcosθ,rsinθ)=rcosθx+rsinθyx=(1,0)y=(0,1),换成自定义的正交坐标系后就是cosθv+sinθw

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

v=(vn)n

v=vv=v(vn)n

w=n×v

=n×(vv)

=n×vn×v

=n×v

v=cosθv+sinθw

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

v=v+v=v+v

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

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

加粗并居中:

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

这就是绕任意轴的旋转公式了。 可以在这个wiki看到这条公式,一模一样。

接下来是把这个公式转换成矩阵的形式。方法是,把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θ0nxny(1cosθ)nzsinθny2(1cosθ)+cosθnynz(1cosθ)+nxsinθ0nxnz(1cosθ)+nysinθnynz(1cosθ)nxsinθnz2(1cosθ)+cosθ00001]

资料

Rodrigues' rotation formula

Rotation of axes

(未经授权禁止转载)
Written on March 20, 2016

写作不易,您的支持是我写作的动力!