为什么要变换
变换的应用
-
位置移动
-
旋转
-
缩放
-
光栅化成像
模型从局部坐标最终转换到屏幕坐标的过程中需要进行的一系列矩阵变换操作。
局部坐标(3D)->…->屏幕坐标(2D)
2D变换类型
最主要的是为了把矩阵和变换联系起来
Scale 缩放
Reflection Matrix 反射
例如对y轴反射。则x坐标取相反数,y坐标不变
shear matrix 切变
x坐标变化,y坐标不变
Rotate 旋转
如果不说方向,就是逆时针旋转
2d旋转矩阵推导
旋转负角
线性变换=矩阵
齐次坐标
为什么要用齐次坐标
平移变换
平移操作不是线性变换!
一般的缩放与旋转可以写成一个矩阵与向量相乘
而平移的话是向量与向量相加
如果我们不希望缩放、旋转与平移之间在运算上之间被区分开的话,就要想办法把它们统一起来
统一它们的方法就是更改坐标的定义
齐次坐标的定义
以 2d 为例,一般的 2d 的点或者向量的定义是 (x,y)
现在添加第三个坐标,称为齐次坐标
然后 2d 点 就是 (x,y,1),2d 向量是 (x,y,0)
齐次坐标的用法
引入齐次坐标,通过增加一个数的方式,把平移变换也写成一个矩阵乘以向量的形式
那么现在点的平移就可以用矩阵乘向量来表示
为什么要把点和向量区别对待?
为什么要将向量与点的坐标区别对待呢?
因为向量要满足平移不变形,所以最后补充的是0
而点平移之后是变化的,所以最后补充的是1
同时,要满足以下操作:
- 向量+向量=向量 (结果最后一个坐标为0)
- 点-点=向量 (结果最后一个坐标为0)
- 点+向量=点 (结果最后一个坐标为1)
- 点 + 点 = 什么都不是(结果最后一个坐标为2)
故这是满足现实逻辑的。即
最后一个坐标是0则为向量,
最后一个坐标为1则为点,
最后一个坐标既不是1也不是0则什么也不是
但是为了不让最后一种违规情况出现,我们强行规定
假如最后一个坐标不是1,而是w,则所有坐标都除以w进行归一化
即
所以经过这种规定之后,我们把最后一种情况改为了
- 点 + 点 =两点的中点
(因为最后一个坐标为1+1=2,触发规定所有坐标同时除以2,所得坐标恰好就是中点)
我们将平移融入到矩阵之后,将该矩阵称之为仿射矩阵(affine matrix)
齐次坐标的适用
将之前的所有变换都总结到仿射变换里:
逆变换
变换矩阵的逆就是逆变换
例如将物体逆时针旋转45度的矩阵为M
则将物体顺时针旋转45度的矩阵为
逆变换——逆矩阵
组合变换
变换的顺序
复杂变换通过一些列简单变换得到
也就是说矩阵运算中 AB 不一定等于 BA,也就是矩阵运算不满足交换律
因此,一般的矩阵运算规定是,先调用的变换在矩阵连乘式的右边,后调用的在矩阵连乘式的左边
虽然矩阵没有交换律,但是矩阵有结合律
因此,一个矩阵可以表示一个很复杂的变换
变换的分解
绕着点 C 旋转一个物体 α 度,可以分解为
先把这个物体平移,使点 C 移动到原点
然后将这个物体绕着原点旋转 α 度
最后将这个物体移回点 C