GAMES101-现代计算机图形学入门-闫令琪 课程笔记 - 汇总(上)

news2024/11/23 12:48:18

一些前言与感慨:

学了再多的AI,终究还是没有办法拒绝计算机图形学的魅力。当初就不该一招不慎,踏入AI的坑。

可惜当年在学校里学计算机图形学的时候,还没有闫令琪这么好的课程,当时学得一知半解,云里雾里,希望一切重新拾起还不算太晚。

GAMES101 11周的课程,值得用 C++和 OpenGL 好好写一写代码

学了计算机图形学,人会感慨数学公式和世界的奇妙,之前学的概率论、线性代数、高数、信号处理等,在这里统统用上了。时常觉得世界一定有一个很强大的运算器,才可以把真实世界渲染得这么完美,天衣无缝,没有bug.


文章目录

  • 0 介绍
  • 1 向量与线性代数
    • 向量的计算
      • 点乘(dot/scalar product)
      • 叉乘(cross/vector product)
    • 在内部
      • 坐标系
    • 矩阵乘法
  • 2 变换
    • 2维变换
      • 缩放
      • 斜切
      • 旋转
    • 齐次坐标
      • 平移变换
      • 仿射变换
        • 缩放
        • 旋转
        • 平移
    • 组合变换
    • 逆变换
      • 旋转
    • 三维变换
      • 缩放
      • 平移
      • 旋转
        • 齐次坐标
        • 欧拉角
    • 观测变换(viewing)
      • view/camera transformation 视图变换
      • projection transformation 投影变换
        • Orthographic projection 正交投影
        • perspective projection 透视投影
  • 3 光栅化
    • 锯齿问题
    • 抗锯齿
    • 滤波
    • 深度测试 Z-buffer

0 介绍

  1. 课程主页
  2. 计算机图形学与混合现实在线平台GAMES
  3. GAMES101-现代计算机图形学入门-闫令琪
  4. 课程笔记
  5. 课程笔记🌟
  6. 作业链接

光线追踪 - 慢,常用于电影中,生成效果好,一般离线使用
有实时光线追踪算法

  • 不讲 shaders
  • OpenGL / DirectX / Vulcan 属于 API,不会教如何做
  • 不会教你使用 unity / unreal 引擎

在这里插入图片描述在这里插入图片描述

总的大纲:

  1. 向量与线性代数、变换(二维、三维)、变换(模型、视图、投影)
  2. 光栅化(三角形的离散化、深度测试与抗锯齿)
  3. 着色
  4. 几何
  5. 光线追踪
  6. 材质与外观

1 向量与线性代数

向量:方向和长度,不关心绝对的起始位置
向量长度
单位向量
向量求和:平行四边形法则,三角形法则
代数上,直接求和

向量的计算

点乘(dot/scalar product)

  • a ⃗ ⋅ b ⃗ = ∥ a ⃗ ∥ ∥ b ⃗ ∥ cos ⁡ θ \vec{a} \cdot \vec{b}=\|\vec{a}\|\|\vec{b}\| \cos \theta a b =a b cosθ
  • cos ⁡ θ = a ⃗ ⋅ b ⃗ ∥ a ⃗ ∥ ∥ b ⃗ ∥ \cos \theta=\frac{\vec{a} \cdot \vec{b}}{\|\vec{a}\|\|\vec{b}\|} cosθ=a b a b
  • 当两个向量都是单位向量时, cos ⁡ θ = a ^ ⋅ b ^ \cos \theta=\hat{a} \cdot \hat{b} cosθ=a^b^
  • 性质:
    • 交换律: a ⃗ ⋅ b ⃗ = b ⃗ ⋅ a ⃗ \vec{a} \cdot \vec{b}=\vec{b} \cdot \vec{a} a b =b a
    • 分配律: a ⃗ ⋅ ( b ⃗ + c ⃗ ) = a ⃗ ⋅ b ⃗ + a ⃗ ⋅ c ⃗ \vec{a} \cdot(\vec{b}+\vec{c})=\vec{a} \cdot \vec{b}+\vec{a} \cdot \vec{c} a (b +c )=a b +a c
    • 结合律: ( k a ⃗ ) ⋅ b ⃗ = a ⃗ ⋅ ( k b ⃗ ) = k ( a ⃗ ⋅ b ⃗ ) (k \vec{a}) \cdot \vec{b}=\vec{a} \cdot(k \vec{b})=k(\vec{a} \cdot \vec{b}) (ka )b =a (kb )=k(a b )
  • 在笛卡尔坐标系下:
    • 2维: a ⃗ ⋅ b ⃗ = ( x a y a ) ⋅ ( x b y b ) = x a x b + y a y b \vec{a} \cdot \vec{b}=\left(\begin{array}{l}x_a \\ y_a\end{array}\right) \cdot\left(\begin{array}{l}x_b \\ y_b\end{array}\right)=x_a x_b+y_a y_b a b =(xaya)(xbyb)=xaxb+yayb
    • 3维: a ⃗ ⋅ b ⃗ = ( x a y a z a ) ⋅ ( x b y b z b ) = x a x b + y a y b + z a z b \vec{a} \cdot \vec{b}=\left(\begin{array}{c}x_a \\ y_a \\ z_a\end{array}\right) \cdot\left(\begin{array}{c}x_b \\ y_b \\ z_b\end{array}\right)=x_a x_b+y_a y_b+z_a z_b a b =xayazaxbybzb=xaxb+yayb+zazb
  • 图形学中的应用:
    • 找到光照和平面的夹角
    • 找到一个向量在另一个向量上的投影: b ⃗ ⊥ = k a ^ = ∥ b ⃗ ∥ cos ⁡ θ a ^ \vec{b}_{\perp}=k \hat{a} = \|\vec{b}\| \cos \theta \hat{a} b =ka^=b cosθa^
      • 请添加图片描述
    • 可以计算方向性
      • 请添加图片描述
    • 两个方向有多接近

叉乘(cross/vector product)

  • 叉乘后的向量垂直于 a 和b 的向量组成的平面 a × b = − b × a a \times b=-b \times a a×b=b×a不满足交换律
    • 大小: ∥ a × b ∥ = ∥ a ∥ b ∥ sin ⁡ ϕ \|a \times b\|=\|a\| b \| \sin \phi a×b=absinϕ
    • 方向:右手定则(从a旋转到b的方向)(openGL API里是左手系)
  • 性质:
    • x ⃗ × y ⃗ = + z ⃗ \vec{x} \times \vec{y}=+\vec{z} x ×y =+z
    • y ⃗ × x ⃗ = − z ⃗ \vec{y} \times \vec{x}=-\vec{z} y ×x =z
    • y ⃗ × z ⃗ = + x ⃗ \vec{y} \times \vec{z}=+\vec{x} y ×z =+x
    • z ⃗ × y ⃗ = − x ⃗ \vec{z} \times \vec{y}=-\vec{x} z ×y =x
    • z ⃗ × x ⃗ = + y ⃗ \vec{z} \times \vec{x}=+\vec{y} z ×x =+y
    • x ⃗ × z ⃗ = − y ⃗ \vec{x} \times \vec{z}=-\vec{y} x ×z =y
    • a ⃗ × b ⃗ = − b ⃗ × a ⃗ \vec{a} \times \vec{b}=-\vec{b} \times \vec{a} a ×b =b ×a
    • a ⃗ × a ⃗ = 0 → \vec{a} \times \vec{a}=\overrightarrow{0} a ×a =0 长度为0的向量
    • 分配律: a ⃗ × ( b ⃗ + c ⃗ ) = a ⃗ × b ⃗ + a ⃗ × c ⃗ \vec{a} \times(\vec{b}+\vec{c})=\vec{a} \times \vec{b}+\vec{a} \times \vec{c} a ×(b +c )=a ×b +a ×c
    • 结合律: a ⃗ × ( k b ⃗ ) = k ( a ⃗ × b ⃗ ) \vec{a} \times(k \vec{b})=k(\vec{a} \times \vec{b}) a ×(kb )=k(a ×b )
  • 代数
    • a ⃗ × b ⃗ = ( y a z b − y b z a z a x b − x a z b x a y b − y a x b ) \vec{a} \times \vec{b}=\left(\begin{array}{c}y_a z_b-y_b z_a \\ z_a x_b-x_a z_b \\ x_a y_b-y_a x_b\end{array}\right) a ×b =yazbybzazaxbxazbxaybyaxb
    • 可以表示成矩阵的形式: a ⃗ × b ⃗ = A ∗ b = ( 0 − z a y a z a 0 − x a − y a x a 0 ) ( x b y b z b ) \vec{a} \times \vec{b}=A^* b=\left(\begin{array}{ccc}0 & -z_a & y_a \\ z_a & 0 & -x_a \\ -y_a & x_a & 0\end{array}\right)\left(\begin{array}{l}x_b \\ y_b \\ z_b\end{array}\right) a ×b =Ab=0zayaza0xayaxa0xbybzb
  • 应用:
    • 判定左右

      • b 在 a 的左还是右?
      • a 叉乘 b
        • 得到正值,则 b 在 a 左侧
        • 得到负值,则 b 在 a 的右侧
    • 判定内外(光栅化的基础,对内部的点进行着色

      • 在内部

        • 点 ABC 逆时针排列
          • AB 叉乘 AP,正数,P在AB左侧
          • BC 叉乘 BP,正数,P在BC左侧
          • CA 叉乘 CP,正数,P在CA左侧
        • 如果不确定点 ABC是顺时针还是逆时针
          • P 一定都在 AB、BC、CA 的左边或者右边,否则在外部
        • 为0的时候,可以说在里面,也可以说在外面(corner case)

坐标系

  • 任意三个向量,如果满足以下条件,则构成一个直角坐标系
    • ∥ u ⃗ ∥ = ∥ v ⃗ ∥ = ∥ w ⃗ ∥ = 1 \|\vec{u}\|=\|\vec{v}\|=\|\vec{w}\|=1 u =v =w =1
    • u ⃗ ⋅ v ⃗ = v ⃗ ⋅ w ⃗ = u ⃗ ⋅ w ⃗ = 0 \vec{u} \cdot \vec{v}=\vec{v} \cdot \vec{w}=\vec{u} \cdot \vec{w}=0 u v =v w =u w =0
    • w ⃗ = u ⃗ × v ⃗ \vec{w}=\vec{u} \times \vec{v} \quad w =u ×v (right-handed)
  • 任意一个向量,分解到这个直角坐标系中,用投影相加
    • p ⃗ = ( p ⃗ ⋅ u ⃗ ) u ⃗ + ( p ⃗ ⋅ v ⃗ ) v ⃗ + ( p ⃗ ⋅ w ⃗ ) w ⃗ \vec{p}=(\vec{p} \cdot \vec{u}) \vec{u}+(\vec{p} \cdot \vec{v}) \vec{v}+(\vec{p} \cdot \vec{w}) \vec{w} p =(p u )u +(p v )v +(p w )w

矩阵乘法

  • 矩阵变换:移动、旋转、缩放、错切
    • 性质:
      • 没有交换律
      • 结合律: ( A B ) C = A ( B C ) (A B) C=A(B C) (AB)C=A(BC)
      • 分配律:
        • A ( B + C ) = A B + A C A(B+C)=A B+A C A(B+C)=AB+AC
        • ( A + B ) C = A C + B C (A+B) C=A C+B C (A+B)C=AC+BC
  • 矩阵的转置
    • 行和列交换
      • ( 1 2 3 4 5 6 ) T = ( 1 3 5 2 4 6 ) \left(\begin{array}{ll}1 & 2 \\ 3 & 4 \\ 5 & 6\end{array}\right)^T=\left(\begin{array}{lll}1 & 3 & 5 \\ 2 & 4 & 6\end{array}\right) 135246T=(123456)
    • 性质: ( A B ) T = B T A T (A B)^T=B^T A^T (AB)T=BTAT
  • 单位矩阵
    • 对角阵
  • 矩阵互逆:
    • A A − 1 = A − 1 A = I A A^{-1}=A^{-1} A=I AA1=A1A=I
    • 性质: ( A B ) − 1 = B − 1 A − 1 (A B)^{-1}=B^{-1} A^{-1} (AB)1=B1A1
  • 用矩阵的形式表示向量的计算
    • 点乘: a ⃗ ⋅ b ⃗ = a ⃗ T b ⃗ = ( x a y a z a ) ( x b y b z b ) = ( x a x b + y a y b + z a z b ) \vec{a} \cdot \vec{b}=\vec{a}^T \vec{b}=\left(\begin{array}{lll}x_a & y_a & z_a\end{array}\right)\left(\begin{array}{c}x_b \\ y_b \\ z_b\end{array}\right)=\left(x_a x_b+y_a y_b+z_a z_b\right) a b =a Tb =(xayaza)xbybzb=(xaxb+yayb+zazb)
    • 叉乘: a ⃗ × b ⃗ = A ∗ b = ( 0 − z a y a z a 0 − x a − y a x a 0 ) ( x b y b z b ) \vec{a} \times \vec{b}=A^* b=\left(\begin{array}{ccc}0 & -z_a & y_a \\ z_a & 0 & -x_a \\ -y_a & x_a & 0\end{array}\right)\left(\begin{array}{l}x_b \\ y_b \\ z_b\end{array}\right) a ×b =Ab=0zayaza0xayaxa0xbybzb(向量 a ⃗ \vec{a} a 的对偶矩阵 A ∗ A^* A

2 变换

  • 用途:

    • 模型变换(modeling)
    • 视图变换(viewing)
      • 三维投影到二维(视图发生变化)
  • MVP 变换:model transformation -> view transformation -> projection transformation

2维变换

  • 线性变换:
    • x ′ = a x + b y x^{\prime}=ax+by x=ax+by
    • y ′ = c x + d y y^{\prime}=cx+dy y=cx+dy
    • [ x ′ y ′ ] = [ a b c d ] [ x y ] \left[\begin{array}{l}x^{\prime} \\ y^{\prime}\end{array}\right]=\left[\begin{array}{ll}a & b \\ c & d\end{array}\right]\left[\begin{array}{l}x \\ y\end{array}\right] [xy]=[acbd][xy]
  • 用矩阵表示

缩放

  • [ x ′ y ′ ] = [ s x 0 0 s y ] [ x y ] = [ s x x s y y ] \left[\begin{array}{l}x^{\prime} \\ y^{\prime}\end{array}\right]=\left[\begin{array}{ll}s_x & 0 \\ 0 & s_y\end{array}\right]\left[\begin{array}{l}x \\ y\end{array}\right] = \left[\begin{array}{l}s_x x \\ s_y y\end{array}\right] [xy]=[sx00sy][xy]=[sxxsyy]

  • 沿着 y 轴的反射:KaTeX parse error: Unknown column alignment: m at position 191: …[\begin{array}{m̲} -x \\ y \end…

斜切

请添加图片描述

  • [ x ′ y ′ ] = [ 1 a 0 1 ] [ x y ] \left[\begin{array}{l}x^{\prime} \\ y^{\prime}\end{array}\right]=\left[\begin{array}{ll}1 & a \\ 0 & 1\end{array}\right]\left[\begin{array}{l}x \\ y\end{array}\right] [xy]=[10a1][xy]

旋转

默认是绕着原点逆时针旋转
请添加图片描述

  • 旋转矩阵: R θ = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] \mathbf{R}_\theta=\left[\begin{array}{cc}\textcolor{#7785aa}{\cos \theta} & \textcolor{#e4da9a}{-\sin \theta} \\ \textcolor{#7785aa}{\sin \theta} & \textcolor{#e4da9a}{\cos \theta} \end{array}\right] Rθ=[cosθsinθsinθcosθ]

齐次坐标

平移变换

  • 平移变换不属于线性变换!!!

    • Q:如何用一种统一的方法来表示?
    • A:二维的向量增加一个维度,变成三维的(引入齐次变换
      • 二维的点: ( x , y , 1 ) T \left(\mathbf{x}, \mathbf{y}, \textcolor{red}{1}\right)^{\mathrm{T}} (x,y,1)T
      • 二维的向量: ( x , y , 0 ) T \left(\mathbf{x}, \mathbf{y}, \textcolor{red}{0}\right)^{\mathrm{T}} (x,y,0)T - 向量具有平移不变性
    • 验证其有效性:
      • 向量 + 向量 = 向量
      • 点 - 点 = 向量
      • 点 + 向量 = 点
      • 点 + 点 = 两个点的中点(扩充的定义) - ( x y w ) \left(\begin{array}{l}x \\ y \\ w \end{array}\right) xyw 相当于 ( x w y w 1 ) \left(\begin{array}{l}\frac{x}{w} \\ \frac{y}{w} \\ 1 \end{array}\right) wxwy1 此处 w ≠ 0 w\neq 0 w=0
  • ( x ′ y ′ ) = ( x y ) + ( t x t y ) \left(\begin{array}{l}x^{\prime} \\ y^{\prime}\end{array}\right)=\left(\begin{array}{l}x \\ y\end{array}\right)+\left(\begin{array}{l}t_x \\ t_y\end{array}\right) (xy)=(xy)+(txty)

  • ( x ′ y ′ w ′ ) = ( 1 0 t x 0 1 t y 0 0 1 ) ⋅ ( x y 1 ) = ( x + t x y + t y 1 ) \left(\begin{array}{c}x^{\prime} \\ y^{\prime} \\ w^{\prime}\end{array}\right)=\left(\begin{array}{llc}1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1\end{array}\right) \cdot\left(\begin{array}{l}x \\ y \\ 1\end{array}\right)=\left(\begin{array}{c}x+t_x \\ y+t_y \\ 1\end{array}\right) xyw=100010txty1xy1=x+txy+ty1

仿射变换

  • 仿射变换 = (先) 线性变换 + (再) 平移变换

    • 在二维仿射变换情况下,最后一行都是 0 0 1
  • ( x ′ y ′ ) = ( a b c d ) ⋅ ( x y ) + ( t x t y ) \left(\begin{array}{l}x^{\prime} \\ y^{\prime}\end{array}\right)=\left(\begin{array}{ll}a & b \\ c & d\end{array}\right) \cdot\left(\begin{array}{l}x \\ y\end{array}\right)+\left(\begin{array}{l}t_x \\ t_y\end{array}\right) (xy)=(acbd)(xy)+(txty)

等价于

  • ( x ′ y ′ 1 ) = ( a b t x c d t y 0 0 1 ) ⋅ ( x y 1 ) \left(\begin{array}{c}x^{\prime} \\ y^{\prime} \\ 1 \end{array}\right)=\left(\begin{array}{llc}a & b & t_x \\ c & d & t_y \\ 0 & 0 & 1\end{array}\right) \cdot\left(\begin{array}{l}x \\ y \\ 1\end{array}\right) xy1=ac0bd0txty1xy1

缩放

  • S ( s x , s y ) = ( s x 0 0 0 s y 0 0 0 1 ) S(s_x, s_y) = \left(\begin{array}{llc} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1\end{array}\right) S(sx,sy)=sx000sy0001

旋转

  • R ( α ) = ( cos ⁡ α − sin ⁡ α 0 sin ⁡ α cos ⁡ α 0 0 0 1 ) R(\alpha) = \left(\begin{array}{llc} \cos\alpha & -\sin\alpha & 0 \\ \sin\alpha & \cos\alpha & 0 \\ 0 & 0 & 1\end{array}\right) R(α)=cosαsinα0sinαcosα0001

平移

  • T ( t x , t y ) = ( 1 0 t x 0 1 t y 0 0 1 ) T(t_x, t_y) = \left(\begin{array}{llc} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1\end{array}\right) T(tx,ty)=100010txty1

组合变换

  • 平移、旋转、缩放变换可以组合起来

  • 变换的顺序很重要,不能调换(矩阵的乘法不满足交换律)

    • e.g. T ( 1 , 0 ) ⋅ R 45 ≠ R 45 ⋅ T ( 1 , 0 ) T_{(1,0)} \cdot R_{45} \neq R_{45} \cdot T_{(1,0)} T(1,0)R45=R45T(1,0)
  • 可以通过矩阵的乘法来实现组合变换,从右到左的操作

    • A n ( … A 2 ( A 1 ( x ) ) ) = A n ⋯ A 2 ⋅ A 1 ⋅ ( x y 1 ) A_n\left(\ldots A_2\left(A_1(\mathbf{x})\right)\right)=\mathbf{A}_n \cdots \mathbf{A}_2 \cdot \mathbf{A}_1 \cdot\left(\begin{array}{l}x \\ y \\ 1\end{array}\right) An(A2(A1(x)))=AnA2A1xy1
    • e.g. 先旋转 45度,再平移 (1, 0)
    • T ( 1 , 0 ) ⋅ R 45 [ x y 1 ] = [ 1 0 1 0 1 0 0 0 1 ] [ cos ⁡ 4 5 ∘ − sin ⁡ 4 5 ∘ 0 sin ⁡ 4 5 ∘ cos ⁡ 4 5 ∘ 0 0 0 1 ] [ x y 1 ] = [ cos ⁡ 4 5 ∘ − sin ⁡ 4 5 ∘ 1 sin ⁡ 4 5 ∘ cos ⁡ 4 5 ∘ 0 0 0 1 ] [ x y 1 ] T_{(1,0)} \cdot R_{45}\left[\begin{array}{c}x \\ y \\ 1\end{array}\right]=\left[\begin{array}{lll}1 & 0 & 1 \\ 0 & 1 & 0 \\ 0 & 0 & 1\end{array}\right]\left[\begin{array}{ccc}\cos 45^{\circ} & -\sin 45^{\circ} & 0 \\ \sin 45^{\circ} & \cos 45^{\circ} & 0 \\ 0 & 0 & 1\end{array}\right]\left[\begin{array}{l}x \\ y \\ 1\end{array}\right] = \left[\begin{array}{ccc}\cos 45^{\circ} & -\sin 45^{\circ} & 1 \\ \sin 45^{\circ} & \cos 45^{\circ} & 0 \\ 0 & 0 & 1\end{array}\right]\left[\begin{array}{l}x \\ y \\ 1\end{array}\right] T(1,0)R45xy1=100010101cos45sin450sin45cos450001xy1=cos45sin450sin45cos450101xy1
  • 矩阵有结合律 => 可以用 3x3 的矩阵表示很复杂的变换

  • 矩阵可以分解的好处:

    • 给定一个点,如何绕着它进行旋转???

    • 解决方法:

      • 把点从中心平移到原点位置
      • 旋转
      • 平移回来
    • 请添加图片描述

    • 矩阵的表示: T ( c ) × R ( α ) × T ( − c ) T(c)\times R(\alpha) \times T(-c) T(c)×R(α)×T(c)注意从右到左的变换顺序

逆变换

变回来,相当于乘以一个矩阵的逆矩阵

旋转

已知旋转 θ \theta θ 角为:

  • R θ = ( cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ) R_\theta=\left(\begin{array}{cc}\cos \theta & -\sin \theta \\ \sin \theta & \cos \theta\end{array}\right) Rθ=(cosθsinθsinθcosθ)

那么,旋转 − θ -\theta θ

  • R − θ = ( cos ⁡ θ sin ⁡ θ − sin ⁡ θ cos ⁡ θ ) = R θ T R_{-\theta}=\left(\begin{array}{cc}\cos \theta & \sin \theta \\ -\sin \theta & \cos \theta\end{array}\right)=R_\theta^{\mathrm{T}} Rθ=(cosθsinθsinθcosθ)=RθT(数值上相同)

而根据定义,旋转 − θ -\theta θ 角是旋转 θ \theta θ 角的逆变换:

  • R − θ = R θ − 1 R_{-\theta}=R_\theta^{\mathrm{-1}} Rθ=Rθ1

  • 正交矩阵:逆矩阵=转置矩阵

三维变换

  • 用齐次坐标表示:

    • 三维的点: ( x , y , z , 1 ) T \left(\mathbf{x}, \mathbf{y}, \mathbf{z}, \textcolor{red}{1}\right)^{\mathrm{T}} (x,y,z,1)T
    • 三维的向量: ( x , y , z , 0 ) T \left(\mathbf{x}, \mathbf{y}, \mathbf{z},\textcolor{red}{0}\right)^{\mathrm{T}} (x,y,z,0)T - 向量具有平移不变性
  • ( x , y , z , w ) (x, y, z, w) (x,y,z,w) w ≠ 0 w\neq 0 w=0 时表示一个三维空间中的点,即 ( x w , y w , z w ) (\frac{\mathrm{x}}{ \mathrm{w}}, \frac{\mathrm{y}}{\mathrm{w}}, \frac{\mathrm{z}}{\mathrm{w}}) (wx,wy,wz)

  • 4 × 4 4\times4 4×4的齐次坐标来表示仿射变换

    • ( x ′ y ′ z ′ 1 ) = ( a b c t x d e f t y g h i t z 0 0 0 1 ) ⋅ ( x y z 1 ) \left(\begin{array}{l}x^{\prime} \\ y^{\prime} \\ z^{\prime} \\ 1\end{array}\right)=\left(\begin{array}{llll}a & b & c & t_x \\ d & e & f & t_y \\ g & h & i & t_z \\ 0 & 0 & 0 & 1\end{array}\right) \cdot\left(\begin{array}{l}x \\ y \\ z \\ 1\end{array}\right) xyz1=adg0beh0cfi0txtytz1xyz1
    • 先应用线性变换,再加上平移

缩放

  • 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 ) S(s_x, s_y, s_z) =\left(\begin{array}{llll}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

平移

  • 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 ) T(t_x, t_y, t_z)=\left(\begin{array}{llll}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

旋转

齐次坐标

  • 绕着 x 轴, y轴, z轴旋转

  • 绕着 x 轴旋转 R x ( α ) = ( 1 0 0 0 0 cos ⁡ α − sin ⁡ α 0 0 sin ⁡ α cos ⁡ α 0 0 0 0 1 ) R_x(\alpha)=\left(\begin{array}{llll}1 & 0 & 0 & 0 \\ 0 & \cos\alpha & -\sin\alpha & 0 \\ 0 & \sin\alpha & \cos\alpha & 0 \\ 0 & 0 & 0 & 1\end{array}\right) Rx(α)=10000cosαsinα00sinαcosα00001

  • 绕着 y 轴旋转 R y ( α ) = ( cos ⁡ α 0 sin ⁡ α 0 0 1 0 0 − sin ⁡ α 0 cos ⁡ α 0 0 0 0 1 ) R_y(\alpha)=\left(\begin{array}{llll}\cos\alpha & 0 & \sin\alpha & 0 \\ 0 & 1 & 0 & 0 \\ -\sin\alpha & 0 & \cos\alpha & 0 \\ 0 & 0 & 0 & 1\end{array}\right) Ry(α)=cosα0sinα00100sinα0cosα00001

  • 绕着 z 轴旋转 R z ( α ) = ( cos ⁡ α − sin ⁡ α 0 0 sin ⁡ α cos ⁡ α 0 0 0 0 1 0 0 0 0 1 ) R_z(\alpha)=\left(\begin{array}{llll}\cos\alpha & -\sin\alpha & 0 & 0 \\ \sin\alpha & \cos\alpha & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1\end{array}\right) Rz(α)=cosαsinα00sinαcosα0000100001

欧拉角

  • 三维旋转

    • R x y z ( α , β , γ ) = R x ( α ) R y ( β ) R z ( γ ) \mathbf{R}_{x y z}(\alpha, \beta, \gamma)=\mathbf{R}_x(\alpha) \mathbf{R}_y(\beta) \mathbf{R}_z(\gamma) Rxyz(α,β,γ)=Rx(α)Ry(β)Rz(γ)
  • 请添加图片描述

    • roll
    • pitch
    • yaw
  • Rodirgues 旋转公式

    • 绕着旋转轴 n n n (默认是过原点的轴)旋转 α \alpha α 角都可以变成 绕着 x, y, z 旋转
    • 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
    • ( 0 − n z n y n z 0 − n x − n y n x 0 ) ⏟ N \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}} N 0nznynz0nxnynx0 表示叉乘
  • 四元数

观测变换(viewing)

view/camera transformation 视图变换

  • 从三维变成二维的图片

请添加图片描述

  • 定义一个相机:

    • 位置 e ⃗ \vec{e} e
    • 看的方向(look-at) g ^ \hat{g} g^
    • 向上的位置 t ^ \hat{t} t^ (假设是垂直于 look-at 的位置)
  • 因为物体和相机是相对的,假设相机的位置固定

    • 请添加图片描述

    • 相机永远在原点 ( 0 , 0 , 0 ) (0,0,0) (0,0,0),往 − Z -Z Z 方向看,向上是 Y Y Y

  • 如何进行视图变换?

    • 将相机的位置 e ⃗ \vec{e} e 平移到原点 ( 0 , 0 , 0 ) (0,0,0) (0,0,0)
    • g ^ \hat{g} g^ 转到 − Z -Z Z 方向
    • t ^ \hat{t} t^ 转到 Y Y Y 方向
    • g ^ × t ^ \hat{g}\times\hat{t} g^×t^ 转到 X X X 方向

projection transformation 投影变换

请添加图片描述

  • 正交投影 vs. 透视投影
    • 正交投影:不会造成近大远小的视觉差
    • 正交投影:认为相机是一个点
    • 透视投影:认为相机是无限远

Orthographic projection 正交投影

  • 如何把一个 [ l , r ] × [ b , t ] × [ f , n ] [\mathbf{l}, \mathrm{r}] \times[\mathrm{b}, \mathrm{t}] \times[\mathbf{f}, \mathbf{n}] [l,r]×[b,t]×[f,n] n > f n>f n>f)的物体变到相机坐标系中?

    • **相机固定在原点 ( 0 , 0 , 0 ) (0,0,0) (0,0,0),往 − Z -Z Z 方向看,向上是 Y Y Y
    • 把z轴丢掉,就都在一个平面上啦!
    • 再把 xy 平面的图归一化到 [ − 1 , 1 ] [-1,1] [1,1]
  • 沿着 − Z -Z Z 方向看

    • 离人近 Z Z Z 值大
    • 离人远 Z Z Z 值小
  • 正交投影变换矩阵:先平移到原点,再旋转变换(注意后一个式子中最后一列和平移矩阵最后一列的缩放关系)

    • M ortho  = [ 2 r − l 0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ] [ 1 0 0 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ] = [ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 2 n − f − n + f n − f 0 0 0 1 ] M_{\text {ortho }}=\left[\begin{array}{cccc}\frac{2}{r-l} & 0 & 0 & 0 \\ 0 & \frac{2}{t-b} & 0 & 0 \\ 0 & 0 & \frac{2}{n-f} & 0 \\ 0 & 0 & 0 & 1\end{array}\right]\left[\begin{array}{cccc}1 & 0 & 0 & -\frac{r+l}{2} \\ 0 & 1 & 0 & -\frac{t+b}{2} \\ 0 & 0 & 1 & -\frac{n+f}{2} \\ 0 & 0 & 0 & 1\end{array}\right] = \left[\begin{array}{cccc}\frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{2}{n-f} & -\frac{n+f}{n-f} \\ 0 & 0 & 0 & 1\end{array}\right] Mortho =rl20000tb20000nf2000011000010000102r+l2t+b2n+f1=rl20000tb20000nf20rlr+ltbt+bnfn+f1

perspective projection 透视投影

请添加图片描述

  • 怎么做?

    • 先把远平面挤压成和近平面一样大小( M persp  →  ortho  M_{\text {persp } \rightarrow \text { ortho }} Mpersp  ortho 
    • 再进行正交投影( M ortho  M_{\text {ortho }} Mortho 
  • 公式: M persp  = M ortho  M persp  →  ortho  M_{\text {persp }}=M_{\text {ortho }} M_{\text {persp } \rightarrow \text { ortho }} Mpersp =Mortho Mpersp  ortho 

    • M persp  →  ortho  = ( n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ) M_{\text {persp } \rightarrow \text { ortho }}=\left(\begin{array}{cccc}n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf \\ 0 & 0 & 1 & 0\end{array}\right) Mpersp  ortho =n0000n0000n+f100nf0

请添加图片描述

3 光栅化

  • 定义屏幕:一个数组

  • raster (德语)屏幕

  • 光栅化:把图画到平面上

  • 假设点是小方块,颜色是均匀分布的
    请添加图片描述

  • 用三角形来表示物体

  • 光栅化的优化

    • 考虑全部的点

    • 考虑轴向包围盒内的点(axis-aligned bounding box, AABB) 请添加图片描述

    • 每一行看最小到最大的点 请添加图片描述

  • 在绿色上有更多的感光元件(人眼对绿色更敏感)

锯齿问题

  • 又名:走样 aliasing
  • 信号的采样率不够
    请添加图片描述

请添加图片描述

  • 采样导致的问题:

    • 锯齿(空间中的采样)
    • 摩尔纹(空间中的采样,删除偶数行和偶数列)
    • 车轮倒转(时间中的采样)
  • 原因:

    • 信号变化太快
    • 采样太慢,跟不上变化的速度

抗锯齿

  • 又名:反走样 antialiasing

  • 如何减少走样误差:

    • 方法一:增加采样率
    • 方法二:先模糊(滤波)再采样( vs. blurred aliasing 先采样再模糊)
      • 请添加图片描述

      • 先模糊,再采样这种操作的解释:

        • 从傅立叶频谱上来看,原本因为采样慢而在频谱上重叠的块,因为模糊,而被裁剪掉了一部分,然后采样就不会重叠啦!!!
        • 请添加图片描述
      • MSAA(增加采样率)

      • FXAA

      • TAA(temporal AA)复用上一帧的信息

  • vs. 超分辨率
    - 低分辨率到高分辨率

滤波

  • 滤波

    • 删除某段频率后,对应的信号如何变化
  • 傅立叶变换

    • 把时域变成频域
  • 高通滤波(high-pass filter)

    • 只有高频信号可以通过,只剩下高频信息,丢掉低频信息

    • 请添加图片描述

    • 只剩下边界

  • 低通滤波(low-pass filter)

    • 只有低频信号可以通过,只剩下低频信息,丢掉高频信息

    • 请添加图片描述

    • 丢掉边界

  • 过滤掉最高频和最低频

    • 请添加图片描述

    • 频域上的分析

  • 滤波 (= 平均)= 卷积

    • 时域的卷积 = 频域的乘积
    • 选择1:
      • 时域上做卷积
    • 选择2:
      • 转换到频域(傅立叶变换)
      • 乘上卷积的傅立叶变换
      • 转换回时域(逆傅立叶变换)

深度测试 Z-buffer

  • 解决的问题:

    • 可见性 / 遮挡
  • 画家算法

    • 顺序:从远到近覆盖
    • 先画远的物体,再画近的物体覆盖住远处的东西
    • 需要按深度排序 O ( n log ⁡ n ) O(n\log n) O(nlogn) n n n个三角形)
    • 存在问题:
      • 不确定的覆盖关系,互相遮挡(形成环)
      • 请添加图片描述
  • Z-buffer

    • !!! 重要:假设离我们近的z更大,离我们远的z更小
    • 对每个像素,记录 min(z-value) 的深度
    • 需要两个buffer
      • frame buffer:存颜色
      • depth buffer:存深度
    • 时间复杂度: O ( n ) O(n) O(n)(n个三角形)
    • 一个问题:
      • 对于msaa来说,z-buffer不一定是对像素点,而是对采样点
  • 伪代码
    请添加图片描述

  • 处理不了透明物体的深度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

极市直播回放第106期丨阿里达摩院:兼顾速度与精度的高效目标检测框架DAMO-YOLO

阿里巴巴达摩院智能计算实验室团队设计并开源了一款兼顾速度与精度的目标检测框架DAMO-YOLO,其性能超越了目前的一众YOLO系列方法,在实现精度SOTA的同时,保持了很高的推理速度。DAMO-YOLO是在YOLO框架基础上引入了MAE-NAS、efficient-RepGFPN…

cas:1628790-40-8|脂溶性Cyanine7-COOH|CY7-Carboxylic Acid

cas:1628790-40-8|脂溶性Cyanine7-COOH|CY7-Carboxylic Acid 名称:脂溶性Cyanine7-COOH|CY7-Carboxylic Acid cas:1628790-40-8 英文同义词: Cy7;Colpro;Prothil;R-13615;Cy7-COOH;CY7ACID;Cy7NHS;AY-62022;Cy7,>97%;Sulfo-Cyanine7 中文名称:磺基-CY7羧酸 …

【小甲鱼C语言】课后笔记第一章第四节——数据类型

目录 1、数据类型 2、short 和 long 3. sizeof 运算符 4. signed 和 unsigned 5、课后习题(编程题) 1、数据类型 在 C 语言里,所谓的数据类型就是坑的大小。我们说变量就是在内存里边挖一个坑,然后给这个坑命名。那么数据类型…

U盘格式化后能恢复数据吗?U盘删除的数据还能恢复吗

U盘格式化后能恢复数据吗?通常情况下,我们U盘里的数据丢失后,它们并没有立即消失,它们只是被系统做了一个标记,将数据存储的位置标记成可写入的状态,只有当新数据写入的时候,这个存储位置才会被…

USB转UART的桥接控制器 国产DPU02能不能软硬件兼容替换CP2102?

DPU02是一个高度集成的USB转UART的桥接控制器,可将RS-232设计更新为USB设计,并简化PCB组件空间。 该DPU02包括了一个USB 2.0全速功能控制器、USB收发器、振荡器、EEPROM和带有完整调制解调控制信号的异步串行数据总线(UART)控制器…

自动驾驶车辆安全保证机制-Mobileye的RSS模型

自动驾驶汽车(AV)将如何与人类司机安全地共享道路? 成功实现自动驾驶未来的最大威胁之一是对自动驾驶汽车安全驾驶的含义缺乏共识。只有当行业、政府和公众有一个共同的方式来理解和评估自动驾驶汽车(AV)的驾驶技能和安全,他们才会被信任,可以安全地与人类驾驶的车辆一起…

Go1.19.3 数组与切片原理简析

数组 Go语言数组,声明有如下几种方式: var arr1 [10]intarr1[0] 10000var arr2 [10]int{0:0,2:2}var arr3 [...]int{1,2,3}其中arr1只是进行声明,数组在声明时,内存空间已经被开辟过,所以可以赋值。arr2是声明的同…

javafx 编写管理页面 增删改查

注册界面&#xff1a;用户通过输入页面信息&#xff0c;点击注册&#xff0c;将数据存入数据库中。 <Tab text"用户注册"> <content> <AnchorPane minHeight"0.0" minWidth"0.0" prefHeight"761.0" prefWidth"819…

Vue的四个常用选项

文章目录前言一、四大选项简介二、filters&#xff08;过滤器&#xff09;三、computed&#xff08;计算属性&#xff09;四、methods&#xff08;方法&#xff09;五、watch&#xff08;观察&#xff09;总结:前言 本文讲解了vue.js中的四个常用选项&#xff0c;4个参数选项&…

数据结构——归并排序

坚持看完&#xff0c;结尾有思维导图总结 这里写目录标题归并排序的思路归并算法的图解具体程序对性质的分析归并排序的非递归版本总结归并排序的思路 首先第一个问题是&#xff0c;什么是归并排序&#xff1f; 官方的说法: 归并排序&#xff08;MERGE-SORT&#xff09;是建立…

pikachu靶场-7 不安全的文件下载和上传

不安全的文件下载和上传 不安全的文件下载 文件下载&#xff08;unsafedownload&#xff09;漏洞概述 很多网站都会提供文件下载功能&#xff0c;即用户可以通过点击下载链接&#xff0c;下载到链接所对应的文件。 但是&#xff0c;如果文件下载功能设计不当&#xff0c;则…

基于51单片机的数字频率计设计

仿真原理图&#xff1a; 程序运行图&#xff1a; 部分程序&#xff1a; #define LED_GLOBAL 1 #include "led.h" /******************************************************************************************* *函数名称&#xff1a;delay_us(uint us) *函数…

15.JavaScript 02

文章目录一、DOM简单学习&#xff1a;为了满足案例要求1、DOM知识点简单学习2、事件简单学习3、案例1&#xff1a;电灯开关二、BOM1、概念2、组成3、Window&#xff1a;窗口对象1. Window窗口对象知识点2. 案例2&#xff1a;轮播图4、Location&#xff1a;地址栏对象1. Locatio…

手写Spring5(资源加载Spring.xml解析和注册Bean对象)

文章目录目标设计思路项目结构一、实现1、资源加载接口定义和实现获取ClassPath下的文件信息获取指定文件路径的方式读取文件信息获取HTTP的方式读取云服务的文件2、包装资源加载器定义和实现-策略模式的体现包装资源加载器实现3、Bean定义读取接口4、Bean定义抽象类实现5、解析…

[激光原理与应用-53]:《激光焊接质量实时监测系统研究》-4-激光焊接系统软件设计

目录 前言&#xff1a; 4.1 操作系统和开发平台 4.1.1 Windows2000 操作系统概述 4.1.2 虚拟仪器开发平台软件 LabWindows/CVI 4.2 总体软件设计 4.2.1 数据采集程序 4.2.2 软件实现的功能 4.2.2.1 主机软件的数据采集 4.2.2.2 主机软件的数据分析&#xff08;核心&am…

暗棕红色粉末ICG-COOH, ICG Carboxlaic acid,181934-09-8,ICG和PEG链接可在体内长循环

英文名&#xff1a;ICG-COOH ICG Carboxlaic acid CAS No:181934-09-8 外观&#xff1a;暗棕红色粉末 溶解度&#xff1a;在水或甲醇中溶解 纯度&#xff1a;90% 结构式&#xff1a; 西安凯新近红外荧光染料Near IRDyes激发和发射波长和颜色图 ICG NHS ester的NHS可以和蛋白…

八、闭包高级、对象、构造函数、实例化

闭包高级、对象、构造函数、实例化 闭包高级 函数被定义时生成[[scope]]->生成scope chain -> scope chain中存着上级的环境。 函数被执行的前一刻&#xff08;预编译过程&#xff09;&#xff0c;生成自己的AO&#xff0c;排到scope chain的最顶端。 函数执行完毕的…

基于天鹰算法优化的lssvm回归预测-附代码

基于天鹰算法优化的lssvm回归预测 - 附代码 文章目录基于天鹰算法优化的lssvm回归预测 - 附代码1.数据集2.lssvm模型3.基于天鹰算法优化的LSSVM4.测试结果5.Matlab代码摘要&#xff1a;为了提高最小二乘支持向量机&#xff08;lssvm&#xff09;的回归预测准确率&#xff0c;对…

DFA的最小化

一、实验目的 1&#xff0e;熟练掌握DFA与NFA的定义与有关概念。 2&#xff0e;理解并掌握确定的有穷自动机的最小化等算法。 二、实验要求 输入&#xff1a;DFA 输出&#xff1a;最小化的DFA 三、实验过程 1&#xff0e;化简DFA关键在于把它的状态集分成一些两两互不相交…

一、ArrayList源码解读

ArrayList源码 一、前言 ArrayList在日常的开发中使用频率非常高&#xff0c;但是JDK是如何去设计ArrayList的&#xff0c;这就需要我们好好去了解底层实现原理&#xff0c;这样使用起来才能做到心中有数&#xff1b;当然&#xff0c;还能应付面试。本篇文章会围绕ArrayList的…