Appearance

Transform

byml2024-08-24GAMES101

向量和矩阵

  • 向量点乘:获取投影、获取夹角
  • 向量叉乘:判断左右、判断内外
    • 叉乘的矩阵形式:a×b=(0azayaz0axayax0)×b

2D 变换

Linear Transform = Matrix

  • 使用矩阵来表示线性变换

Scale Matrix

[xy]=[s00s][xy]
  • [s00s] 为缩放矩阵,ss 是横纵轴的缩放比例

Reflection Matrix

[1001]
  • 这个矩阵可以让图像关于 x 轴镜像翻转

Rotate Matrix

  • (0,0) 为中心,旋转 θ
[xy]=[cosθsinθsinθcosθ][xy]

Homogenous Coordinates 齐次坐标

  • 矩阵无法表示平移变换,只有 [xy]=[abcd][xy]+[txty] 的形式,才能表示包含平移变换在内的二维变换
  • 为了统一变换的形式,引入第三个维度处理平移变换:
    • 2D Point =(x,y,1)T
    • 2D Vector =(x,y,0)T
  • 在此视角下,平移变换变为:
[xyw]=[10tx01ty001][xy1]=[x+txy+yy1]
  • 通过第三维的 01 取值区分点和向量,具有如下性质:
    • 向量 + 向量 = 向量
    • 点 - 点 = 向量
    • 点 + 向量 = 向量
    • 对“点 + 点”的情况进行扩充定义: (xyw)=(x/wy/w1)(w0),故“点 + 点 = 中点”

齐次坐标下的仿射变换

所有的仿射变换:

[xy]=[abcd][xy]+[txty]

都可以被写成齐次坐标下的矩阵乘法:

[x+txy+yy1]=[abtxcdty001][xy1]

具体到变换:

  • Scale
S(sx,sy)=[sx000sy0001]
  • Rotation
R(θ)=[cosθsinθ0sinθcosθ0001]
  • Translation
T(tx,ty)=[10tx01ty001]

逆变换

  • 逆变换等价于乘逆矩阵

变换组合

  • 变换的组合等价于不断左乘矩阵,因此复合变换的顺序是从右向左施加,例如 T(1,2)R(45°)p 是先旋转再平移。

3D 变换

三维齐次坐标

  • 3D Point =(x,y,z,1)T
  • 3D Vector =(x,y,z,0)T
  • 扩充定义点:(x,y,z,w)T=(xw,yw,zw,1)T(w0)
  • 任何仿射变换也一样可以写成齐次坐标

三维齐次坐标运算矩阵

  • 平移、缩放较为简单,旋转的正方向符合右手螺旋
  • 以原点为中心,绕 x 轴旋转 α
Rx(α)=[10000cosαsinα0sinαcosα0001]
  • 以原点为中心,绕 y 轴旋转 α
Ry(α)=[cosα0sinα00100sinα0cosα00001]
  • 以原点为中心,绕 z 轴旋转 α
Rz(α)=[cosαsinα00sinαcosα0000100001]

任意旋转

将任意旋转分解为绕轴旋转:Rxyz(α,β,γ)=Rx(α)Ry(β)Rz(γ)α,β,γ 为欧拉角(Euler angles) 将旋转分别称为:

  • roll 绕 x 轴旋转(左右摇摆)
  • pitch 绕 y 轴旋转(前后俯仰)
  • yaw 绕 z 轴旋转(左右旋转)

Rodrigues' Rotation Formula

绕轴 n 旋转角度 α

R(n,α)=cos(α)I+(1cosα)nnT+sin(α)(0nznynz0nxnynx0)
  • 默认轴 n 的起点(即旋转的中心点)为原点,如果需要绕其他中心点旋转,则可进行平移→旋转→平移组合操作
  • 最右侧的矩阵就是叉乘系数矩阵,即 n×a=(0nznynz0nxnynx0)×a

Viewing Transformation 观测变换

如何获取一张图像(照片):MVP 过程

  1. Model transformation:放置好场景和模型
  2. View transformation:调整好相机
  3. Projection transformation:获取场景在相机上的投影

View/Camera Transformation 视图变换

相机的参数

  • Position 位置:e
  • Look-at/gaze direction 朝向:g^
  • Up direction 向上方向:t^
    • 向上方向刻画的是相机在其所在平面内的旋转,相当于实体相机镜头和上方闪光灯的连线指向

视图变换

由于拍摄结果只与相对位置的有关,同时移动相机和模型,与只移动模型是等价的,故一般让相机位置固定,参数如下:

  • 位置在原点 e=(0,0,0)
  • 朝向为 z 方向,g^=(0,0,1)
  • 向上方向为 yt^=(0,1,0) 通过一系列变换,可以将任意状态的相机转化为标准位置上的相机。据此思路可推导出视图变换矩阵 Mview=RviewTview
Tview=[100xe010ye001ze0001]Rview=[xg^×t^yg^×t^zg^×t^0xtytzt0xgygzg00001]
$R_{view}$ 求解

在推导 Rview 时,发现 Rview1 相对好推导(即从标准位置到当前位置的旋转矩阵):

Rview1=[xg^×t^xtxg0yg^×t^ytyg0zg^×t^ztzg00001]

故可从 Rview1 求得 Rview 由于旋转矩阵是正交矩阵,有性质 R1=RT,故实际上就是求转置

Model Transformation 模型变换

在调整相机到固定位置时,为了保持相对位置不变,模型和相机会一起进行变换,所以,也常常会将模型变换和视图变换统称为 ModelView Transformation,即模型视图变换

Projection Transformation 投影变换

投影就是从 3D 空间到 2D 图像的过程,常见的投影方式有:

  • Orthographic projection 正交投影:没有近大远小
  • Perspective projection 透视投影:近大远小

正交投影

将一个 [l,r]×[b,t]×[f,n] 的平行于坐标轴的立方体试图映射到Canonical cube(中心为原点,大小为 [1,1]3 的立方体)上

$[f,n]$ 的原因

由于我们是看向 z 方向的,所以远 f 是小于近 n 的,如果是左手系,则不会有这个问题

由此可得正交变换矩阵:

Mortho=[2rl00002tb00002nf00001][000r+l2000t+b2000n+f20001]

透视投影

将透视投影拆成两个操作过程:

  1. 将远平面缩放到与近平面等大小
  2. 将缩放后的远平面正交投影到近平面上 假设远近平面都不动,可以得到缩放矩阵:
Mpersportho=[n0000n0000n+fnf0010]

因此有:Mpersp=MorthoMpersportho

视锥

视锥的参数:

  • Aspect ratio 长宽比
  • Virtical Field of View (fovY) 垂直可视角度 与近平面的转换:
  • tanfovY2=t|n|
  • aspect=rt