向量
AB向量,可写作B-A,方向由A指向B,即被减向量指向减向量。
向量有方向和大小,大小为1的向量为单位向量,即向量的各分部平方和再开根号的值为1。
点乘(DOT):向量的点乘可计算出两向量之间夹角的余弦值,进而得到夹角。当都为单位向量时更加便捷。两向量起始位置放在一起。图形学中主要用点乘来计算向量之间的夹角。
叉乘(CROSS):AxB = -BxA,交换得到的向量是相反的。Maya和OpenGL使用的是右手坐标系,DirectX和Max使用的是左手坐标系。AxA得到一个长度为0的向量。图形学中可以用叉乘判断向量的左右关系,如AxB结果为正则代表A在B的右侧;还可以判断点在三角形内或外,三条边分别与顶点到该点向量叉乘,结果正负相同则在内部,比如ABxAP
向量点乘得到一个数字,向量叉乘得到一个向量。
矩阵
逆矩阵的定义,两矩阵相乘得到的结果是单位矩阵。
矩阵变换
基础的矩阵变换包括平移、旋转、缩放等,这些都是可以通过左乘对应的变换矩阵得到变换后的效果。
齐次坐标
为什么要有齐次坐标?
平移变化无法通过线性变换实现,为了方便的进行偏移变换;能够简化透视投影流程
什么是其次坐标?
对于点补1,对于向量补0。原因是为了保证向量的平移不变性,通过平移变换后应该得到的还是原来的向量才对。并且符合向量和点的运算原理,比如向量相加还是向量,补1就违背了这一原则。同时对一个点来说,要保证补的w为1,故所有维度需要同时除以w,通过这个可知在其次坐标下,两点相加得到的是这两点之间的中点。这就是齐次坐标的尺度不变性。
对于线性变化+平移的结构成为仿射变换,可写为齐次坐标表示的形式。并且结构有固定的形式如下。
组合变换的顺序也很重要,先旋转、后平移。因为旋转是相对原点进行的,平移后再旋转得到的效果与预期不同,同时也说明矩阵相乘不具有交换律。
MVP变换
将物体都摆放好,转换到相应的模型空间下
摆放相机,调整相机的位置、朝向
按下快门拍照
模型、视图都是对物体进行的,通常也会写在一起。
模型变换(Model Transformation)
将物体都摆放好,转换到相应的模型空间下
视图变换(View/Camera Transformation)
约定相机放在原点,lookat方向为-z,up方向为y。并且所有物体跟随相机进行这种变换。
视图变换的思路:
视图矩阵的推导:
投影变换(Projection Transformation)
投影变换的目的是为了将3D的场景变换到2D空间下。投影方式有正交投影和透视投影,正交投影的投影方向和坐标轴要么平行要么垂直,不会有相交的情况;透视投影则遵循近大远小。投影变换将区域内(透视投影为视锥体,正交投影为正方体区域)的点变换到[-1,1]^3的规则观察体(裁剪空间)中,这个过程是因为绘制屏幕尺寸各有不同,变换到规则观察体中更加方便操作。长方体非均匀缩放后变换为立方体肯定会导致绘制图形的拉伸导致图形的比例失调,但是不会扭曲,因为进行的是线性变换,在视口变化时映射到屏幕空间,也会通过反变换的方法重新恢复原有的比例。
正交投影
透视投影
透视投影与正交投影的区别在于观察体的不同,所以透视投影可以考虑将观察体变换为长方体,然后再进行一次正交投影变换。由于正交投影矩阵是已知的,那么求出观察体变换矩阵即可解决问题。
在视锥体中,可以观察到在变换过程中,近、远平面的z值是不变的,另外远平面的中心点在变换前后也是不变的。
如何定义透视投影的视锥:fov及宽高比