我是靠谱客的博主 优雅大船,最近开发中收集的这篇文章主要介绍Games101学习笔记一(渲染流程)齐次坐标(Homogeneous Coordinates)3D转换矩阵(3D Transformations)相机转换NDC到屏幕空间(Canonical Cube to Screen)光栅化(Rasterization)引用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 齐次坐标(Homogeneous Coordinates)
  • 3D转换矩阵(3D Transformations)
    • 3D 缩放
    • 3D 平移
    • 3D 旋转
    • Rodrigues’ Rotation Formula
      • Rodrigues’ Rotation Formula旋转证明
  • 相机转换
    • 相机平移
    • 相机旋转
    • 相机投影
  • NDC到屏幕空间(Canonical Cube to Screen)
  • 光栅化(Rasterization)
  • 引用

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

齐次坐标(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

最后

以上就是优雅大船为你收集整理的Games101学习笔记一(渲染流程)齐次坐标(Homogeneous Coordinates)3D转换矩阵(3D Transformations)相机转换NDC到屏幕空间(Canonical Cube to Screen)光栅化(Rasterization)引用的全部内容,希望文章能够帮你解决Games101学习笔记一(渲染流程)齐次坐标(Homogeneous Coordinates)3D转换矩阵(3D Transformations)相机转换NDC到屏幕空间(Canonical Cube to Screen)光栅化(Rasterization)引用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部