二维平面上的变换
二维缩放
一个坐标左乘一个缩放矩阵,得到缩放变换后的坐标
切变
二维旋转
默认为绕原点,逆时针旋转
旋转矩阵还是一个正交矩阵,正交矩阵满足的性质是:矩阵的转置=矩阵的逆
所以旋转-θ角度,将旋转矩阵转置即可
缩放、切边、旋转均是线性变换,变换只包括数乘和加法
线性变换一定可以用上述形式表示
如何写出变换的方程:
找到变换后的坐标和原始坐标的关系,并用矩阵乘积的形式来表达
二维平移
平移变换不能简单地通过用线性变换(左乘一个2x2的矩阵)来表示
所以平移变换不是线性变换
二维齐次坐标系
齐次坐标系就是用来解决平移变换的特殊性,用统一的形式表达所有的变换
齐次坐标系的特点:
给二维的点和向量加上一个维度,用三个元素来表示
齐次坐标系可以保证以下事实
还有“向量平移后还是原来的向量”
给三维的向量(x,y,w),(w!=0)扩充定义,可以对其进行数乘,使得第三维为1,此时是一个标准形式的齐次坐标系表示
对任意一个w!=0的三维向量进行数乘不会改变它代表的点
这样任意一个三维向量都可以用来表示一个点或者一个向量
而且任意一个二维点可以有无数种表示
而且利用这个扩充的定义很容易可以推出
point + point 的含义就是两个点的中点
二维仿射变换
仿射变化用二维向量表示是如下形式
用齐次坐标系可以表示出一个仿射变换的矩阵
仿射变换的3x3矩阵中
左上角2x2的矩阵是二维向量中线性变换的矩阵,(1,3)是x方向上的位移量,(2,3)是y方向上的位移量,第三行在仿射变换中默认为(0,0,1),保证了点在仿射变换后还是点,向量还是向量
一个仿射变换的矩阵,表示的是先进行左上角2x2矩阵的线性变换,再进行平移变换,注意这个顺序是确定的
逆变换
一个点或向量变换后,将这个变换矩阵求逆后左乘到当前的点或向量上,即可恢复原来的情况,也就是逆变换
变换的组合
一个变换的组合中变换的顺序应该是确定的,变换了顺序得到的变换结果是不一样的
我们用矩阵的乘法来表示变换的组合
矩阵的乘法也是不满足交换律的,和变换的组合一致
变换矩阵应该放在作用对象的左边,即进行矩阵的左乘,而且从最靠近对象的变换矩阵开始运算
如上组合变换就是先旋转,再平移
矩阵的乘法满足结合律,可以把所有变换矩阵都乘起来,成为一个复杂的变换矩阵,而且这个复杂的变换矩阵始终和作用对象保持一致的大小。这说明无论变换多复杂,大小都不会发生变化
变换的分解
一个复杂的变换可以分解为一系列变换步骤,和变换的组合是相反的关系
一个非绕原点的旋转就可以分解为 平移 + 绕原点旋转 + 平移
三维空间中的变换
三维齐次坐标系
三维空间中的齐次坐标系和平面上的齐次坐标系概念一致,也是加多了一个维度
此时用四个元素来表示三维向量和点
同理任意(x,y,z,w)(w != 0)都可以通过数乘,使得w = 1,转换为一个标准的三维点的表示方式,所以任意一个四维向量都可以用来表示一个三维的点或向量
任意一个三维点可以有无数种表示
三维仿射变换
左上角3x3表示的是线性变换
(1,4),(2,4),(3,4)表示的是三个坐标轴上的位移量
缩放
三维平移
三维旋转
使用轴角表示旋转
轴角也就是绕单轴旋转
用(x,y,z,w)来表示
x,y,z用来表示轴的方向,是一个向量,w是标量,表示旋转的角度
通过轴角可以完成所有的从一个方向变换到另一个方向的旋转
和两点之间直线最短一样,两个方向之间,绕单轴旋转路径最短
但这种旋转方式适用情况不多
使用欧拉角表示旋转
欧拉角是三个一组的角参量
由章动角θ、旋进角ψ和自转角φ组成
分别对应绕三个坐标轴旋转的角度
我们往往把单纯绕y轴的旋转叫做yaw
单纯绕x轴旋转叫做pitch
单纯绕z轴旋转叫做roll
我们采用的是右手笛卡尔坐标系
三维空间中绕原点的任意旋转一定可以分解为三个绕轴旋转的组合,由下方罗德里格斯旋转公式证明
罗德斯格斯旋转公式也提供了绕过原点的任意轴旋转的计算方法
分别单独绕x,y,z轴旋转的矩阵如下
我们将三个矩阵组合起来,就得到了任意绕原点旋转的公式
若三维空间中非绕原点旋转,和二维空间一样,可以分解为平移+旋转+平移
欧拉角存在的问题
坐标系
实际中,物体旋转应该按照物体自身的坐标系来旋转,而不是绝对的坐标系,也就是说欧拉角应该用来标记物体自身坐标系下的旋转量
但每一次旋转都造成了物体自身坐标系与绝对坐标系的偏移,并不方便观察,而且旋转的组合是不能交换顺序的,先发生的旋转会在坐标系上对后发生的旋转造成影响
万向节死锁
万向节
用欧拉角旋转,会造成万向节死锁的情况(具体原因不理解)
当出现死锁,会丧失一维甚至两维自由度,也就是只能在二维平面甚至是一维直线上旋转了
使用四元数表示旋转
四元数可以避免使用欧拉角出现的问题
四元数的定义
一个四元数q,形如(a,b,c,d)
q = a + bi + cj + dk
一个标量作为实部,虚部有三个部分
可以和四维空间上的点一一对应
a是在过原点且垂直于三维空间的一条实轴上的位移
i,j,k满足
扩展一下加法的定义
四元数可以用标量加上向量的形式表示
四元数乘法公式
用四元数表示三维空间中的旋转
q = a + v(向量),a=0时,q代表一个纯四元数,也就是纯三维空间上的一个向量
三维空间中的旋转就是一个纯四元数绕着另一个纯四元数旋转
v绕着u旋转得到v'
旋转的公式如下
观测变换
我们对图形进行变换的目的:将三维的物体转换为二维的一张图片
我们模拟得到一张照片的步骤
- 将观测物体进行模型变换
- 将相机进行视图变换
- 投影变换
简称为model-view-projection MVP变换
我们用观测变换来描述第2和第3步,包括了视图变换和投影变换
视图变换
相机的几个属性
我们的相机需要满足一个事实
当相机和观测物体不发生相对运动时,拍出来的照片应该永远是一样的
我们可以假设,相机永远放在原点
朝向-Z轴,up-direction是Y (约定俗成)
则将任意一个位置的相机,摆放到我们要求的位置,需要
先进行平移,平移矩阵如下
g作为一个不特定的方向,很难用矩阵表示g旋转到-Z方向,但将-Z方向旋转到任意方向的矩阵都好写(t同理)
所以我们就写出从标准位置旋转到相机原位置的矩阵
可以观察到
这个矩阵右乘X方向,得到了gxt
右乘Y方向,得到t
右乘Z方向,得到-g
和我们需要的变换恰好相反
再将矩阵求逆就是我们需要的旋转矩阵
因为旋转矩阵是正交矩阵,转置即可得到逆矩阵
视图变换由下式表达
先进行平移,再进行旋转
不仅是相机做视图变换,应该是相机和所有观测物体组成的整体进行视图变换,以保持相对位置一定,且相机位于标准位置
投影变换
投影变换分为正交投影和透视投影
透视投影下,两条平行线会在远处相交,可以产生近大远小的效果,符合人眼的成像规律,正交投影下平行线不会相交,符合工程实际
将相机假设为一个点,通过这个点无限延伸出空间中的一个锥
我们规定这个锥上的一个far clip plane远平面和一个near clip plane近平面,两个平面中间的图形叫做frustum
在照相时,我们希望frustum中的物体会被显示到近平面上
frustum内部的物体通过视图变换就会变小(注意相机的的透视投影成像是将实际物体变小)
在正交投影下,我们可以理解为相机无限远,不存在变大或者变小,把深度信息忽略
正交投影
正交投影的一种理解
将相机放在标准位置
将z轴丢掉,所有三维物体将会被投影到xy平面上
我们将印有所有物体投影的xy平面缩放成以原点为中心的2x2的矩形,代表着相机成像
正交投影的通用理解
一个立方体有如下属性
\(l,r\) 代表左右,是x轴上的坐标
\(b, t\)代表下上,是y轴上的坐标
\(f, n\)代表远近,是z轴上的坐标
需要注意的是,\(z\)越小,离我们越远,反之离我们越近
正交投影可以分为两个步骤
- 将立方体中心平移到原点
- 将立方体缩放成2x2x2的正方体
则正交投影的矩阵如下
透视投影
在图形学中更常见地是使用投影变换
投影变换中,我们对图中的frustum先进行一个“挤压”的变换
使得frustum变换为一个cuboid
再对cuboid进行正交投影,透视投影就完成了
对于一个frustum,我们将其压缩成一个cuboid,可以列出以下两个条件
除了特定点,我们并不知道z的变化情况(注意cuboid上,除了两个平面上,其他点的z都会发生一定的变化)
用矩阵形式来表示这个线性变换
根据这两个条件可以写出变换的矩阵的一部分
此时要写出第三行,我们还需要一些信息
注意到,在近平面,所有点都没有发生变化,
而在远平面,中心点没有发生变化
通过上述两个条件,就可以解出“压缩”矩阵
而整个投影变换的矩阵就是正交矩阵左乘“压缩”矩阵