旋转变换(一)旋转矩阵

1. 简介html

计算机图形学中的应用很是普遍的变换是一种称为仿射变换的特殊变换,在仿射变换中的基本变换包括平移、旋转、缩放、剪切这几种。本文以及接下来的几篇文章重点介绍一下关于旋转的变换,包括二维旋转变换、三维旋转变换以及它的一些表达方式(旋转矩阵、四元数、欧拉角等)。ide

2. 绕原点二维旋转函数

首先要明确旋转在二维中是绕着某一个点进行旋转,三维中是绕着某一个轴进行旋转。二维旋转中最简单的场景是绕着坐标原点进行的旋转,以下图所示:idea

 

 

如图所示点v 绕 原点旋转θ 角,获得点v’,假设 v点的坐标是(x, y) ,那么能够推导获得 v’点的坐标(x’, y’)(设原点到v的距离是r,原点到v点的向量与x轴的夹角是ϕ )
x=rcosϕy=rsinϕ
x′=rcos(θ+ϕ)y′=rsin(θ+ϕ)
经过三角函数展开获得
x′=rcosθcosϕrsinθsinϕ
y′=rsinθcosϕ+rcosθsinϕ
带入x和y表达式获得
x′=xcosθysinθ
y′=xsinθ+ycosθ
写成矩阵的形式是: spa

 

尽管图示中仅仅表示的是旋转一个锐角θ的情形,可是咱们推导中使用的是三角函数的基本定义来计算坐标的,所以当旋转的角度是任意角度(例如大于180度,致使v’点进入到第四象限)结论仍然是成立的。3d

3. 绕任意点的二维旋转htm

绕原点的旋转是二维旋转最基本的状况,当咱们须要进行绕任意点旋转时,咱们能够把这种状况转换到绕原点的旋转,思路以下:
1. 首先将旋转点移动到原点处
2. 执行如2所描述的绕原点的旋转
3. 再将旋转点移回到原来的位置blog

 

也就是说在处理绕任意点旋转的状况下须要执行两次平移的操做。假设平移的矩阵是T(x,y),也就是说咱们须要获得的坐标 v’=T(x,y)*R*T(-x,-y)(咱们使用的是列坐标描述点的坐标,所以是左乘,首先执行T(-x,-y))图片

在计算机图形学中,为了统一将平移、旋转、缩放等用矩阵表示,须要引入齐次坐标。(假设使用2x2的矩阵,是没有办法描述平移操做的,只有引入3x3矩阵形式,才能统一描述二维中的平移、旋转、缩放操做。同理必须使用4x4的矩阵才能统一描述三维的变换)。ip

对于二维平移,以下图所示,P点通过x和y方向的平移到P’点,能够获得:

 

 

x′=x+tx

y′=y+ty
因为引入了齐次坐标,在描述二维坐标的时候,使用(x,y,w)的方式(通常w=1),因而能够写成下面矩阵的形式


按矩阵乘法展开,正好获得上面的表达式。也就是说平移矩阵是

 

若是平移值是(-tx,-ty)那么很明显平移矩阵式

 

 

咱们能够把2中描述的旋转矩阵也扩展到3x3的方式,变为:

 


从平移和旋转的矩阵能够看出,3x3矩阵的前2x2部分是和旋转相关的,第三列与平移相关。有了上面的基础以后,咱们很容易得出二维中绕任意点旋转的旋转矩阵了,只须要把三个矩阵乘起来便可:

 

4. 三维基本旋转

咱们能够把一个旋转转换为绕基本坐标轴的旋转,所以有必要讨论一下绕三个坐标值x、y、z的旋转。
本文在讨论过程当中使用的是相似于OpenGL中定义的右手坐标系,同时旋转角度的正负也遵循右手坐标系的约定。以下图所示

 

 

4.1 绕X轴的旋转

在三维场景中,当一个点P(x,y,z)绕x轴旋转θ角获得点P’(x’,y’,z’)。因为是绕x轴进行的旋转,所以x坐标保持不变,y和z组成的yoz(o是坐标原点)平面上进行的是一个二维的旋转,能够参考上图(y轴相似于二维旋转中的x轴,z轴相似于二维旋转中的y轴),因而有:
x′=x
y′=ycosθzsinθ
z′=ysinθ+zcosθ
写成(4x4)矩阵的形式

 

4.2 绕Y轴旋转

绕Y轴的旋转和绕X轴的旋转相似,Y坐标保持不变,除Y轴以外,ZOX组成的平面进行一次二维的旋转(Z轴相似于二维旋转的X轴,X轴相似于二维旋转中的Y轴,注意这里是ZOX,而不是XOZ,观察上图中右手系的图片能够很容易了解到这一点),一样有:
x′=zsinθ+xcosθ
y′=y
z′=zcosθxsinθ
写成(4x4)矩阵的形式

 

 

4.3 绕Z轴旋转

与上面相似,绕Z轴旋转,Z坐标保持不变,xoy组成的平面内正好进行一次二维旋转(和上面讨论二维旋转的状况彻底同样)

 

 

4.4 小结

上面描述了三维变换中绕单一轴旋转的矩阵表达形式,绕三个轴旋转的矩阵很相似,其中绕y轴旋转的矩阵与绕x和z轴旋转的矩阵略有点不一样(主要是三个轴向顺序和书写矩阵的方式不一致致使的,绕三个不一样坐标旋转轴以及其余二个坐标轴组成平面的顺序是: XYZ(绕x轴) YZX(绕y轴) ZXY(绕z轴),其中绕y轴旋转,其余两个轴是ZX,这和咱们书写矩阵按

 

 

 


的方式不一致,而致使看起来绕Y轴旋转的矩阵彷佛是和其余两个矩阵不一致。若是咱们颠倒写法,将公式写成

 


的方式,那么这三个旋转矩阵看起来在形式上就统一了,都是

 

 


这种表现形式了(左上角都是−sinθ

5. 绕任意轴的三维旋转

绕任意轴的三维旋转可使用相似于绕任意点的二维旋转同样,将旋转分解为一些列基本的旋转。绕任意轴旋转以下图所示:

 

 

P点绕向量u旋转θ角,获得点Q,已知P点的坐标和向量u,如何求Q点的坐标。
咱们能够把向量u进行一些旋转,让它与z轴重合,以后旋转P到Q就做了一次绕Z轴的三维基本旋转,以后咱们再执行反向的旋转,将向量u变回到它原来的方向,也就是说须要进行的操做以下:
1. 将旋转轴u绕x轴旋转至xoz平面
2. 将旋转轴u绕y轴旋转至于z轴重合
3. 绕z轴旋转θ
4. 执行步骤2的逆过程
5. 执行步骤1的逆过程
原始的旋转轴u以下图所示:

 


第一、二、3步骤以下图所示:

 

 


步骤1将向量u旋转至xoz平面的操做是一个绕x轴的旋转操做,步骤2将向量u旋转到与z轴重合,第一、2步骤的示意图以下:

 


做点P在yoz平面的投影点q,q的坐标是(0, b, c),原点o与q点的连线oq和z轴的夹角就是u绕x轴旋转的角度。经过此次旋转使得u向量旋转到xoz平面(图中的or向量)【步骤1】
过r点做z轴的垂线,or与z轴的夹角为β, 这个角度就是绕Y轴旋转的角度,经过此次旋转使得u向量旋转到与z轴重合【步骤2】

步骤1中绕x轴旋转的是一次基本的绕x轴的三维旋转,按照以前的讨论,旋转矩阵是:

 

 


这里的θ就是图中所示的α角 (注意α角度是绕x旋转的正的角度)
从图中咱们还能够获得:


因而旋转矩阵(记做 Rx(α))为:

 


在完成步骤1以后,向量u被变换到了r的位置,咱们继续步骤2的操做,绕y轴旋转负的β角(注意:这里的β是负的),通过此次变换以后向量u与z轴彻底重合,因为这一步也是执行的一次绕Y轴的基本旋转,旋转矩阵(记做 Ry(−β))为:

 

 


使用−β替换表达式中的θ,此外根据图中描述,咱们能够计算获得:

 

 


带入上面的表达式,因而旋转矩阵(记做 Ry(−β))为:

 

在完成前面两个步骤以后,u方向和z轴彻底重合,所以执行旋转θ角,执行的是一次绕z轴的基本三维旋转(记做 R(θ),根据以前的讨论,咱们能够获得:


最后两步骤是前面1和2的逆操做,也就是绕Y轴旋转β 和绕X轴旋转−α,这两个矩阵分别记做 Ry(β) 和 Rx(−α),获得它们的方式很简单,只须要将上面步骤1和步骤2中的角度修改为相反数便可,也就是:

 

 

最终获得 绕任意轴u旋转的旋转矩阵是【由于使用的列向量,所以执行的是左乘(从右往左)】:

MR=Rx(−α)Ry(β)Rz(θ)Ry(−β)Rx(α)=

 

 



(注:式中的(u,v,w)对应上文中向量(a,b,c),公式我本身笔算过,为了减小编辑公式的时间(使用LaTex编辑太繁琐,所以找了一张公式的图片贴在此处)

若是向量是通过单位化的(单位向量),那么有a2+b2+c2=1,能够简化上述的公式,获得:

 

 

参考文献:

  1. Wiki Rotation (mathematics)
  2. Euler’s rotation theorem
  3. Maths - Rotation Matrices
  4. 绕任意轴旋转
  5. Rotation About an Arbitrary Axis in 3 Dimensions
  6. Rotation about an Arbitrary Axis (Line)
相关文章
相关标签/搜索