对应 Games101 Lecture 3~4
# 模型变换
# 齐次坐标
就是将
点 ⎣⎢⎡xyz⎦⎥⎤ 表示为 ⎣⎢⎢⎢⎡xwywzww⎦⎥⎥⎥⎤,其中 w0 = 0
向量 ⎣⎢⎡xyz⎦⎥⎤ 表示为 ⎣⎢⎢⎢⎡xyz0⎦⎥⎥⎥⎤
除了点和点相加的结果为中点以外,其他加减运算法则
# 线性变换
满足 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⎦⎥⎥⎥⎤
绕 y 轴
⎣⎢⎢⎢⎡cosθ0sinθ00100−sinθ0cosθ00001⎦⎥⎥⎥⎤
绕 z 轴
⎣⎢⎢⎢⎡cosθ−sinθ00sinθcosθ0000100001⎦⎥⎥⎥⎤
# 缩放
k 为缩放系数
⎣⎢⎢⎢⎡kx0000ky0000kz00001⎦⎥⎥⎥⎤
# 平移
v 为平移的向量
⎣⎢⎢⎢⎡100001000010vxvyvz1⎦⎥⎥⎥⎤
# 推导
因为所有仿射变换都可以用齐次坐标的变换矩阵表示
根据一些特殊值我们可以得到一些方程,就可以解出来这个变换矩阵了
# 拓展
那么问题来了,如果要沿着某一根特定的轴而非坐标轴又该如何变换呢
"只需要把未知的问题转化为已解决的问题"
"正难则反"
# 视点变换 Viewing
# 视图变换 View
摄像机拥有三个属性
所在位置e
观察方向g
向上方向t,摄像机向上的方向,垂直于观察方向,可以绕着观察方向旋转
视图变换将g, t, g×t 分别变换为−Z, Y, X
该矩阵不好推导
但是逆矩阵容易推倒
[g×t0t0−g001]
都是单位向量的话,就是正交矩阵了
逆矩阵就是他的转置!
视图变换完就可以投影了
# 正交投影
相当于无限大的焦距
所有平行线变换后平行交于无穷远点
相当于把视野内的物体转换到一个 [-1,1]*[-1,1] 的矩形里,并丢失 z 坐标
具体操作就是将要渲染的长方体空间通过平移和缩放转换为规范性,即 - 1 到 + 1,中心在原点的立方体
# 透视投影
视野变为一个棱台
需要把它映射到一个长方体中,再进行正交投影
通过一些特殊的点,以及把齐次坐标下的 w 变为 z 这种骚操作
可得到变换矩阵 (透视到正交) 为
⎣⎢⎢⎢⎡n0000n0000n+f100−nf0⎦⎥⎥⎥⎤
n 为靠近摄像机平面的 z 坐标,f 为远离摄像机平面的 z 坐标
因为摄像机看向 - Z 轴,所以 n>f
# 总结
先进行模型变换
再进行视口变换
最后进行投影
然后就可以光栅化了