变换矩阵 (Transformation Marices) ,一切物体的缩放,旋转,位移,都可以通过变换矩阵作用得到,在光栅化中会用到,同时在投影 (projection) 变换也有很多应用

将如下图所示的简单矩阵乘法定义为对向量的线性变换。

变幻的矩阵python 矩阵变换的写法_笔记

最简单的缩放变换,如图,即除了(0,0)不变之外都乘以某个系数

变幻的矩阵python 矩阵变换的写法_学习_02

矩阵形式:

变幻的矩阵python 矩阵变换的写法_图形渲染_03

反射操作:(即关于y轴翻转)

变幻的矩阵python 矩阵变换的写法_图形渲染_04

切变(shearing):

把物体一边固定,然后拉另外一边,如图

变幻的矩阵python 矩阵变换的写法_图形渲染_05

分别对应"拉伸"x轴,和"拉伸"y轴

(变换通用方法:找对应点分析坐标的转换形式)

变幻的矩阵python 矩阵变换的写法_图形渲染_06

旋转Rotate(默认以原点为中心,逆时针旋转):重要的变换矩阵

变幻的矩阵python 矩阵变换的写法_图形渲染_07

同上,通过对应点坐标(1,0)(0,1)变换后关系可确定变换矩阵

变幻的矩阵python 矩阵变换的写法_线性变换_08

补充:旋转角度-a和a其实是相反操作,因为旋转矩阵的逆矩阵等于他的转置 是正交矩阵

变幻的矩阵python 矩阵变换的写法_学习_09

总结:

变换总能写成相同维度矩阵乘向量形式,如果能写成,就叫他线性变换

变幻的矩阵python 矩阵变换的写法_图形渲染_10

为什么强调相同维度?

变幻的矩阵python 矩阵变换的写法_笔记_11

如图,平移变换比较特殊,无法矩阵化,不是线性变换,只能写成以下形式:

变幻的矩阵python 矩阵变换的写法_学习_12

为了不搞特殊,统一所有变换到一块用一种方法表示,引入齐次坐标:

(简单来说就是为了能用矩阵乘向量统一表示所有变换,多加一维)

变幻的矩阵python 矩阵变换的写法_图形渲染_13

注:最后一维为1,表示点(point), 为0表示方向(direction)

现在我们就可以用一个矩阵既表示线性变换(先),又表示位移(后)

为什么是1,0?为了保持向量的平移不变性,任何一个点都写成(x,y,1),任何一个向量都写成(x,y,0)

如下图所示,这种设置还有更多的考虑,齐次坐标系下:

向量加向量还是向量,点减去点是向量,点加向量得到一个新的点,点加上点是这两个点的中点,如图

变幻的矩阵python 矩阵变换的写法_笔记_14

引入齐次坐标后所有的仿射变换(一个向量空间进行一次线性变换并接上一个平移)都可以写成齐次坐标的形式:

变幻的矩阵python 矩阵变换的写法_变幻的矩阵python_15

同理,其他变换的齐次坐标系形式:

变幻的矩阵python 矩阵变换的写法_笔记_16

逆变换:M-1

变幻的矩阵python 矩阵变换的写法_线性变换_17

变换回原来的形状,即逆变换,数学上就是乘以对应变换的逆矩阵

(这也是用矩阵乘法表示变换的优点之一,可以方便地描述逆变换)

复杂变换可以通过一系列简单变换得到,变换的顺序很重要(因为矩阵乘法没有交换律,先旋转后平移和先平移后旋转得到的结果不一样)

变幻的矩阵python 矩阵变换的写法_图形渲染_18

如图,注意是从右往左计算,如果应用太多矩阵可以写作以下形式(结合律的应用),即一个矩阵可以表示多次的复杂变换经过

变幻的矩阵python 矩阵变换的写法_笔记_19

同理变换不仅能合成也能分解(从右到左):围着任意轴旋转可以如图考虑

变幻的矩阵python 矩阵变换的写法_笔记_20

三维变换

变幻的矩阵python 矩阵变换的写法_学习_21

如图,同理用二维做类比,向量(x,y,z,w)实质上是表示在空间中坐标为(x/w,y/w,z/w)的点

变幻的矩阵python 矩阵变换的写法_图形渲染_22

注意这样是先变换再平移

如图,类似二维,如果W不为0,则默认(x,y,z,w)表示的是三维空间中坐标为(x/w,y/w,z/w)的点

变幻的矩阵python 矩阵变换的写法_变幻的矩阵python_23

齐次坐标系下的三维变换:

变幻的矩阵python 矩阵变换的写法_学习_24

平移和缩放:

变幻的矩阵python 矩阵变换的写法_图形渲染_25

旋转(较为复杂)关于某个坐标轴变换:(关于的轴对应坐标不用变化,“绕谁谁不变”,其余两个轴对应坐标参考二维旋转)

注意绕y时相反,因为此时根据右手螺旋定则是z叉乘x,而旋转矩阵的行列式对应关系是x向z转的,需要反一下

变幻的矩阵python 矩阵变换的写法_变幻的矩阵python_26

类似二维,任意旋转都是正交矩阵,因此他们的逆是他们的转置,如逆时针转30°,转置就是顺时针30°

以上都是绕单独坐标轴旋转,而任意一个3D旋转都可以写成分别绕XYZ轴旋转操作的组合:

变幻的矩阵python 矩阵变换的写法_笔记_27

其中αβγ角又被称为欧拉角 例:roll滚转(机身左右旋转) pitch俯仰(上下抬头) yaw偏航(平行的左右)

变幻的矩阵python 矩阵变换的写法_图形渲染_28

由此引出了罗德里格斯Rodrigues旋转公式:图形学中

α为旋转角  I为单位矩阵 n为环绕的某个轴的方向,即一个旋转向量(nx,ny,nz)(此时默认起点是过原点的轴)N为由n得到的一个反对称矩阵

R即为某个向量V以n方向为轴旋转α度后得到的向量Vrot要经过的旋转矩阵 即Vrot=RV,旋转前的向量坐标乘以R等于旋转后的向量坐标

变幻的矩阵python 矩阵变换的写法_变幻的矩阵python_29

如果要沿着任意轴,需要先将轴平移,以过原点的为轴再旋转,再整体平移回去

四元数:引入更多是为了计算旋转与旋转之间的差值,因为用矩阵表示旋转不方便计算,机器人学中用的比较多

四元数可以很方便地表示旋转变换。但在很多场合中,使用矩阵形式和向量形式表达旋转更有利于推导,因此这里不再赘述

另注:罗德里格斯公式推导的个人理解

变幻的矩阵python 矩阵变换的写法_笔记_30

该公式有多种推导方法,我观看的视频讲解如图,向量V绕k旋转θ角得到的向量Vrot

我们需要推导的就是这两个之间的关系,即经过的变换矩阵

那么首先由平行四边形法则可得,原向量V可以看作是分别在旋转轴k方向的分向量V∥和垂直于k轴的方向上的分向量V⊥之和

同理旋转后得到的向量Vrot也可以是V∥和垂直于k轴的方向上的分向量Vrot⊥之和,我们就从这点出发来找关系:

由向量点乘公式可得,用原向量V和单位向量k点乘来表示V在k方向上的投影长度,再乘以k的方向就可以表示V∥

由平行四边形法则可得,V⊥=V-V∥,又由叉乘的定义可得V⊥=-kx(kxv),即与v和k都垂直的单位向量c再叉乘-k得到与-k和c都垂直的向量V⊥

同理,Vrot⊥是通过正交分解求的,Vrot⊥在旋转的过程中长度不变(始终等于V⊥),因此V⊥的模乘以cosθ就是Vrot⊥在红色面上的投影长度,再把这个长度乘以V⊥方向的单位向量(b)就是Vrot⊥在红色面上的分量【同理也可以是(|b| = cos(PI -θ ) |V⊥| = (- cosθ)|V⊥|),再乘以V⊥相反方向】,同理相似的另外一个分量就乘以sinθ,两个分量相加就是Vrot⊥

之后经过代换简化就可得到罗德里格斯公式。