这里写目录标题
图形学基础
基础数学:线性代数,几何
基础物理:力学,光学
其他:信号处理,数值分析
线性代数
Vector向量
向量的归一化
向量的加法(平行四边形法则,三角形法则)
向量的坐标表示
向量的点乘
向量点乘的一些属性
点乘的坐标运算
可以判断向量前与后的信息
点乘>0 同方向
点乘<0 反方向
向量的叉乘
叉乘的一些属性
叉乘的矩阵形式
作用:判定左和右
判定内与外
矩阵
线性变换是操纵空间的一种手段,他保持网格线平行且等距分布,并保持原点不动
矩阵是一种描述线性变换的语言,而矩阵向量乘法就是计算线性变换作用域给定向量的一种途径
矩阵的乘积
首先两个矩阵必须要可以相乘
(M x N)(N x P) = (M x P)
第一个矩阵的列==第二个矩阵的行。才能相乘
如:
第一个矩阵M行N列
第二个矩阵N行P列
得到M行P列的新矩阵
新矩阵a行b列的元素怎么得出来呢?
第一个矩阵a行和第二个矩阵b列做点积运算
矩阵的性质
矩阵乘向量
矩阵的转置
单位矩阵,矩阵的逆
向量的点乘,叉乘(矩阵形式)
向量的投影
Transform
Scale 缩放
Reflection 镜像变换
Shear 错切
Rotate(旋转)
如果用一个矩阵乘以输入可以得到输出的坐标,那么称这个变换叫线性变换
齐次坐标
给二维坐标增加一个维度,将线性变换也可以用矩阵形式表达
用齐次坐标可以将线性用矩阵统一表示
缺点:引入了额外的数字
矩阵不满足交换律
先旋转在平移写作 (T·R·向量) 从右往左写,矩阵的应用是从右到左的
三维空间中的线性变换也可以用齐次坐标表示
3D变换
3D变换相对于2D变换来说只是多增加了一个维度,可由2D变换举一反三得来
3D旋转在绕Y轴旋转时理解有些特殊
以xyz三个轴来说
X x Y = Z Y x Z = X X x Z = -Y
所以绕Y轴旋转的矩阵表现出来是转置的状态
罗德里格斯旋转公式
在三维空间内绕某一轴旋转,默认这个轴是过原点的
罗德里格斯旋转公式就是总结了绕任意过原点的轴旋转的公式
对于绕不过原点的轴旋转,我们可以将其拆分为
- 将旋转轴平移到原点
- 绕轴旋转
- 将旋转后的模型平移回去
MVP变换:模型,视图,投影变换
视图/相机变换
图形学的最终目的是为了将三维中的物体渲染成二维里的图像
在现实生活中如何照一张照片?
- 找个好地方摆pose(Model变换)
- 把相机放个好角度(View变换)
- 按快门(Projection变换)
View变换--如何摆放相机的角度
决定相机的位置
决定相机看向的方向
决定相机头朝上的方向
规定相机永远在(0,0,0),沿着-Z看
变化的永远是其他物体
所以要先把摄像机归到原点
平移摄像机至(0,0,0)
将相机lookat的方向旋转到-z
旋转相机头朝上的方向到Y
第一步的平移可以简单的写成下图Tview
但是要将任意向量旋转到轴上比较难写(也就是第2步和第三步)
但是将轴(如X轴(1,0,0))旋转到任意向量比较好写
所以我们先求将X轴旋转到任意向量的矩阵,之后将该矩阵求逆,即可得到任意向量旋转到轴的矩阵Rview
Rview x Tview = Mview
Mview即为视图变换,将Mview应用到相机,相机归零,同时也需要将Mview应用到其他所有物体,让物体和相机的相对位置保持不变
正交投影和透视投影
区别:是否有近大远小的性质
正交投影
满足近大远小的性质
先将相机归零lookat -Z轴
对于二维投影来说,直接把Z轴坐标舍弃,就能得到物体在xy平面上的投影
要把得到的图像平移并且缩放到[-1,1]²中,方便之后的计算
对于正交投影来说,视口是个[l,r][b,t][f,n]的长方体,想让他变成[-1,1]³中的话只需要
- 先将立方体的中心平移到原点
- 在将立方体缩放到[-1,1]³中
首先要找到立方体的中心点,也就是
将边长r-l、t-b、n-f缩放到长度2
所以正交投影矩阵如下
(此时物体肯定会被拉伸,在之后的视口操作中会恢复拉伸)
透视投影
传统的欧式几何是在同一平面内生效的法则
对于不同平面就会造成照片中近大远小的情况
如何做透视投影呢?
老师的方法是,先将Frustum远平面及远平面到近平面之间的所有平面挤压到近平面大小,
变成Cuboid的样子,然后做一次正交投影
那么如何做挤压呢?
- 对于除近平面外的任意一个点,通过挤压后该点的高度y要变成和近平面一样的y'
- 从侧面看Frustum的话,如下图,可以形成两个相似三角形,即可得出y'=(n/z)y
- 同理x'=(n/z)x
通过上面推导出来的两个公式可得,对于任意一点(x,y,z,1)T 可得
这里为了方便书写,用T来表示转置矩阵,下文同
将这个点同时乘z得
(齐次坐标同时乘k(k!=0),还得到相同的点)
- 所以我们推导出了变化后的点的一部分
就是
- 那么一个矩阵乘以任意一点(x,y,z,1)T得到上图,我们就可以推导出这个矩阵的一部分了
- 矩阵的一部分如下图
想补全这个矩阵,需要用到两条已知的性质
- 近平面的点不会发生变化
- 远平面的点z的值不会发生变化
- 对于近平面上的点来说,他的z值就是n
见下图
由性质1可得
对于近平面上的点(x,y,n,1)T经过矩阵变换后该点还为(x,y,n,1)T,同时乘n后得(nx,ny,n²,n)T
所以当z等于n时,也就是说近平面的点通过矩阵运算后变为(nx,ny,n²,n)T
所以矩阵第三行乘以(x,y,n,1)T= n²
可得第三行前两个数一定为0,即(0,0,A,B)
可得
-
An+B=n²
由性质2可得
选一远平面上的点x=0,y=0,即中间点(0,0,f,1)T,经矩阵变化后还是中间点(0,0,f,1)T,同时乘f后得(0,0,f²,f)T
即(0,0,A,B)(0,0,f,1)T=(0,0,f²,f)T
可得
-
Af+B=f²
联立1、2得
A=n+f
B=-nf
至此可解出Mpersp -> ortho
所以对于空间中任意一点进行透视变换可以通过如下公式解出