对应 Games101 Lecture 3~4

# 模型变换

# 齐次坐标

就是将
[xyz]\begin{bmatrix}x\\ y\\ z\end{bmatrix} 表示为 [xwywzww]\begin{bmatrix}xw\\ yw\\ zw\\ w\end{bmatrix},其中 w0 \ne 0
向量 [xyz]\begin{bmatrix}x\\ y\\ z\end{bmatrix} 表示为 [xyz0]\begin{bmatrix}x\\ y\\ z\\ 0\end{bmatrix}
除了点和点相加的结果为中点以外,其他加减运算法则

# 线性变换

满足 f (a+b)=f (a)+f (b) 的变换
其中 f (x) 可以表示为矩阵 * 向量

# 仿射变换

满足 g (x)=f (x)+a 的变换,a 取 0 向量即线性变换
可以理解先线性变换再平移
g (x) 可以表示为齐次坐标下的矩阵 * 向量

# 正交变换(optional)

变换矩阵为标准正交基组成的矩阵
变换前后长度、面积、体积的绝对值不变

# 刚体变换(optional)

仿射 + 正交 + 保持内部角度

# 常见案例

以下使用其次坐标的 4*4 矩阵
若第四行和第四列中近右下角元素为 1,其余为 0,可以删去第四行和第四列

# 旋转

正交矩阵
绕 x 轴

[10000cosθsinθ00sinθcosθ00001]\begin{bmatrix} 1& 0& 0& 0\\ 0& cos\theta& sin\theta&0 \\ 0& -sin\theta& cos\theta&0 \\ 0& 0& 0&1 \end{bmatrix}

绕 y 轴

[cosθ0sinθ00100sinθ0cosθ00001]\begin{bmatrix} cos\theta& 0& -sin\theta& 0\\ 0& 1&0 &0 \\ sin\theta& 0& cos\theta&0 \\ 0& 0& 0&1 \end{bmatrix}

绕 z 轴

[cosθsinθ00sinθcosθ0000100001]\begin{bmatrix} cos\theta& sin\theta&0 & 0\\ -sin\theta& cos\theta&0 &0 \\ 0& 0&1 &0 \\ 0& 0& 0&1 \end{bmatrix}

# 缩放

k 为缩放系数

[kx0000ky0000kz00001]\begin{bmatrix} k_{x} &0 &0 &0 \\ 0& k_{y}&0 &0 \\ 0&0 & k_{z}&0 \\ 0& 0 &0 &1 \end{bmatrix}

# 平移

v 为平移的向量

[100vx010vy001vz0001]\begin{bmatrix} 1 &0 &0 &v_{x} \\ 0& 1&0 &v_{y} \\ 0&0 & 1&v_{z} \\ 0& 0 &0 &1 \end{bmatrix}

# 推导

因为所有仿射变换都可以用齐次坐标的变换矩阵表示
根据一些特殊值我们可以得到一些方程,就可以解出来这个变换矩阵了

# 拓展

那么问题来了,如果要沿着某一根特定的轴而非坐标轴又该如何变换呢
"只需要把未知的问题转化为已解决的问题"
"正难则反"

# 视点变换 Viewing

# 视图变换 View

摄像机拥有三个属性
所在位置e\vec{e}
观察方向g\vec{g}
向上方向t\vec{t},摄像机向上的方向,垂直于观察方向,可以绕着观察方向旋转
视图变换将g\vec{g}, t\vec{t}, g×t\vec{g\times t} 分别变换为Z\vec{-Z}, Y\vec{Y}, X\vec{X}
该矩阵不好推导
但是逆矩阵容易推

[g×ttg00001]\begin{bmatrix} \vec{g\times t} & \vec{t} &\vec{-g} &\vec{0} \\ 0&0 &0 &1 \end{bmatrix}

都是单位向量的话,就是正交矩阵了
逆矩阵就是他的转置!
视图变换完就可以投影了

# 正交投影

相当于无限大的焦距
所有平行线变换后平行交于无穷远点
相当于把视野内的物体转换到一个 [-1,1]*[-1,1] 的矩形里,并丢失 z 坐标
具体操作就是将要渲染的长方体空间通过平移和缩放转换为规范性,即 - 1 到 + 1,中心在原点的立方体

# 透视投影

视野变为一个棱台
需要把它映射到一个长方体中,再进行正交投影
通过一些特殊的点,以及把齐次坐标下的 w 变为 z 这种骚操作
可得到变换矩阵 (透视到正交) 为

[n0000n0000n+fnf0010]\begin{bmatrix} n& 0& 0& 0\\ 0& n& 0&0 \\ 0& 0 & n+f&-nf \\ 0& 0& 1&0 \end{bmatrix}

n 为靠近摄像机平面的 z 坐标,f 为远离摄像机平面的 z 坐标
因为摄像机看向 - Z 轴,所以 n>f

# 总结

先进行模型变换
再进行视口变换
最后进行投影
然后就可以光栅化了