Games101学习笔记一(渲染流程)

内容参考来自闫令琪老师的课程,有兴趣的同学可以去看完整课程

齐次坐标(Homogeneous Coordinates)

我们需要齐次坐标来帮助我们使用矩阵变换原来的顶点的位置,因为二维矩阵做不到移动二维的顶点,三维矩阵做不到移动三维的顶点,所以需要先把顶点或者向量扩展到齐次坐标,然后再做齐次坐标下的矩阵变换,最后做齐次化,得到新的变换后的顶点。

对于二维坐标,不能直接用二维矩阵做移动的操作,所以需要使用其次坐标,先把顶点或者向量转换到齐次坐标,就是为顶点添加一个w维,并设置为1,向量的w则设置为0。三维顶点或者向量是一样的,都需要在最后添加一个w维。
在这里插入图片描述最后的顶点坐标需要齐次坐标做齐次化才行,就是除以w维。

在这里插入图片描述
在这里插入图片描述
顶点的旋转,要先移回原点,然后旋转,最后再移回去

在这里插入图片描述

3D转换矩阵(3D Transformations)

3D 缩放

S ( s x , s y , s z ) = ( s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 ) \mathbf{S}\left(s_{x}, s_{y}, s_{z}\right)=\left(\begin{array}{cccc} s_{x} & 0 & 0 & 0 \\ 0 & s_{y} & 0 & 0 \\ 0 & 0 & s_{z} & 0 \\ 0 & 0 & 0 & 1 \end{array}\right) S(sx,sy,sz)=sx0000sy0000sz00001

3D 平移

T ( t x , t y , t z ) = ( 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ) \mathbf{T}\left(t_{x}, t_{y}, t_{z}\right)=\left(\begin{array}{cccc} 1 & 0 & 0 & t_{x} \\ 0 & 1 & 0 & t_{y} \\ 0 & 0 & 1 & t_{z} \\ 0 & 0 & 0 & 1 \end{array}\right) T(tx,ty,tz)=100001000010txtytz1

3D 旋转

坐标系统为如下图,一点顶点绕着轴 x x x 旋转 α \alpha α 角的计算如下。

在这里插入图片描述对于顶点绕着各个轴旋转的矩阵就是如下形式。

R x ( α ) = ( 1 0 0 0 0 cos ⁡ α − sin ⁡ α 0 0 sin ⁡ α cos ⁡ α 0 0 0 0 1 ) R y ( α ) = ( cos ⁡ α 0 sin ⁡ α 0 0 1 0 0 − sin ⁡ α 0 cos ⁡ α 0 0 0 0 1 ) R z ( α ) = ( cos ⁡ α − sin ⁡ α 0 0 sin ⁡ α cos ⁡ α 0 0 0 0 1 0 0 0 0 1 ) \begin{array}{l} \mathbf{R}_{x}(\alpha)=\left(\begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & \cos \alpha & -\sin \alpha & 0 \\ 0 & \sin \alpha & \cos \alpha & 0 \\ 0 & 0 & 0 & 1 \end{array}\right) \\ \\ \mathbf{R}_{y}(\alpha)=\left(\begin{array}{cccc} \cos \alpha & 0 & \sin \alpha & 0 \\ 0 & 1 & 0 & 0 \\ -\sin \alpha & 0 & \cos \alpha & 0 \\ 0 & 0 & 0 & 1 \end{array}\right) \\ \\ \mathbf{R}_{z}(\alpha)=\left(\begin{array}{cccc} \cos \alpha & -\sin \alpha & 0 & 0 \\ \sin \alpha & \cos \alpha & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right) \end{array} Rx(α)=10000cosαsinα00sinαcosα00001Ry(α)=cosα0sinα00100sinα0cosα00001Rz(α)=cosαsinα00sinαcosα0000100001

对于列向量,当这些基础旋转矩阵的旋转轴朝向观察者的时候,使用的是右手坐标系,而且旋转角度 α \alpha α 是正的,而且都是逆时针(counter clock)方向的旋转。
举例:绕 z z z 轴旋转 9 0 ∘ 90^\circ 90
R z ( 9 0 ∘ ) [ 1 0 0 ] = [ cos ⁡ 9 0 ∘ − sin ⁡ 9 0 ∘ 0 sin ⁡ 9 0 ∘ cos ⁡ 9 0 ∘ 0 0 0 1 ] [ 1 0 0 ] = [ 0 − 1 0 1 0 0 0 0 1 ] [ 1 0 0 ] = [ 0 1 0 ] {\displaystyle R_{z}(90^{\circ }){\begin{bmatrix}1\\0\\0\\\end{bmatrix}}={\begin{bmatrix}\cos 90^{\circ }&-\sin 90^{\circ }&0\\\sin 90^{\circ }&\quad \cos 90^{\circ }&0\\0&0&1\\\end{bmatrix}}{\begin{bmatrix}1\\0\\0\\\end{bmatrix}}={\begin{bmatrix}0&-1&0\\1&0&0\\0&0&1\\\end{bmatrix}}{\begin{bmatrix}1\\0\\0\\\end{bmatrix}}={\begin{bmatrix}0\\1\\0\\\end{bmatrix}}} Rz(90)100=cos90sin900sin90cos900001100=010100001100=010

由roll,pitch,raw来表达右手笛卡尔坐标系绕x,y,z轴的旋转。当然用欧拉角来表示会更友好一点, α , β , γ \alpha, \beta, \gamma α,β,γ 分别是绕着轴 x , y , z x,y,z x,y,z 的旋转角。被乘的顶点则被按照顺序旋转
R = R z ( α )   R y ( β )   R x ( γ ) = [ cos ⁡ α − sin ⁡ α 0 sin ⁡ α cos ⁡ α 0 0 0 1 ] yaw [ cos ⁡ β 0 sin ⁡ β 0 1 0 − sin ⁡ β 0 cos ⁡ β ] pitch [ 1 0 0 0 cos ⁡ γ − sin ⁡ γ 0 sin ⁡ γ cos ⁡ γ ] roll {\displaystyle R=R_{z}(\alpha )\,R_{y}(\beta )\,R_{x}(\gamma )={\overset {\text{yaw}}{\begin{bmatrix}\cos \alpha &-\sin \alpha &0\\\sin \alpha &\cos \alpha &0\\0&0&1\\\end{bmatrix}}}{\overset {\text{pitch}}{\begin{bmatrix}\cos \beta &0&\sin \beta \\0&1&0\\-\sin \beta &0&\cos \beta \\\end{bmatrix}}}{\overset {\text{roll}}{\begin{bmatrix}1&0&0\\0&\cos \gamma &-\sin \gamma \\0&\sin \gamma &\cos \gamma \\\end{bmatrix}}}} R=Rz(α)Ry(β)Rx(γ)=cosαsinα0sinαcosα0001yawcosβ0sinβ010sinβ0cosβpitch1000cosγsinγ0sinγcosγroll

R = [ cos ⁡ α cos ⁡ β cos ⁡ α sin ⁡ β sin ⁡ γ − sin ⁡ α cos ⁡ γ cos ⁡ α sin ⁡ β cos ⁡ γ + sin ⁡ α sin ⁡ γ sin ⁡ α cos ⁡ β sin ⁡ α sin ⁡ β sin ⁡ γ + cos ⁡ α cos ⁡ γ sin ⁡ α sin ⁡ β cos ⁡ γ − cos ⁡ α sin ⁡ γ − sin ⁡ β cos ⁡ β sin ⁡ γ cos ⁡ β cos ⁡ γ ] {\displaystyle R={\begin{bmatrix}\cos \alpha \cos \beta &\cos \alpha \sin \beta \sin \gamma -\sin \alpha \cos \gamma &\cos \alpha \sin \beta \cos \gamma +\sin \alpha \sin \gamma \\\sin \alpha \cos \beta &\sin \alpha \sin \beta \sin \gamma +\cos \alpha \cos \gamma &\sin \alpha \sin \beta \cos \gamma -\cos \alpha \sin \gamma \\-\sin \beta &\cos \beta \sin \gamma &\cos \beta \cos \gamma \\\end{bmatrix}}} R=cosαcosβsinαcosβsinβcosαsinβsinγsinαcosγsinαsinβsinγ+cosαcosγcosβsinγcosαsinβcosγ+sinαsinγsinαsinβcosγcosαsinγcosβcosγ

Rodrigues’ Rotation Formula

而绕指定的轴旋转特定角的矩阵

绕着轴 n n n 旋转角度 α \alpha α
R ( n , α ) = cos ⁡ ( α ) I + ( 1 − cos ⁡ ( α ) ) n n T + sin ⁡ ( α ) ( 0 − n z n y n z 0 − n x − n y n x 0 ) ⏟ N \mathbf{R}(\mathbf{n}, \alpha)=\cos (\alpha) \mathbf{I}+(1-\cos (\alpha)) \mathbf{n} \mathbf{n}^{T}+\sin (\alpha) \underbrace{\left(\begin{array}{ccc} 0 & -n_{z} & n_{y} \\ n_{z} & 0 & -n_{x} \\ -n_{y} & n_{x} & 0 \end{array}\right)}_{\mathbf{N}} R(n,α)=cos(α)I+(1cos(α))nnT+sin(α)N 0nznynz0nxnynx0

Rodrigues’ Rotation Formula旋转证明

在这里插入图片描述

相机转换

相机平移和旋转以及投影矩阵
M view = R view T view M_{\text {view}}=R_{\text {view}} T_{\text {view}} Mview=RviewTview

相机平移

定义相机位置属性

  • Position e ⃗ \vec{e} e
  • Look-at / gaze direction g ^ \hat{g} g^
  • Up direction t ^ \hat{t} t^

The origin, up at Y, look at -Z
其实就是相机从世界空间转换到局部空间的矩阵,把顶点移动到原点,
T v i e w = [ 1 0 0 − x e 0 1 0 − y e 0 0 1 − z e 0 0 0 1 ] T_{v i e w}=\left[\begin{array}{cccc} 1 & 0 & 0 & -x_{e} \\ 0 & 1 & 0 & -y_{e} \\ 0 & 0 & 1 & -z_{e} \\ 0 & 0 & 0 & 1 \end{array}\right] Tview=100001000010xeyeze1

相机旋转

相机的旋转矩阵其实就是把相机从世界空间到局部空间的旋转矩阵
Consider its inverse rotation: X to (g x t), Y to t, Z to -g

R view = [ x g ^ × t ^ y g ^ × t ^ z g ^ × t ^ 0 x t y t z t 0 x − g y − g z − g 0 0 0 0 1 ] R_{\text {view}}=\left[\begin{array}{cccc} x_{\hat{g} \times \hat{t}} & y_{\hat{g} \times \hat{t}} & z_{\hat{g} \times \hat{t}} & 0 \\ x_{t} & y_{t} & z_{t} & 0 \\ x_{-g} & y_{-g} & z_{-g} & 0 \\ 0 & 0 & 0 & 1 \end{array}\right] Rview=xg^×t^xtxg0yg^×t^ytyg0zg^×t^ztzg00001

相机投影

  • Orthographic projection
  • Perspective projection

最终把坐标投影到NDF,在opengl下是 [ − 1 , 1 ] 3 [-1,1]^3 [1,1]3

在这里插入图片描述

NDC到屏幕空间(Canonical Cube to Screen)

在这里插入图片描述

光栅化(Rasterization)

  • Point-in-triangle test(点在三角形中的测试)
  • Aliasing(抗锯齿)

在这里插入图片描述
光栅化就是判断最后转换到屏幕空间的三角形,对其它的在屏幕空间的包围盒,判断像素是不是在其内,如果是,那么就画出当前点差值出来的颜色,如果不是,则继续遍历。

引用

[1]https://sites.cs.ucsb.edu/~lingqi/teaching/resources/

[2] https://en.wikipedia.org/wiki/Rotation_matrix

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值