Transformation

1. 2D变换

image-20231126190707151

1.1 缩放(scaling)

image-20231126190747793

image-20231126190853847

1.2 镜像变换

image-20231126191121990

1.3 切变(Shear Matrix)

如下图,变换过程中y坐标始终不变

image-20231126192230389

1.4 旋转(Rotate)

image-20231126192327264

1.5 齐次坐标

平移:
image-20231126193641073

为了表示平移操作引入了第三维坐标:

image-20231126193653818

image-20231126193714639

image-20231126193731535

注:point+point的结果为两个点的中点

仿射变换的两种形式:
image-20231126194003729

注:齐次坐标变换矩阵中的a,b,c,d与线性变换中的变换矩阵是对应的

1.6 逆变换

逆变换:变换矩阵为原变换的逆矩阵

image-20231126194715152

2. 3D变换

image-20231126195736702

2.1 仿射变换

image-20231126195828157

注:该表示方法是先做线性变换,然后再平移

2.2 旋转

  • 在轴上

image-20231127122527405

  • 一般的旋转:可以将任意的旋转分为在三个轴上的旋转,其中在三个轴上的旋转角度称为欧拉角

    image-20231127122758750

罗德里格斯公式(Rodrigues’ Rotation Formula):

image-20231127123545604

注:四元数的应用

2.3 视图/相机变换(View / Camera Transformation)

相机的参数:初始位置、观看角度(向量)、竖直角度(向量)

image-20231127125538822

标准化:观看位置为原点、观看角度为-Z、向上方向为Y

image-20231127125835234

变换的方法:

image-20231127125907343

由于正向变换比较复杂,考虑通过其逆矩阵来实现:R为旋转变换矩阵、T为平移变换矩阵、M为整个过程的变换矩阵

image-20231127130030303

注:旋转矩阵为正交矩阵,逆矩阵即是其转置

注:视图变换变换的是相机,其他的物体随着相机一起变换

3 投影变换

3.1 正交投影变换

正交投影变换:平移+压缩

image-20231127131958838

注:l,r为x轴上的距离,b,t为y轴上的距离

3.2 透视投影变换

透视投影类似人眼所看东西的方式,遵循近大远小,平行线也会变得不平行

用正交变换表示透视投影变换:

将透视变换压成投影

image-20231127212210693

image-20231127212333846

注:其中n是近平面,f是远平面,在公式推导的过程中是默认n、f均为负数

因而透视投影矩阵为:

image-20231130123159569

又当投影接口的参数是张角fov,横纵比为aspect,近平面到原点的距离为near,远平面到原点的距离为far

由于长方体视窗体是轴对称,故有l=−r,b=−t,从原点看向−z方向看去,有n=−near,f=−far
image-20231130124140613

image-20231130124220304

所以透视投影矩阵可化简为:

image-20231130124301880

4.视口变换

视口变换用于将标准平面映射到屏幕的分辨率范围之内(缩放+平移),变换矩阵如下:

image-20231128150643474

5.总结

将虚拟世界中以(x,y,z)为坐标的物体变换到以一个个像素位置(x,y) 来表示的屏幕坐标系之中(2维)的步骤:

  • 模型变换(modeling tranformation):这一步的目的是将虚拟世界中或者更具体点,游戏场景中的物体调整至他们应该在的位置
  • 摄像机变换(camera tranformation):在游戏中我们真正在乎的是摄像机(或者说眼睛)所看到的东西,也就是需要得到物体与摄像机的相对位置
  • 投影变换(projection tranformation):根据摄像机变换得到了所有可视范围内的物体对于摄像机的相对位置坐标(x,y,z)之后,便是根据是平行投影还是透视投影,将三维空间投影至标准二维平面([-1,1]^2)之上 (tips:这里的z并没有丢掉,为了之后的遮挡关系检测)
  • 视口变换(viewport transformation):将处于标准平面映射到屏幕分辨率范围之内,即[-1,1]^2→[0,width]*[0,height], 其中width和height指屏幕分辨率大小