0.线性代数复习部分
0.1 向量的点乘 Dot(scalar) Product
结果:是标量,将向量W朝着过原点和向量V终点的直线上投影,将投影的长度与向量V的长度相乘就得到了点积。
计算方式:

笛卡尔坐标系下的点积:

几何含义:
- 求两个向量的夹角(例如光源在表面之间角度的余弦)
- 向量是否垂直(0代表着V和W相互垂直)
- 判断朝向 Determine forward / backward(负代表着W的投影方向与V方向相反)

- 计算一个向量在另一个向量上的投影(这样要求被投影向量是单位向量)

性质:

都没有结合律associative,点积是因为结果是标量,不能再点积,叉积不相等(a×b)×c=a×(b×c)
0.2 向量的叉乘 Cross(vector) Product
结果是一个向量与V和W垂直,长度为V和W围成的平行四边形的面积、平行六面体的体积并且遵循右手定则的向量
计算方法:
几何角度:
|x| |y| sin0 (平行四边形面积)
笛卡尔坐标系下的叉积:

性质:
除了不满足结合律外,不满足交换律(因为是矢量)

几何意义:
- 判定左和右 如下图,在右手坐标系中,a向量叉乘b向量结果为正,则b在a的左侧

- 判断内和外,顺序叉乘三次结果正负相同则在内部,否则在外部
- |a×b|在数值上等于由向量a和向量b构成的平行四边形的面积
- 判断点是否在同一平面

1.二维变换 Tranformation
变换用来描述、实现运动
1.1线性变换
- (线性)变换和矩阵两个词本质是一样的,前者强调过程,后者强调结果(变换后的基向量作为矩阵列向量)
- 它同时满足以下两个性质:
- 叠加性(Additivity):对于任意两个向量 u 和 v,线性变换T(u + v) = T(u) + T(v)。这表示变换对向量的加法操作保持了线性性质
- 数乘性(Scalar Multiplication):对于任意标量c和向量u,线性变换T(cu) = c·T(u)。这表示变换对向量的数乘操作同样保持了线性性质

1.1.1 缩放变换(对角矩阵)

1.1.2 剪切变换
水平剪切是将对象或图形沿着水平方向上的平行线进行平移,从而改变对象的形状。水平剪切通常用于在二维平面上调整对象的形状,例如文本倾斜的效果。
假设我要做如下倾斜效果,请推导出变换矩阵

1.1.3 旋转变换(正交矩阵)



1.14 翻转变换

1.2 仿射变换
平移变换:非线性变换,因不满足线性变换中的:叠加性(T(u + v) = T(u) + T(v))。因此,虽然平移是一种非常常见的空间变换,但它通常被视为一种仿射变换而不是线性变换。平移变换的结构如下:

仿射变换是由上面介绍的线性变换以及平移变换组成的,它是一种更广泛的变换类别。因此图形学中用仿射变换来描述各种平移、旋转、缩放等操作。
2. Homogeneous Coordinates 齐次坐标
为了统一仿射变换的表示方式(平移变换有个+常矩阵),须借助齐次坐标系统。
在齐次坐标 系统 中,一个2D点的坐标通常表示为三维向量(x, y, w),其中x和y是点在笛卡尔坐标系统中的坐标,而w是一个额外的权重因子。齐次坐标中的点(x, y, w)可以通过除以w来得到它在标准笛卡尔坐标中的坐标(x/w, y/w)。这种表示方式允许我们用同一种结构形式表示点和向量,并且可以更方便地进行仿射变换。
点:w = 1
向量:w = 0

在2D齐次坐标系下,仿射变换被统一为矩阵 × 向量

验证

拓展
有人可能会意识到这3维空间中的平移矩阵看起来好像4维空间的shear矩阵啊?其实完全正确在3维空间中的shear矩阵就可以视为二维空间中的平移矩阵

同理我们在四维空间中(4乘4矩阵)进行剪切,在三维空间中即为平移。这从几何上解释了为什么要到四维空间中去完成三维空间中的平移
线性变换有个最大的特点就是要过空间的原点,无论是多少维,而在3维空间中,要进行平移变换,其代表的目标空间,必然不经过原空间的原点,那么也这个平移变换就不是线性变换,正因于此,使用升维的方式,使三位空间的平移变换,转化为四维空间的线性变换,过四维原点,这也是为什么齐次坐标这种方式可以加入只表示线性变换的矩阵之中,因为n维仿射变换的特征满足n-1维线性变换的特征。
3 三维变换
跟2D同理,齐次坐标下都会增加一维

3.1 缩放

3.2 位移

3.3 旋转
3.3.1 绕标准轴旋转

3.3.2 绕过原点的任意轴旋转
如果绕任意轴旋转怎么描述?先平移到原点,绕过原点轴旋转、平移回去即可

3.4 四元数(额外知识,有兴趣深入研究的可以看看)
在Unity3D中固定使用Z->X->Y这套旋转顺序,UE4中使用左手系Z-up坐标系,按Z->Y->X的旋转顺序,两者都可以,但只要中固定的一个顺序来编码旋转或者朝向,而j就会导致GimbalLock的问题:假设我们使用𝑥-𝑦-𝑧的顺序旋转任意一个点

- 绕X轴旋转,即绕pitch(俯仰角)旋转
- 绕Y轴旋转,即绕yaw(航向角)旋转
- 绕Z轴旋转,即绕roll(翻滚角)旋转

当前的𝑧轴与原来的𝑥轴重合,也就是说,最后𝑧轴的旋转与𝑥轴的旋转 其实操纵的是同一个轴,一旦𝑦轴上的变换角将这 两个旋转轴对齐,我们就没有任何办法对最初的𝑧轴进行旋转了.无论𝑥 轴与𝑧轴的旋转角是多少,变换都会丧失一个自由度。GimbalLock问 题的核心还是在于我们采用了固定的旋转顺序
仅仅是使用四元数来做旋转的话看这个
4. M V P 变换
4.1 模型变换(Model Transformation)
- 模型变换就是在世界中摆放模型
- 局部空间:就是以其自身的中心点或者某个端点为原点所的一个局部坐标系
- 使用若干仿射矩阵变换操作,把物体从的局部空间转换到世界空间的过程。这些缩放、旋转、平移都是合并成一个矩阵传给GPU给每个顶点应用的。通过将局部空间的坐标点乘一个合并的变换矩阵来得到他在世界空间的位置

Model矩阵可以拆分成Translate、Rotate和Scale三个矩阵的点乘
对顶点依次进行了:缩放→旋转→平移,因为矩阵乘法不具有交换律因此顺序不能改变

4.2 视图变换(View Transformation)
- 也叫做Camera Transform,因为这个变换矩阵的所有参数是根据相机参数计算得到的
- 如何在3D空间中描述一个摄像机?
- 需要位置向量
e、向上的方向向量t、向前的方向向量g
- 需要位置向量

视图变换过程:
- 计算视图变换矩阵(V矩阵),使得该矩阵能够把世界空间中摆放的相机移动到原点,且向上的 t 向量旋转到与 Y 轴重合,g 看向 -Z 轴,右向量与x轴正向重合
- 对相机和空间所有其他物体做V矩阵变换,使相机与其他物体保持相对静止,这样的操作使得相机变换前后所看到的场景是完全一致的,并且相机位于原点与坐标轴朝向一致,非常便于后续计算。
View矩阵计算
两个矩阵:先平移 再 旋转,此M不是MVP的M,只是视图矩阵的符号
注:顺序不能交换,因为效果不同


Tview平移矩阵非常简单,就是把相机移动到原点如下

Rview矩阵的计算

因为旋转矩阵是正交矩阵,所以旋转矩阵的逆 = 旋转矩阵的转置。简单转置一下就得到了逆矩阵Rview,即能使向上的 t 向量旋转到与 Y 轴正方向重合,g 看向 -Z 轴,

4.3 投影变换(Projection Transformaion)
- 两种投影方式(正交、透视)

4.3.1 正交投影:Orthographic projection
- 正交投影没有”近大远小“(将摄像机拉的无限远,这样两个clip的大小就近乎没有区别)
- 定义一个立方体,通过左右上下远近[l,r] [b,t] [f,n] 6个面,这些平面用于确定可见区域。
- 把这个立方体映射到正则立方体[-1,1]3中,即两次变换(平移和缩放),物体会被拉伸
移动到长宽为1是为了在适配各种分辨率屏幕时方便计算,比如1280×720。对应边与分母消后剩下的2即为缩放后的长度,左右各占一半。

4.3.2 透视投影 Perspective Projection
- 透视投影最典型的特点:近大远小,这就是正常人类的视角或者摄像机的视角
- 相当重要的回顾:在齐次坐标下的点(kx,ky,kz,k)在笛卡尔坐标系中的坐标为(x,y,z)

- (要求远平面的中心不变化,内平面没有任何变化)应用Mpersp ->ortho矩阵将Frustum挤压为Cubiod,将远平面向内挤压至与内面大小一致
- 这个过程,视锥体中越远的部分被压缩的比例越大,因此这一步其实是近大远小的关键
- 再做一次正交投影
最终结果

求挤压矩阵的过程
求挤压矩阵:先只考虑 x 和 y 的变换。因为压缩后,原先发散的视线变成了平行的视线,所以每个点的 x 和 y 坐标在变换后恰好等于它与原点连线在 z=n 平面上的交点的 x 和 y 坐标。

依据这俩等式,在齐次坐标系下,做恒等变形,可以得到一个矩阵方程

这个点在齐次坐标下,所有分量同时×Z,在笛卡尔坐标系下仍然表示同一个点

因此公式①可以改写为

然后就可以得到矩阵的这些数据了:

对于之前建立的方程,把近平面的点带入(近平面上的点z值为n)

目的明确,求M矩阵的第三行,那就直接看n2。只有M矩阵第三行的前两个元素为0才可能得到n2所以与点坐标xy分量无关。未知数只剩下两个,设为A和B(注意n是近平面的z值,已知为n)

规则3:远平面上的点变换前后的z值不变
同理得到方程2:

最终A、B为

为什么挤压变换后物体更靠近远平面:
1.计算角度:

2.经验角度

假设图中的铁轨可能有100m长,但实际你能感觉到图片的后半部分占据了大约80米的长度,这说明在投影变换到屏幕的过程中,点都在向远处移动。
5. Viewport Transformation视口变换:
- 上节课完成了MVP变换
Model transformation 摆放物体
View transformation 变换相机到原点(把变换矩阵同样应用到所有物体,实现相对静止)
Projection transformation 投影到cube[-1,1]3
Z轴暂时无用,需要做的变换为从平面 [-1,1]2 到平面 [0,width]x[0,height],先缩放再平移到一象限的屏幕上(盒子的边长为2,缩放系数是width/2)
实际上就是个2D坐标空间的重新映射


至此,MVPV变换结束,注意咱这些都是在顶点着色器中做的变换,处理的对象是顶点,着色器输出的是从世界空间变换到屏幕上的顶点坐标
- 模型空间 → 世界空间
- 世界空间 → 视觉空间
- 视觉空间→裁剪空间
- 裁剪空间变成屏幕空间





