Lec1 overview of Computer Graphic

判断游戏画面水平如何
可以去看画面的明暗.亮的,一般都是采用了全局光照技术.从技术层面来看更加优秀

特效是最简单的图形学技术应用
特效是特殊的效果.在平常生活中见得很少,即使特效出错,观众不一定看得出来.而对日常东西的渲染更为困难

Visualization
Virtual Reality
Digital Illustration数字图像处理
Simulation
Graphic User Interface
Typography矢量字体?

  • course topic
    • Rasterazation
    • Curves and Meshes
    • Ray Tracing
    • Animation / Simulation

CG与CV
一切需要理解,猜测的都是计算机视觉的内容.
no clear boundaries

Lec2 Review of Linear Algebra

A Swift and Brutal Introduction to Linear Algebra

Vectors

或者

dot product 点乘



for unit Vectors

符合

  1. 交换律
  2. 结合律
  3. 分配律

用矩阵表达的点乘计算更加简单直接
在二维

同理对于三维

主要是用来寻找投影

对于上的投影

,则

用处:
观察点乘结果判断

  1. 两个向量是否接近
  2. 两个向量的前后位置关系

cross product

方向上采用右手定则

没有交换律但符合分配律和结合律

是向量,不是单纯的

作用:
通过
叉乘结果判断

  1. 左和右
    if()
    then,左侧
    if()
    then,右侧
  2. 内和外
    利用左右判断
    if()
    then,p在内侧

在3D情况下寻找投影
类似于二维的情况




matrix

矩阵的乘法

不符合交换律但符合结合律和分配律
将向量vector视作列向量m*1的矩阵

矩阵的转置

单位矩阵
对于逆运算

将点乘与叉乘转换为矩阵乘法

Lec3 Transformation A

  • transformation
    • modeling
      1. rotation
      2. scaling
    • viewing
      1. projection

homogeneous coordinate 齐次坐标

为解决Translation问题,齐次坐标堂堂登场

  • 为什么 point用1补位 vector用0补位?
    对于向量来说,人类希望它由平移不变的性质.所以用0来保护它

    • 1的情况
    • 0的情况 确保了即使是利用矩阵乘法计算向量平移不变

或者换一个角度看

  • 某个点沿着向量平移


  • 对于点

  • 题外话:
    trade off是一个在工程学科中必然存在的策略.齐次坐标虽然需要更多的性能
    但能够将基础的变换统一起来

增加的储存数据只有最后一列的与最后一行的,而且在大部分情况下,只要储存一个1就够了.性能开销不大的情况下实现了相当好的效果

modeling

先线性变换再平移

线性变换

除了平移之外都是线性变换?

都可以用一个统一的矩阵来表示

scale


缩放矩阵,缩放系数为

reflection

sheer 拉伸


rotate


写出正确的旋转矩阵,只需要找到前后变化的点的相对位置关系


推导的值,可以由特殊到一般,
带入推导随便算
对于旋转来说

存在下列关系:

可以用转置简单求得

线性变换的齐次坐标表示

非线性变换

Translation 平移变换


平移不是一个线性变换
为了避免这样的情况
引入了齐次坐标来解决

在齐次坐标下平移的表示

affine transform仿射变换

仿射变换:线性变换再接上平移
对于这样的操作来说,无法简单的写成与上方统一的矩阵相乘的形式
只能写成

但通过齐次坐标
可以写成

composing transform 组合变换

矩阵乘法的顺序会影响结果
所以变换顺序的不同也会影响结果

默认情况下先做旋转再做平移
对于下式来说

先做旋转再做平移

对于一系列操作来说
可以先合成之前的矩阵,最终变成
能够表达无数多的复杂变换

非原点旋转


顺序是从左到右
先平移到原点,再旋转,最后再平移回去

inverse transform 逆变换

使用逆矩阵就可以完成逆变换

Lec4 Transformation B

How to get a photo?

  1. 摆pose modeling transformation
  2. 选相机位置 viewing transformation
  3. 按快门 projection transformation
    MVP!
    modeling viewing projection

三维下的模型变换


affine transform

平移仍然在最后一列

scale

reflection

Translation

sheer

Rotate

  • 沿着x轴旋转
  • 沿着y轴旋转
    是最特殊的一个,右上角是
    下见推算过程
  • 沿着z轴旋转

对于任意的3D旋转来说,可以分解为一个在3D直角坐标系中的

三个绕各个轴旋转的矩阵相乘
叫做欧拉角(Euler Angles)
战地中的开飞机也是这样

  • Rodrigues’ Rotation Formula
    rotation by angle around axis

这部分是叉乘的矩阵表达形式

viewing/camera 视图变换

基础:
相机的位置 人的位置
相机看向的方向 眼睛朝向
相机顶部向量 脑袋歪斜方向

在物理学的角度,可以将物体的移动看成,相机位置不动,其他物体相对运动.
于是把相机固定在标准位置,

相机位于原点,永远看向-z轴,顶部指向y轴正方向




让操作计简化

标准化流程

  1. 将后面几步旋转矩阵计算为同一个矩阵可得逆矩阵.由于矩阵计算困难,故使用逆矩阵

    第一行为(g x t) To X 结果
    第二行为t To Y的结果
    第三行为g To -Z的结果

projection 投影变换

  • orthographic projection 正交投影
  • perspective projection 透视投影

orthographic projection 正交投影


把z轴直接去掉,再进行平移与缩放到范围内,就可以得到正交投影的结果

工程上的做法

注意,

  • 左右的范围为[l,r],left<right
  • 上下的范围为[b,t],bottom<top
  • 前后的范围为[f,n],far<near.因为我们看向的方向是-z,例如f=-9,n=1.

变换矩阵为

前一个为了缩放立方体到范围
后一个为了平移立方体中点至原点

但现在并没有完全完成变换,因为缩放的过程中存在拉伸,还需要后续的视口变换来矫正
也存在精度上的问题.把大的立方体缩放到小立方体,会导致信息损失

perspective transformation 透视投影

  • 视锥如何定义?

    定义一个fov-Y(垂直可视角度),再定义一个aspect ratio(宽高比),就可以确定视锥的形状
    其他的数据都可以简单计算出来等等


将从视锥通过投影面截出来的截锥体挤压成cuboid,再进行正交投影,就可以得到透视投影
只要求得就行力


显而易见


仍然不清楚

得到

可推算得

而根据定义,近平面,z不变可知
带入

Misplaced &0&0&A&B \end{pmatrix} \begin{pmatrix} x \\ y \\ n \\ 1 \end{pmatrix}=n^{2}$$ 再由远平面点经过变换f不变,同理可得

\begin{pmatrix}
0&0&A&B
\end{pmatrix}
\begin{pmatrix}
x \ y \ f \ 1
\end{pmatrix}=f^{2}

\begin{align}A=n+f \ B=-nf\end{align}

M_{persp\rightarrow ortho}=\begin{pmatrix}
n&0&0&0 \ 0&n&0&0 \ 0&0&n+f&-nf \ 0&0&1&0
\end{pmatrix}

\begin{align}
M_{persp\rightarrow ortho}\begin{pmatrix}
x \ y \ \frac{n+f}{2} \ 1 \
\end{pmatrix}=\begin{pmatrix}
n&0&0&0 \ 0&n&0&0 \ 0&0&n+f&-nf \ 0&0&1&0
\end{pmatrix}
\begin{pmatrix}
x \ y \ \frac{n+f}{2} \ 1 \
\end{pmatrix}=\begin{pmatrix}
nx \ ny \ \frac{n^{2}+f^{2}}{2} \ \frac{n+f}{2}
\end{pmatrix}=\begin{pmatrix}
\frac{2n}{n+f}x \ \frac{2n}{n+f}y \ \frac{n^{2}+f^{2}}{n+f} \ 1
\end{pmatrix}
\end{align}

You can't use 'macro parameter character #' in math mode比较$\frac{n^{2}+f^{2}}{n+f}$与$\frac{n+f}{2}$得 $\frac{n^{2}+f^{2}}{n+f}\geq\frac{n+f}{2}$ 更靠近n面 # Lec5 Rasterazation Triangle - 屏幕是一个数组,数组的单个元素是颜色信息 - Raster\==screen in German - Pixel\==short for "picture for element" ## canonical(规范的) cube to screen - rules 1. 用(x,y)的形式表示 2. x,y为整数 3. 像素表示范围为(0,0)到(width-1,height-1) 4. 中心点在(x+0.5,y+0.5) 5. 因为单个像素占有1\*1空间,所以像素实际占据的屏幕空间为(0,0)~(width,height) ## view port 视口变换 将之前Transformation得到的$[-1,1]\times[-1,1]$的正方形变换到$[0,width]\times[0,height]$上,$z$先不管 viewport transform matrix

M_{viewport}=
\begin{pmatrix}
\frac{width}{2}&0&0&\frac{width}{2} \ 0&\frac{height}{2}&0&\frac{height }{2} \ 0&0&1&0 \ 0&0&0&1
\end{pmatrix}

You can't use 'macro parameter character #' in math mode左上$3\times3$负责缩放 第四列负责平移 和$z$有关的都不变 ## 显示原理 显示的图像,存在于显卡的memory中. 告诉显示器读取哪块内存就能展示 ### LCD liquid crystal display 用液晶光栅对光偏振进行改变 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018163000.png) ### LED light emitting diode 发光二极管 ### electronic ink ## triangle Mesh why triangle? - 最基础的多边形 - 能够用三角形表示其他的多边形 - 三角形的三个点确保了他们在同一个平面中 - 内部外部很容易区分,可以用向量的叉积进行判断 - 定义了三个点$v_{1},v_{2},v_{3}$ value属性的值,就可以判断三角形内部某个点.value ## 光栅化方法 ### 采样 对风景采样=拍照 对时间采样=video 将函数离散化的方法 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018164423.png) 采样算法示例 判断像素中心点是否在三角形中 ```python for (int x = 0; x < xmax; ++x) for (int y = 0; y < ymax; ++y) image[x][y] = inside(tri, x + 0.5, y + 0.5); # inside 函数的具体实现,依靠叉积判断点是否在三角形中 # 对于中心点在边上的情况,可以自行决断 ``` #### 加速方法 ##### bounding box 用bounding box包围核来减少判断 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018165428.png) ### 锯齿问题 信号走样 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018170237.png) # Lec6 Rasterazation anti-aliasing and z-buffer Sampling Artifacts (Errors / Mistakes / Inaccuracies) in Computer Graphics artifacts - Jaggies (Staircase Pattern) 锯齿 - Moiré Patterns in Imaging 摩尔纹 - Wagon Wheel Illusion (False Motion) 原因: Signals are changing too fast (high frequency),but sampled too slowly ## 滤波采样 对原有的信号模糊(滤波)再采样 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018193313.png) 为什么不能先采样再模糊? 按照下面的理论来看,先采样会有频域的重叠,即使进行模糊之后,频域还是会重叠,导致信号出现较大的差错 ## Fourier series 傅里叶级数是[采样定理](https://zh.wikipedia.org/wiki/%E9%87%87%E6%A0%B7%E5%AE%9A%E7%90%86 "采样定理")原始证明的核心 任何周期函数都可以用正弦函数和余弦函数构成的无穷级数来表示 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018201411.png) ## Fourier Transform 傅里叶变换的正变换与负变换 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018194811.png) 通过频率分析,发现,对于变化太快的函数来说,采样不能够很好地体现函数本身的性质 低级傅里叶级数采样 失真较小 高级傅里叶级数采样 失真较大 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018201844.png) 甚至会有对于完全不同的函数进行采样,结果相同 仅仅通过采样,无法区分两种函数区别 所以才会有aliasing ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018202031.png) ## sample出现aliasing的原因分析 ### 频域与时域 Filtering = Getting rid of certain frequency contents 从时域到频域 越靠外频率越高 怎么样的图像是高频? 画面变化大的地方,边界,经过傅里叶变换之后生成的就是高频信号. 同理,图像变化小的地方,经过傅里叶变换之后生成的就是低频信号. 亮度代表在某个频率下,信号的强度 横竖的两条亮线先不管 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018202550.png) 高通滤波的效果 仅让高频通过,再经过逆傅里叶变换,生成图像 发现生成的图像是有意义的,大体描述了图像内容的边界 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018202941.png) 低通滤波的效果 能看到大致的图像,但看不见细节与边界 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018203316.png) ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018203434.png) ### 卷积 filter=average=convolution ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018204758.png) 在时域上的卷积等于频域上的乘积 同时验证了,卷积=滤波,最左边的频域图像进行类似低通滤波效果的操作之后,变成了最右边的频域 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018205057.png) `时域上的乘积等于频域上的卷积` bigger box=lower frequency 用越大的box进行卷积,得到的图像越模糊,通过的频率越低 ### 从频域看采样的本质 Sampling = Repeating Frequency Contents 左边为函数的频域 右边为函数的时域 $f(c)$为频域冲击函数 $f(e)$为$f(c)$经过傅里叶变换之后生成的时域冲击函数 $f(a)\times f(c)=f(e)$ $f(b)\otimes f(d)=f(f)$ 频域上的乘积等于时域上的卷积 从$f(f)$可知,**采样在一直重复某个信号的频谱** ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018210154.png) 如果**时域采样越稀疏,频域上,频谱就越密集**,重叠在一起就会发生走样 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018211130.png) ## how can we reduce aliasing error 1. 提升采样率 拥有更高分辨率的显示器 2. antialiasing 先做模糊再做采样 即低通滤波,把高频去除再采样 这样即使稀疏采样也能够得到足够好的采样结果 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018212926.png) 在工程上,把图像模糊,即用低通滤波器,对图像进行卷积 filter之后像素内部的值就是卷积之后的结果 但计算原像素内部黑色占据的百分比不是一件简单的事情,所以我们有一项新技术:MSAA 超采样 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018213310.png) ### 超采样 运用于模糊操作这个过程 既然单独计算原像素内部黑色占据的百分比不是一件简单的事情,那我们就在单个像素中进行超采样,将一个完整的像素视为多个小像素的组合. 再次采样后的结果近似于直接计算黑色占比 从而实现更好的抗锯齿效果 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018213950.png) ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231018213932.png) - the cost of MSAA 增大了计算量 ### 其他反走样方法 - FXAA Fast Approximate AA 通过图像对比的方法,直接把锯齿换成没有锯齿 - TAA Temporal AA 通过学习上一帧的图像,在静态中效果不错 - Super Resolution /Super Sampling 把小图,低分辨率的图,拉大为高分辨率 DLSS(Deep Learning Super Sampling) # Lec7 shading 1 ## visibility / occlusion 由于z轴的存在,图像投射到2D上会有遮挡问题 ### painter's algorithm 由远及近,对图像进行光栅化 paint from back to front 但对于这种情况,画家算法无能为力 哪个三角形在前,哪个在后,很难排 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231020202012.png) ### z-buffering 既然,对于三角形排序存在困难,那不如直接对像素进行排序 Idea: - Store current min. z-value for each sample (pixel) - Needs an additional buffer for depth values - frame buffer stores color values - depth buffer (z-buffer) stores depth 用两个buffer储存数据.一个存生成图像,一个存深度数据 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231020202547.png) 在这里,z的值一直都是正的,且越小越近,越大越远 #### 算法 先认定所有的三角形中的所有像素都会被画出来 通过zbuffer中的值判断 如果该像素是最近的,就更新framebuffer与zbuffer中的值 并且与画三角形的顺序无关 ```c++ //Z-Buffer Algorithm //Initialize depth buffer to ∞ //During rasterization: for (each triangle T) for (each sample (x,y,z) in T) if (z < zbuffer[x,y]) // closest sample so far framebuffer[x,y] = rgb; // update color zbuffer[x,y] = z; // update depth else ; // do nothing, this sample is occluded ``` 在GPU加速的情况下,性能非常好 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231020203357.png) #### 复杂度分析 $O(n)$复杂度 #### 深度相同如何处理 没讲... #### 缺陷 处理不了透明物体 ## shading The process of applying a material to an object. 材质处理 shading is local 只看这个点的局部,不管光线的遮挡 不能实现阴影的生成 shading is different with shadow ### Blinn-Phong reflectance model 三种光线类型 - specular highlights - diffuse reflection - ambient lighting 几个输入数据 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231020210500.png) #### diffuse reflection 漫反射 ##### 光接受能力 $\hat{l}$与$\hat{n}$的夹角决定能量的接受能力 计算时仅仅考虑单位面积 $\cos\theta=\hat{l}\cdot\hat{n}$ ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231020210914.png) ##### 光衰减 把射出的光看作球壳,单位面积上的光强度为$I$ 则对于距离点光源距离为$1$与$r$的球壳来说

\begin{align*}
4\pi1^{2}I&=4\pi r^{2}I^\prime\
I^{\prime}&=\frac{1}{r^{2}}
\end{align*}

You can't use 'macro parameter character #' in math mode![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231020212758.png) - $k_{d}$漫反射系数 - $I/R^{2}$单位面积的能量 - $max(0,\hat{n}\cdot\hat{l})$能量吸收率,若$\hat{n}\cdot\hat{l}$为负数,则值为0 为什么与$v$没关系? 由于漫反射对于各个方向都一样,观察$v$在哪个位置没有区别,所以漫反射公式与$v$无关 ##### 漫反射公式 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231020221800.png) # Lec8 shading2 ## shading ### Blinn-Phong reflectance modeling 一个简化模型,与现实存在差距 #### Specular Term 高光 ##### 原理 it depends on the direction of your view 当观察角度$v$与镜面反射$R$足够接近的时候,才会观察到高光 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231021180148.png) ##### 高光公式 算法实现上, 判断$R$与$v$的接近程度$\Leftrightarrow$半程向量$\hat{h}$与法线向量$\hat{n}$的接近程度,这样就不需要计算镜面反射.半程向量实在是太好算 求$\hat{h}$只要用$\hat{l}+\hat{v}$,再归一化就行 $k_{s}$为镜面反射系数 为什么不考虑能量被吸收? blinn-phong把这点简化了. $max(0,\cos \alpha)$后面为什么会有一个指数? $\cos \alpha$本身存在变化太慢的问题,不能够很好地表达高光情况,指数$p$越大,值变化更快,高光区域更小 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231021181508.png) ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231021180417.png) #### ambient term 环境光照 ##### 定义 不依赖于任何东西 从任何一个角度看都一样,与$\hat{v}$无关 从实现效果来看就是进行最基础的颜色填充 This is approximate / fake! $La = ka Ia$ #### conclusion ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231021182440.png) ### shading frequencies 在着色的时候存在精度问题 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231021193346.png) - flat shading ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231021193455.png) - gouraud shading shading each pixel 在每个顶点上进行着色 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231021193720.png) - phong shading shade each pixel ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231021194326.png) ### 顶点法向量算法 将$v$对应的法向量$n_{v}$视作与$v$有关的面所对应的法向量的和,再进行归一化 简单平均与加权平均都可以

N_{v}={\frac{\sum_{i}N_{i}}{|\sum_{i}N_{i}|}}

You can't use 'macro parameter character #' in math mode![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231021195030.png) ### Barycentric interpolation重心插值算法 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231021195000.png) ## Graphic pipeline 实时渲染 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231023120129.png) ### shader 用来定义对某个像素进行如何操作 编辑了一个基础的根据lambertian shading模型的DiffuseShader ```GLSL uniform sampler2D myTexture;// program parameter uniform vec3 lightDir;// program parameter varying vec2 uv;// per fragment value (interp. by rasterizer) varying vec3 norm;// per fragment value (interp. by rasterizer) void diffuseShader() { vec3 kd; } kd = texture2d(myTexture, uv);// material color from texture kd *= clamp(dot(–lightDir, norm), 0.0, 1.0);// Lambertian shading model gl_FragColor = vec4(kd, 1.0);// output fragment color } ``` 可以在shadertoy.com上联系观看别人的shader ### GPU 并行度高,特别适合做图形学的运算 CPU并行计算能力差点意思 ## texture mapping 模型本身是3D的,而他们的纹理是2D的. 要做到模型上的三角形对应到纹理上的三角形是很有难度的. 我们默认已知 ### 纹理映射 默认$u,v$大小都在$(0,1)$ 模型上每个顶点都有一个对应的$(u,v)$坐标 且$(u,v)$坐标已知 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231021203614.png) ### 纹理的无缝衔接合成 一种方案:Wang tile 可以依靠源砖,来产生相对较好的纹理,拼贴出的结果不会有太明显的重复,且没有周期性 [wiki](https://zh.wikipedia.org/wiki/%E7%8E%8B%E6%B0%8F%E7%A0%96) # Lec9 shading3 ## Barycentric coordinates ### 定义 #### 坐标角度 在任意的坐标系中,在一个三角形所在的平面上,已知三角形的三个点$A,B,C$,任意点$(x,y)$都可以用$(\alpha ,\beta ,\gamma)$来表示,并且和为1

\begin{align}
&(x,y)=\alpha A+\beta Y+ \gamma C\
&\alpha + \beta +\gamma=1
\end{align}

You can't use 'macro parameter character #' in math mode注意: 1. 在三角形内部,要求$\alpha ,\beta ,\gamma \geq0$ 2. 由于$\alpha + \beta +\gamma=1$的特性,知道$\alpha \beta \gamma$中的任意两个就可以求得另外一个,未知数其实为2个 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231021215702.png) $A=(1,0,0)$ $B=(0,1,0)$ $C=(0,0,1)$ #### 几何角度 从面积的角度求重心坐标 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231021220147.png) 不用去记 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231024202058.png) ### using Barycentric coordinates #### Linearly interpolate values 对于任何一个点,已知其重心坐标$(\alpha,\beta,\gamma)$,可以计算出该点的属性值,例如颜色,亮度,向量等等

V=\alpha V_{a}+\beta V_{b}+\gamma V_{c}

You can't use 'macro parameter character #' in math mode可以在投影之前3D空间中的三角形做线性插值,经过投影之后不行 但可以通过逆变换,将二维的三角形变为三维的三角形,再做插值 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231024202443.png) #### Texture Mapping 在原来的纹理中,只有三角形顶点的坐标 而经过重心坐标的处理之后,texture中的每一个点$(u,v)$都可以用$\alpha A+\beta Y+ \gamma C$表示 只要在texture上对$(u,v)$进行查询,就可以知道该点对应的纹理的信息(颜色,亮度等等) 从而可以知道在经过光栅化之后的显示器上显示的效果 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231024204233.png) ## 问题 ### texture magnification #### small case 如果纹理太小了,将到较大的屏幕映射到较小的纹理上有问题. 大集合映射到小集合上,会出现大集合中的多个元素同时映射到小集合的同一个元素上. 从观感上来说,是纹理放大,用一张画去贴图整个墙面,把画放大之后再去贴 几种处理方式: - nearest - bilinear - bicubic 从效果上来看,bicubic最好,bilinear不错,差距主要在眼角的位置.但是bicubic性能开销大 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025190946.png ) ##### nearest 将pixel坐标映射到纹理坐标上,选择最近的纹理顶点 如图,选择$u11$ ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025202019.png) `疑问:既然前面介绍了重心坐标,可以计算texture上每一个点的属性,为什么还要用这种方法?` 和采用的纹理本身有关.这里使用的纹理是由是纹素组成 ##### 线性插值 bilinear interpolation linear interpolation 公式:

\begin{align}
lerp(x,v_{0},v_{1})&=v_{0}+x(v_{1}-v_{0})\
x&\in(0,1)
\end{align}

线

\begin{align}
u_{0}&=lerp(s,u_{00},u_{10})\
u_{1}&=lerp(s,u_{01},u_{11})\
\end{align}

线

f(x,y)=lerp(t,u_{0},u_{1})

You can't use 'macro parameter character #' in math mode这就是双线性插值,从步骤上看, 第一次插值:四个点插值为两个点 第二次插值:两个点插值为一个点 双线性对应的是$2^{2}$的指数$2$ ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025191959.png) ##### bicubic 性能开销太大,效果最好 ### big case texture太大,而screen太小 一个像素对应的texture范围过大,会造成走样. 从信号的角度看,单个像素对应的texel中,内容变换过快,信号变化频率高,而采样次数太少,从而产生了走样 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025203735.png) 传统方法处理最右边的情况效果就很差了 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025204219.png) 处理方式: - super-samping - #### super Sampling 例如单个像素中采样512次,通过提高采样频率避免走样 但是对性能消耗太高 #### range query 既然采样会出现走样的问题,那我就不采样了😡 对于一个像素包含大范围的texture的情况,进行range query 获取某一像素下对应的纹理区域颜色 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025210604.png) ##### mipmap ###### what is mipmap Allowing `(fast, approximate, square)` range queries 仅限于正方形,被操作对象为texture “Mip” comes from the Latin “multum in parvo", meaning a multitude in a small space 以原图为$n \times n$为例 在原图的基础上,削减像素数量,为原来的一半,最后图像$level=log_{2}n$.,例如当$n=128$时,最终图为$level 7$ 从性能开销上来看,储存仅仅为原来的$\frac{4}{3}$

1^{2}+2^{2}+ \ldots+(\frac{n}{2})^{2}+n^{2}=\frac{4}{3}n^{2}

You can't use 'macro parameter character #' in math modemipmap的生成是在range query之前完成 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025210710.png) 左边为屏幕像素,右边为纹理上的texel 如果要对点$(u,v)_{00}$进行mipmap计算 找到这个点周围距离为一个pixel的几个点,计算它们的textue坐标.再计算中心点与周围点的距离,用最大的$L$值画一个正方形,进行range query 查询的图像的$level=log_{2}L$. 一个像素对应的$L \times L$texel.既然已经对纹理进行过mipmap的操作,那就可以在对应level上查询到$L \times L$的范围内的颜色. 例如,当$L=4$的时候,$level=2$,只要查询$level_{2}$上$(u,v)$坐标对应的块的数据就行 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025212345.png) ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025212712.png) ###### trilinear interpolation 三线性插值 根据不同位置查询的层数的值进行渲染. 但也有这不理想的地方.因为mipmap生成的图是离散的,导致,查询的层数是离散的,两个相邻的像素点,一个查询1,一个查询2,可能结果图像会有一条缝隙,做不到查询1.8层. ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025214840.png) 优化方法: 三线性插值法 trilinear interpolation 查询相邻的两个level的mipmap,对D level进行一次bilinear interpolation,对D+1 level也进行一次bilinear interpolation.最后对双线性插值的结果进行线性插值. ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025215451.png) 效果非常漂亮 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025215814.png) 三线性插值在游戏中经常用到,可以自己开关试试效果 ###### overblur问题 mipmap本身还是存在问题,因为查询的是像素对应的texture范围上的颜色,所以会出现模糊 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025220358.png) pixel应该对应的范围是矩形,而mipmap算法用square对应,差错就会很大了 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025220808.png) ###### Anisotropic Filtering各向异性过滤 各向异性:各个方向上表现不同 这时候就需要我各向异性过滤来优化,效果很不错 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025220536.png) 沿着图像对角线为mipmap,横向为横向压缩图,纵向为纵向压缩图 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025220629.png) 游戏中,各项异性过滤有不同的层数,例如4层,16层等.但是实际上,改变各项异性层数对于性能开销不大. 层数代表在各个方向上运算的次数.2层表示各个方向上压缩两次, 开销为: 而4层, 开销为: 差距非常小 一旦开启各向异性,层数区别不大,并且,无限层的开销趋向于原来的三倍.显存够,开最高就行 可以根据ripmaps查询,比较好处理蓝色的矩形,但对于红色的斜矩形,效果还是差 可以用EWA方法进行优化 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231025221814.png) ## Applications of textures In modern GPUs, texture = memory + range query (filtering). 纹理就是一些内存,使用内存就是内存查询的过程. ### Environment Map 你能看到的任何东西都有光照信息 用纹理描述环境光照 将环境光照的texture贴到茶壶上. 光照最好有方向和距离两个定义,单单方向会有问题. ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231028153320.png) #### Spherical Environment Map 将环境光记录在球体上 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231028154304.png) 好处在于,方便查询,任意方向的光线,直接在球体上找对应的方向就行,但也有问题 像世界地图一样,上方和下方会有扭曲 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231028154421.png) #### Cube Map 用立方体描述环境光 好处在于图像展开没有变形 坏处在于,查询的时候,需要计算下方向才能查找到正确的点 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231028154724.png) ## Bump map 如何实现凹凸不平的表面效果? model可以是一个光滑的球体,而贴图采用凹凸贴图.凹凸贴图上记录一个相对高度信息,或者一个新的法向量,来实现凹凸的shading效果.从而欺骗眼睛. 用复杂的贴图代替复杂的模型 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231028155432.png) #### 凹凸贴图法向量计算 使用凹凸贴图后的表面 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231028161502.png) ##### 1D 贴图 flatland 求导求切线,再对切线变换,算出向量 注意要对向量进行归一化操作 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231028161613.png) ##### 2D 贴图 处理2D贴图,默认原来表面的向量为(0,0,1) 2D texture上有两个方向,$u,v$,对两个方向分别求导, 再取负数,可得到法向量 注意归一化 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231028161730.png) ## displacement mapping 会去真的移动几何结构,例如移动顶点 为了弥补bump map的缺点,在图像边缘,和由于本身高度变换带来的阴影显示效果不好 需要足够精细的模型 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231028163001.png) ## 3D纹理 定义一个三维的纹理,劈开之后还能看到内部的纹理 实际上并没有纹理,而是一个三维噪声函数,通过一系列的操作,可以得到图形 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231028163017.png) ## 记录信息 Provide Precomputed shading 先计算好环境光遮蔽,再存储到texture中. ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231028163441.png) ## 3D Textures and Volume Rendering 三维的纹理 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231028163518.png) # Lec10 Geometry1 Introduction to Geometry ## 隐式几何 implicit 做光线追踪方便 ### Algebraic Surfaces 通过对点进行分类,实现的隐式表达. 例如对于球体$x^{2}+y^{2}+z^{2}=1$,对点进行分类,分成符合该式子,与不符合.$(x,y,z)$这个点就是我定义的球体表面上的点. 便于判断某个点在不在面上,但不好列举哪些点在面上,从而不便推断出图像的样子 不好采样 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231104152011.png) ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231104152746.png) ### Constructive Solid Geometry (Implicit) CSG方式 对隐式表达进行布尔运算 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231104152830.png) ### signed distance function 表示能力非常强大 求空间中,各个点到边界的距离,并且是有方向的距离(signed). blend距离,就等于blend他们的边界 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231104153724.png) ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231104153920.png) ### level set 水平集描述 从用distance function生成的数据集中,使用插值的方法,找到$f(x)=0$的线,绘制出$f(x)=0$的表面 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231104160029.png) 医疗数据,组织密度渲染 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231104160215.png) 物理仿真 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231104160256.png) ### fractals 分形法 类似万花筒,细节非常到位,但控制它生成什么形状存在困难 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231104211023.png) ## 显式几何 explicit 直接定义或是参数定义 ### 直接 直接告诉三角形的各个坐标,来显式构造球体, ### 参数映射的方式 对于二维平面$(u,v)$上的各个点,通过一个函数$f$映射到三维空间中,实现显式构造 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231104151725.png) 采样非常方便,判断里外艰难 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231104152028.png) ### point cloud 一个$(x,y,z)$的列表就行,是最简单的方法, 绘制对采样的精度要求高.精度过低,效果不好, ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231104211155.png) ### polygon mesh 应用最为广泛的图形表达方式 对各种操作的支持度都不错. ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231104211316.png) ## .obj格式 v 储存点信息 vt储存纹理 vn储存法向量 f为v/vt/vn ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231104211711.png) # Lec11 Curves and Surfaces ## Bézier Curves 贝塞尔曲线 ### Bézier Curves 之 de Casteljau 算法 进行递归运算,一次减少一个点,最后一个点的轨迹就是该算法得到的贝塞尔曲线 使用的是显式几何,引入时间参数$t$,$t\in(0,1)$,来定义贝塞尔曲线 先找到在$t$时间,$b_{0},b_{1}$之间的点$b_{0}^{1}$, 同理得到$b_{1}^{1},b_{2}^{1}$ 再处理$t$时间$b_{0}^{1},b_{1}^{1},b_{2}^{1}$三点,得到$b_{0}^{2},b_{1}^{2}$ 最后同理得到$t$时间的$b_{0}^{3}$ ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231105142852.png) 从流程的图来看, a,b,c,d为控制点 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231105142930.png) ### 数学定义 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106195554.png) 总共有$n+1$个点 $b^{n}(t)$为表达最终生成点$b_{0}^{n}(t)$的$n$次多项式. $B_{j}^{n}(t)$是伯恩斯坦多项式

\begin{align}
b^{n}(t)&=b_{0}^{n}(t)=\sum^{n}{j=0}b{j}B_{j}^{n}(t)\
B_{i}^{n}(t)&=\ {\binom{n}{i}}t^{i}(1-t)^{n-i}
\end{align}

You can't use 'macro parameter character #' in math mode ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106195755.png) 对于四个控制点的贝塞尔曲线应用 ${\bf b}^{n}(t)={\bf b}_{0}\,(1-t)^{3}+{\bf b}_{1}\,3t(1-t)^{2}+{\bf b}_{2}\,3t^{2}(1-t)+{\bf b}_{3}\,t^{3}$ 伯恩斯坦方程具有对称性 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106200742.png) ### Properties of Bézier Curves 例子中是四个控制点$b_{0},b_{1},b_{2},b_{3}$的三维贝塞尔曲线 三维贝塞尔曲线,起点是$b_{0}$,终点是$b_{3}$ 在控制点的切线是$b^\prime(n)=3(b_{n+1}-b_{n})$,系数一定为3 对于仿射变换具有良好性质.控制点直接生成的贝塞尔曲线经过仿射变换,和仿射变换之后的控制点生成的贝塞尔曲线,一摸一样,但对于其他的变换不适用 具有凸包性质.生成的贝塞尔曲线一定在控制点形成的闭包之内. ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106200846.png) #### 什么是闭包 最外面的一个圈就是 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106201637.png) ### Piecewise Bézier Curves 分段贝塞尔曲线 对于这样的控制点,生成的贝塞尔曲线,难以控制,并且生成难度高 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106203913.png) 所以人们选择分段生成贝塞尔曲线 每段由四个控制点生成 衔接的地方不一定平滑 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106204004.png) 为了描述平滑的情况,提出了不同级别的continuity - $C^{0}$ continuity 几何上的连续 两段贝塞尔曲线都经过红点 前段结束点为后段起始点 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106204646.png) - $C^{1}$ continuity 公共点为左右两点的中点时 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106204658.png) ## 其他曲线 ### splines 样条 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106205407.png) 有与分段贝塞尔曲线类似的性质,并且更可控.但也更难计算 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106205427.png) ## surface 贝塞尔曲面 用$4\times4$的控制点,两个时间参数$(u,v)$生成 在时间$u$下,每组控制点生成一个新的点,共计四个新点 四个新点在时间$v$下生成新的点,贝塞尔曲面点 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106212501.png) ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106212512.png) ## mesh 三大主题 - subdivision 网格细分 - simplification 网格化简 - regularization 网格正规化,尽量接近正三角形,大小接近 # Lec12 geometry3 mesh ## subdivision ### loop subdivision loop与循环没关系,发明这个的人姓loop First, create more triangles(vertices) Second, tune their positions 先细分再调整位置 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106231652.png) - 对于新vertices ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106231749.png) - 对于旧vertices 根据原来点的度来选择权重 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106231839.png) ### catmull-clark subdivision 适用于四边形网格. 奇异点:degree != 4 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106234258.png) 每有一个非四边形,就会产生一个新的奇异点. 取非四边形的边的中点,再选择一个点与他们相连,破坏原有的非四边形,生成四边形,与一个新的奇异点 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106234308.png) 调整各个vertice的权重计算 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231106234533.png) ## mesh simplification ### edge collapse 边坍缩 使用二次度量误差算法Quadric Error Metrics 简单对原来的点求平均的简化算法不够好,提出了二次度量误差算法 二次:点到平面的距离的平方 要求新的位置到原来各个面的距离的平方和最小

\min(\sum_{i=1}^{n}distance^{2})

You can't use 'macro parameter character #' in math mode![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107000238.png) 二次度量误差的数据结构采用堆(优先队列),能够迅速查询最小值,也能够快速更新 先对最小值的边进行坍缩,更新堆,再对最小值的边进行坍缩.贪心算法 局部最优!=全局最优,但在绝大部分情况下,这样的贪心算法效果很好 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107000859.png) ## shadow mapping 只能处理点光源,只能生成硬阴影(边界没有颜色过度,非常锐利) 点光源没有大小,只是一个点 原图 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107134703.png) 1. 记录从点光源方向看去的深度图 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107134720.png) 2. 从相机或人眼看过去的点的深度 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107134645.png) 3. 比较1,2的深度,来判断是否生成shadow mapping ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107134621.png) 浮点数本身的比较存在困难.判断浮点数是否相等,被精度问题困扰,比较难. method: - 判断 from eye's 大于 from light's,就生成shadow mapping - 引入bias,若from eye's大于 from light's + bias,就生成shadow mapping #### problem with shadow mapping - Hard shadows (point lights only) - Quality depends on shadow map resolution(general problem with image-based techniques) 不同的分辨率最后的阴影结果不同 - Involves equality comparison of floating point depth values means issues of scale, bias, tolerance # Lec13 ray tracing 1 光线追踪是另一种成像方式. 主要是为了解决rasterization上的 不足: - soft shadow - 光的二次,多次反射 - 间接光照 - glossy reflection - 质量低 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107152740.png) - Ray tracing is `accurate`, but is very `slow` - Rasterization: `real-time`(每秒至少30frame), ray tracing: `offline` ## Basic Ray-Tracing Algorithm 三条定义 - 光以直线传播,忽略波动性 - 与其他光线碰撞不会发生交互 - 光线从光源到眼睛(工程上的实现与这个恰好相反,光路可逆性的应用) ### ray casting算法 仅仅考虑了光的一次发射,没有考虑多次反射的光线 4. 从每个像素发出光线 5. 判断物体与光线的交点,与光源的连线是否有遮挡,判断阴影情况 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107154727.png) - Pinhole Camera Model 根据与光源的相对情况给进行着色 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107154938.png) ### Recursive (Whitted-Style) Ray Tracing 对光线进行多次递归运算,再进行shading. 光线名称做出分类: - primary ray - secondary ray - shadow ray ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107161111.png) 效果也不错 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107161222.png) ### Ray-Surface Intersection (交点) 光线由三个参数来定义. t为时间 o为原点 d为单位方向向量 光线被定义为射线,只有一个方向

r(t)=o+td,0\leq t <\infty

You can't use 'macro parameter character #' in math mode![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107164323.png) #### Ray Intersection With Sphere 简单的数学运算 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107164606.png) #### Ray Intersection With Implicit Surface 计算可以用各种方法实现: - 利用包,数学运算库 - 利用试点,优化法 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107164626.png) #### Ray Intersection With Triangle Mesh (最常见的显式表面) 对于给定的mesh与光线,遍历全部三角形求交点.忽略完全平行的请况. 简单但是效率低下 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107165012.png) inside与outside判断: 给定一个封闭图形(2D,3D都行),判断一个点是否再图形内部中,从该点射出一条射线, if(交点数量为奇数) 在图形内部 else if(交点数量为偶数) 在图形外部 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107165420.png) ##### 平面计算化简法 先算平面与光线的交点,再算交点是否在三角形内 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107170452.png) 平面的定义: 一个平面法向量$N$与平面上的一个点$P^{\prime}$ 平面是点的集合,根据式子

p:(p-p^{\prime})\cdot{N}=0

You can't use 'macro parameter character #' in math mode来定义平面 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107170513.png) 对于平面上的这个点,它既在面上,又在射线上 联立方程可解 最后要检查,要求$0 \leq t < \infty$ ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107170724.png) ##### Möller Trumbore Algorithm 直接求交 用上克拉默法则 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107171427.png) #### Accelerating Ray-Surface Intersection 每一个像素发出一条射线,每条射线要与每个objects计算,效果非常差 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107172144.png) ##### Bounding Volumes 包围盒 将需要计算交点的物体,用包围盒包起来.包围盒一般都是比较简单的物体.长方形,长方体等等 长方体包围盒由三对相对的面来定义 AABB 包围盒,要求与每个面直角坐标系的某个平面平行, ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107172649.png) AABB好处在于,计算时间$t$非常简单 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107174301.png) bounding box本身是由几对面求∩表达 光线在bounding box内的时间也是如此 先对各对面,求光线进入时间$t_{min}$,出去时间$t_{max}$. 再求交集,就是对 所有的$t_{min}$求最大值 $max(t_{min})$ 所有的$t_{max}$求最小值 $min(t_{max})$ 暂时不考虑$t_{min}<0$的处理 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107174346.png)

\begin{align}
t_{enter}=max(t_{min})\
t_{exit}=min(t_{min})
\end{align}

You can't use 'macro parameter character #' in math mode iff意为当且仅当 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107175015.png) ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107175244.png) # Lec14 ray tracing 2 Acceleration & Radiometry 传统的ray tracing算法开销太大,要进行加速优化 Using AABBs to accelerate ray tracing ## Uniform grids 在分布均匀的图像中表现较好 不均匀的图像中,表现差 形成规则网格,来加速 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107215715.png) 对每个小格子进行相交判断. if(与盒子相交) 计算与物体相交情况 else 跳过 通过盒子不一定与物体有交点 不通过盒子与物体一定没有交点 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107215746.png) 但盒子的分辨率会导致加速效果. 盒子太少,每个盒子都要计算与物体相交情况 盒子太多,要对每个盒子计算是否相交 最好的盒子数量约为 物体数量的27倍 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107220431.png) ### Spatial Partitions 空间划分 - oct-tree 八叉树 在d维度下为n叉树,$n=2^{d}$. 该特性导致n叉树实际效果不太好,尤其是在高维的情况下.划分难度高,性能要求高 - kd-tree 总体来说最好的空间划分方式.运用二叉树与AABB的思想.每次划分一刀,每刀方向不同,但与轴align.例如在二维平面中,先横切,再对每个部分竖切. - BSP-tree ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107220607.png) #### kd-tree ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107221156.png) 内部节点与叶子节点的数据结构 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107221238.png) 类似于二分查找,对每一个叶子节点求是否相交 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107223017.png) 但kd-tree本身也有一些缺陷 - 某个物体可能被多个AABB划分,导致每个AABB对应的叶子节点中都要储存这个物体的信息 - 给出一个包围盒很难判定它和哪些三角形有交集,也是这个原因最近10年渐渐不用KD树的方法了 为解决,引入Object Partitions 物体划分 Bounding Volume Hierarchy (BVH) ## Object Partitions & Bounding Volume Hierarchy (BVH) 将原有的图形分为好几部分,每一个几何结构只有可能在一个包围盒中出现,即只储存在一个叶子节点中 但也会导致,划分不是严格的划分,bounding box 之间会有相交.质量越好的划分,bounding box 之间的重叠越小 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107224425.png) ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107224825.png) #### 具体划分方法 - Choose a dimension to split 类似kd-tree,横竖横竖地顺序划分 - Heuristic #1: Always choose the longest axis in node 对于长方形的图像,垂直于长,进行划分 - Heuristic #2: Split node at location of median object 尽量从中间的三角形划分,保证划分之后,两个新的叶子节点,所包含的三角形的数量接近,实现平衡二叉树的样子 #### 数据结构 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107225905.png) ##### 伪代码 ```c++ Intersect(Ray ray, BVH node) { if (ray misses node.bbox) return; //光线和整个BVH节点不相交,什么也不发生 if (node is a leaf node) //如果光线与BVH的叶子节点相交 test intersection with all objs; //和节点内所有物体都求交 return closest intersection; //返回最近的交点 hit1 = Intersect(ray, node.child1); //如果相交的不是叶子节点,那光线与两个子节点都可能相交 hit2 = Intersect(ray, node.child2); //分别与两个子节点求交 return the closer of hit1, hit2; //返回最近的交点 } ``` ## Basic radiometry (辐射度量学) 鉴于whitted-style模型是一个简化过之后的光线追踪模型,与实际上的情况有着一定的区别. 辐射度量学就是为了做出更加贴近于现实的光线追踪. New terms: Radiant flux, intensity, irradiance, radiance 从物理的角度正确表示光线 ### Radiant flux Radiant Energy为能量,单位为$Q$,焦耳 Radiant flux(power)为单位时间内的能量,$\phi=\frac{dQ}{dt}$,单位为$W$,或者$lm$,流明 其实就是功率 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107234309.png) ### Radiant Intensity 光源发出的每单位角的光的功率 $I(\omega)=\frac{d\Phi}{d\omega}\;\;\;\;[\frac{W}{s r}][\frac{l m}{s r}=c d=c a n d e l a]$ ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107234554.png) what is solid angle? 在二维空间中,用弧长与半径的比值来定义角 在三维空间中,用面积与半径的平方来定义立体角 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107234623.png) 单位立体角 由高等数学计算得出,球体上单位面积对应的单位立体角为$\mathrm{d}\omega=\frac{\mathrm{d}A}{r^{2}}=\sin\theta\,\mathrm{d}\theta\,\mathrm{d}\phi$ ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107234851.png) 用$\omega$来表示单位向量 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107235546.png) 对于一个向四面八方发射光线的点光源,光照强度相同,且由积分可算得 $I=\frac{\phi}{4\pi}$ ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231107235724.png) # Lec15 ray tracing 3 ## irradiance 在单位面积上的功率 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231112142552.png) ## radiance per unit solid angle,per projected unit area 某个面向某个方向辐射能量 要确定面与方向 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231115154345.png) - Radiance: Irradiance per solid angle - Radiance: Intensity per projected unit area ### Irradiance vs. Radiance 对各个方向的radiance求积分,可以得到irradiance ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231115155224.png) ## DRBF Bidirectional Reflectance Distribution Function 描述一个unit area 接受的某个方向上的radiance,经过反射后,会向某方向反射的radiance大小. ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231115162330.png) BRDF 描述每一个入射光与每一个出射光的关系 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231115162840.png) The Reflection Equation 对于确定的出射方向,计算各个入射方向的积分. 入射的光线除了点光源,还会有一次反射,二次反射等等之后产生的光线. ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231115162956.png) ### rendering equation 除了上方的渲染方程之外,还增加了,观测点本身发光的情况下发出的光源. 求积分,只对上半球体求,下半球体默认为0 $(n \cdot w_{i})$就是$\cos \theta_{i}$ ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231121131456.png) #### 单个点光源 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122115851.png) #### 多个点光源 sum函数求和 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122115920.png) #### 面光源 integral求积分 面光源是点光源的大集合 对面光源所在的立体角进行积分 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122115948.png) #### 其他物体反射光源 光源不一定来自直接光源,也有可能来自其他的物体反射出来的光源 计算物体反射光线对应的立体角 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122120343.png) ### 式子化简 对式子进行数学化简 $(x,w_{r})=u$ $(x^{\prime},-w_{i})=v$ 最后化简为只与L,E,K有关的式子 E为自发光,L为光线,K为由BRDF得到的转换矩阵,将入射光线L转换为出射光线 L, E are vectors, K is the light transport matrix ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122120558.png) ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122120614.png) ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122120829.png) 矩阵也有类似于泰勒展开的性质,对于$(I-K)^{-1}$可以展开为$(I+K+K^{2}+K^{3}+...)$,$I$为单位矩阵. ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122130435.png) $E$ 为自发光 $KE$ 为直接光照 $K^{2}E$ 为间接光照 全局光照=直接光照+间接光照 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122130647.png) 本质就是解方程,计算出变换矩阵$E$和由BFDR定义的$K$就能解出最终$L$的结果 普通的rasterization只对自发光和直接光照处理,虽然也可以处理间接光照,但有难度. ## 概率论复习 # Lec16 ray tracing 4 ## 黎曼积分 对于$f(x)$求积分,黎曼积分方法是,先将积分域内,划分为数量众多的等宽的长方形,对每个长方形求面积,再对面积求sum,最终得到的结果近似积分结果 **微元法** ## Monte Carlo Integration 对于不定积分,最终的计算结果是一个函数$f(x)$ 而对于定积分,最终的计算结果是一个值 传统的方法是,先求积分之后的函数,再带入积分域的上下限,从而求得定积分的值. 但对于某些函数来说,对他求积分函数是相当困难的.既然最终结果为值,那就可以绕过函数求解,直接对结果进行近似. 对于积分域,进行采样操作,对每次采样的结果求面积,再求出定积分.再对多次采样的定积分的值,进行平均. **采样法** ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122144311.png) 积分通式: ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122144612.png) $p(x)$为采样对应的概率密度函数PDF 采样越多,误差越小 在哪个轴上采样,就在哪个轴上积分 ## Whitted-Style Ray Tracing 的问题 Whitted-Style Ray Tracing 模型本身存在局限 对于光线的反射只有两种结果 6. 完全的镜面反射 7. 光线完全漫反射,并不对漫反射的之后的光线进行处理 对于处理glossy材质的反射效果较差. ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122145220.png) ## Monte Carlo Solution ### 只考虑直接光照 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122163223.png) 最简单的对于半球所有方向平均采样的Monte Carlo 积分 $pdf=\frac{1}{2 \pi}$ ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122163236.png) ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122163412.png) 伪代码: ```c shade(p, wo) Randomly choose N directions wi~pdf Lo = 0.0 For each wi Trace a ray r(p, wi) If ray r hit the light Lo += (1 / N) * L_i * f_r * cosine / pdf(wi) Return Lo ``` ### 分布式光线追踪 处理直接光照+间接光照 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122163708.png) 伪代码 ```c shade(p, wo) Randomly choose N directions wi~pdf Lo = 0.0 For each wi Trace a ray r(p, wi) If ray r hit the light Lo += (1 / N) * L_i * f_r * cosine / pdf(wi) Else If ray r hit an object at q Lo += (1 / N) * shade(q, -wi) * f_r * cosine / pdf(wi) Return Lo ``` 进行else判断,对没有找到直接光照的点,寻找间接光照 但这样的算法还是有问题 由于要进行采样,每个角度随机发散出光线,每次间接光照的情况都会导致采样指数增长 $n\neq 1$ 这就叫做分布式光线追踪 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122164828.png) ## 路径追踪 仍然是工业界最常用的 处理直接光照+间接光照,但与分布式光线追踪不同 only 1 ray is traced at each shading point ```c shade(p, wo) Randomly choose ONE direction wi~pdf(w) Trace a ray r(p, wi) If ray r hit the light Return L_i * f_r * cosine / pdf(wi) Else If ray r hit an object at q Return shade(q, -wi) * f_r * cosine / pdf(wi) ``` This is path tracing! 但由于光线数量过少,导致结果失真 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122165212.png) 光线生成 ```c ray_generation(camPos, pixel) Uniformly choose N sample positions within the pixel pixel_radiance = 0.0 For each sample in the pixel Shoot a ray r(camPos, cam_to_sample) If ray r hit the scene at p pixel_radiance += 1 / N * shade(p, sample_to_cam) Return pixel_radiance ``` 路径追踪代码: ```c shade(p, wo) Randomly choose ONE direction wi~pdf(w) Trace a ray r(p, wi) If ray r hit the light Return L_i * f_r * cosine / pdf(wi) Else If ray r hit an object at q Return shade(q, -wi) * f_r * cosine / pdf(wi) ``` 解决了运算指数爆炸的问题,但还存在问题 `The recursive algorithm will never stop!` 但简单地限制光线弹射的次数(即限制递归的次数)是不够令人满意的 这必然会造成某些多次反射的光线没有被计算,被舍弃,能量不守恒了🤔🤔🤔 ### Russian Roulette (RR). 设定一个值P With probability 0 < P < 1, shoot a ray and return the shading result divided by P: `Lo / P` With probability 1 - P, don’t shoot a ray and you’ll get `0` 通过概率判定是否要继续path tracing 期望得到的能量与实际上的能量相等 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122192511.png) ```c shade(p, wo) Manually specify a probability P_RR Randomly select ksi in a uniform dist. in [0, 1] If (ksi > P_RR) return 0.0; Randomly choose ONE direction wi~pdf(w) Trace a ray r(p, wi) If ray r hit the light Return L_i * f_r * cosine / pdf(wi) / P_RR Else If ray r hit an object at q Return shade(q, -wi) * f_r * cosine / pdf(wi) / P_RR ``` 递归以概率的方式停下来 ### 算法优化 sampling the light 联系之前,信号与采样的关系可以得出 光源越小,光源周围的信号变化越大,对采样要求越高. 这样对投射出去的光线的浪费也越多 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122193745.png) 但如果能在光源上采样,就不会浪费性能了. 但也带来一个新问题,Monte Carlo methods要求必须,在哪里采样就在哪里积分.对光源面采样,就一定要在光源面上积分,原来对于半球体的积分函数就要转换 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122194021.png) 两个积分函数之间的积分域相互联系起来. ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122194758.png) ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122194809.png) 对于直接光源部分,采用优化算法,不需要RR 对于间接光源部分,采用原来算法 ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122194947.png) ```c shade(p, wo) # Contribution from the light source. Uniformly sample the light at x’ (pdf_light = 1 / A) L_dir = L_i * f_r * cos θ * cos θ’ / |x’ - p|^2 / pdf_light # Contribution from other reflectors. L_indir = 0.0 Test Russian Roulette with probability P_RR Uniformly sample the hemisphere toward wi (pdf_hemi = 1 / 2pi) Trace a ray r(p, wi) If ray r hit a non-emitting object at q L_indir = shade(q, -wi) * f_r * cos θ / pdf_hemi / P_RR Return L_dir + L_indir ``` 最后一个小问题,可能会有物体阻挡在光源与观察点之间 需要增加一个小判断 ```c # Contribution from the light source. L_dir = 0.0 Uniformly sample the light at x’ (pdf_light = 1 / A) Shoot a ray from p to x’ If the ray is not blocked in the middle L_dir = … ``` ## misc ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122194947.png) ![](https://minio.l4rk.link/picture-bucket/Pasted%20image%2020231122201435.png) # Lec17 Materials and appearances Material == BRDF ## Diffuse / Lambertian Material 漫反射材质 假设: 没有自发光 每一条入射光的漫反射都是均匀分布 同时入射光本身也均匀分布 那么某着色点的出射光就等于该点所有入射光在小范围内的积分,再乘上BRDF($f_{r}$). ![](https://minio.l4rk.link/picture-bucket/20231129003051.png) 由式子可得, $f=\frac{1}{\pi}$ 设$\rho$为albedo,即颜色反射系数,$\rho \in [0,1]$. 那么完整的$f_{r}=\frac{1}{\pi}$ $\rho$可以是多通道,针对三原色,也可以针对某种原色 ## Glossy material 不完全镜面反射,表面还是存在凹凸 ![](https://minio.l4rk.link/picture-bucket/20231129004828.png) ## Ideal reflective material 即为Perfect Specular Reflection ![](https://minio.l4rk.link/picture-bucket/20231129005006.png) 三维空间中的光线需要两个角度来定义. 侧为$\theta$,俯视为$\phi$ $\theta$平行四边形法 $\phi$俯视角投影 难点在于求这样条件下的BRDF值为多少,感兴趣可以自己推导 ![](https://minio.l4rk.link/picture-bucket/20231129182929.png) ## Specular refraction 折射 ![](https://minio.l4rk.link/picture-bucket/20231129182947.png) 右下角的海水也是由光的折射导致的. 由于海水本身的起伏,多道折射光可能射到同一点上,就出现了高光 这种现象叫做caustics,国内翻译作焦散.其实并没有没有散射,翻译不好. 一样也是用$\theta$,$\phi$定义 $n_{i}$,$n_{t}$是折射系数 $\frac{n_{i}}{n_{t}} \gt 1$ ![](https://minio.l4rk.link/picture-bucket/20231129183627.png) ![](https://minio.l4rk.link/picture-bucket/20231129184001.png) 仍然存在$\cos \theta_{t}$无意义的情况. 光线在这个折射角无法折射. ![](https://minio.l4rk.link/picture-bucket/20231129184325.png) 人在水下的fov-y仅有$97.2^{\circ}$ ## Fresnel Reflection/Term 不同的入射角,会有不同强度的反射 ![](https://minio.l4rk.link/picture-bucket/20231129223310.png) 引出概念Fresnel Term 对于绝缘且$n=1.5$的material来说, 法线夹角与反射率的关系如下, ![](https://minio.l4rk.link/picture-bucket/20231129223451.png) 而对于导体 导体不论任何角度,反射率都极其优秀,镜子都是玻璃再镀银. ![](https://minio.l4rk.link/picture-bucket/20231129223806.png) S,P极化为光的波动性的体现 一般就取极化平均值 反射率的精准计算: ![](https://minio.l4rk.link/picture-bucket/20231129223933.png) 工程上采用的比较多的是近似方法 Schlick’s approximation 确保 $R_{0}=R_{eff}$ $R_{90}\approx R_{eff}$ ## Microfacet material 神中神,大火都在用的顶级模型.基于物理,模拟光线效果好 Macroscale是从远处看过来的情况,强调是模型材质,忽略细节,视作`平整粗糙`的一整块, Microscale,重视表面的`凹凸细节`,且全部都是`镜面反射`.采用微元法,把每个微元都看作有自己法线的小镜面 ![](https://minio.l4rk.link/picture-bucket/20231129230600.png) 由microfacet的原理来定义材质. - glossy是小镜面法线集中 - diffuse是小镜面的法线分散 ![](https://minio.l4rk.link/picture-bucket/20231129231216.png) 从数学上计算Microfacet BRDF ![](https://minio.l4rk.link/picture-bucket/20231129231309.png) $F(i,)h$定义整体折射率 $G(i,o,h)$定义自身阴影遮挡.当光线几乎平行于平面的时候,遮挡产生阴影. $D(h)$定义小镜面总体法线的分布情况,判定漫反射 分母项为推导过程中产生的残留 ## Isotropic / Anisotropic Materials (BRDFs) 各向同性与各向异性材质 - 物理定义 由表面的方向性决定. ![](https://minio.l4rk.link/picture-bucket/20231129232559.png) - BRDF定义 对入射出射角,转动方位角,如果BRDF不变,为各向共同性 否则为各向异性 各向异性的结果就是一些奇奇怪怪的高光 isotropic只与方位角之差绝对值有关 Anisotropic要求具体的的方位角,即使保持方位角不变的旋转也不行 ![](https://minio.l4rk.link/picture-bucket/20231129232724.png) 尼龙是一种接近各向同性的各向异性材质,因为它的表面分布比较有规律 ![](https://minio.l4rk.link/picture-bucket/20231129233311.png) 而Velvet天鹅绒的各向同性与各向异性是可以人为改变的. 捋顺冬天的毛毯,就是各向异性 反之就是各向同性 ![](https://minio.l4rk.link/picture-bucket/20231129233358.png) ## Properties of BRDFs - 非负 - 线性 ![](https://minio.l4rk.link/picture-bucket/20231129234057.png) - 可逆性 - 能量守恒 ![](https://minio.l4rk.link/picture-bucket/20231129234135.png) - 对于isotropic材质,可以进行化简,参数可以变为三个. ![](https://minio.l4rk.link/picture-bucket/20231129234157.png) ## Measuring BRDFs 计算化简之后的BRDF与现实之间还是存在差距. ![](https://minio.l4rk.link/picture-bucket/20231130000222.png) 使用机械测量 ![](https://minio.l4rk.link/picture-bucket/20231130000238.png) 鉴于BRDF有$\theta_{i},\theta_{o},\phi_{i},\phi_{o}$四大参数,测量是一个非常复杂繁琐的过程.4D的数据集保存也很困难 测量流程与优化方法: ![](https://minio.l4rk.link/picture-bucket/20231130000804.png) 各种测量方法: ![](https://minio.l4rk.link/picture-bucket/20231130000834.png) 存储要求: ![](https://minio.l4rk.link/picture-bucket/20231130000951.png) # Lec18 Advanced Topics in Rendering Advanced Light Transport - Unbiased light transport methods - Bidirectional path tracing (BDPT) - Metropolis light transport (MLT) - Biased light transport methods - Photon mapping - Vertex connection and merging (VCM) - Instant radiosity (VPL / many light methods) 有偏与无偏是统计学上的概念 ![](https://minio.l4rk.link/picture-bucket/2023/12/05/20231205143648.png) 能收敛到的为无偏 不能收敛到的叫有偏 无限采样,无限接近的被叫做一致(consistant) 模糊的就是有偏,无限产生的不模糊就是consistent ![](https://minio.l4rk.link/picture-bucket/2023/12/10/20231210232436.png) 从工程的角度看 有偏方法最终的结果可能会与实际差距较大 而无偏方法不管怎么处理,结果都贴近真实 例如下方的Photon mapping 当`n过大`的时候,会产生模糊现象,就是由于Photon Mapping本身是有偏方法,造成`n越大,偏差越大` ## Unbiased light transport ### BDPT 双向的路径追踪 ![](https://minio.l4rk.link/picture-bucket/2023/12/05/20231205143922.png) 光照能量主要集中在某个漫反射上 ![](https://minio.l4rk.link/picture-bucket/2023/12/05/20231205143950.png) 对于path tracing非常困难 对于BDPT不错.但BDPT实现难度高,运行速度慢 ### Metropolis Light Transport (MLT) 原理在于,找到一条正确的光路,再在光路周围生成新的推测出来的光路 ![](https://minio.l4rk.link/picture-bucket/2023/12/10/20231210223514.png) 对于困难的光路比较好用,尤其是specular-diffuse-specular (SDS)这种光路 ![](https://minio.l4rk.link/picture-bucket/2023/12/10/20231210223700.png) 当然也存在问题咯 无法估计收敛的时间.相较于其他的光线追踪算法,MLT不能较好地估计产生一个比较好的图像所需要的时间 并且由于相邻的像素,在收敛程度上并不存在相关性,导致相邻像素差距较大,噪点过多,图像看着太脏.尤其是在动画方面,前后两帧差距过大,动画不稳定 ![](https://minio.l4rk.link/picture-bucket/2023/12/10/20231210223808.png) ## Biased light transport ### Photon Mapping - A biased approach & A two-stage method - Very good at handling Specular-Diffuse-Specular (SDS) paths and generating caustics ![](https://minio.l4rk.link/picture-bucket/2023/12/10/20231210225721.png) 原理: 8. 从光源开始发射光线,不管折射与反射,但要在漫反射的位置停下来. 9. 从眼睛(相机)开始,发射sub-path,同样,不管折射与反射,在漫反射位置停下 10. Calculation — local density estimation.求周围$N$个光子对应的面积的密度.$N$人为指定 ![](https://minio.l4rk.link/picture-bucket/2023/12/10/20231210230500.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/10/20231210230510.png) 可以看到,并不是$N$越大,效果越好 ![](https://minio.l4rk.link/picture-bucket/2023/12/10/20231210230549.png) 这是因为,Photon Mapping 本身是一个有偏的方法. 根本在于,计算密度的时候,我们并不是严格按照定义$\frac{dN}{dA}$,而是计算$\frac{\Delta N}{\Delta A}$(固定数量N对应的面积) 只有当光源,人眼发出的光线越多,$\frac{\Delta N}{\Delta A}$中的$\Delta A$越接近$dA$,效果越好 当接近无限的时候,就能产生consistent的效果 为什么不用固定的$\Delta A$? 很简单,固定的$\Delta A$永远不可能等于$d A$,永远实现不了consistent ### Vertex Connection and Merging A combination of BDPT and Photon Mapping![](https://minio.l4rk.link/picture-bucket/2023/12/10/20231210233052.png) 对于两个sub-path的终点非常接近的情况,会采用Photon Mapping的方法,将终点看作光子,再在两个点存在的面上,计算贡献.从而提高的利用率,减少对于sub-path的浪费 ### Instant Radiosity (IR) 实时辐射度算法 每个光源产生新的光源.实现用直接光的算法,得到间接光的效果 ![](https://minio.l4rk.link/picture-bucket/2023/12/10/20231210233708.png) 在diffuse中效果好 无法处理glossy 材质 在边缘会有奇怪的发光点 ![](https://minio.l4rk.link/picture-bucket/2023/12/10/20231210233759.png) ## Advanced Appearance Modeling - Non-surface models - Participating media - Hair / fur / fiber (BCSDF) - Granular material - Surface models - Translucent material (BSSRDF) - Cloth - Detailed material (non-statistical BRDF) - Procedural appearance ### Non-Surface Models #### Participating media 各种非表面的散射介质(participating medium)fog,could... 在反射中,我们有BRDT描述 在散射中,我们有相位函数(Phase Function)描述 ![](https://minio.l4rk.link/picture-bucket/2023/12/10/20231210235951.png) 它决定了散射的方向,散射的能量分布,光线传播多远等 rendering方法 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211000025.png) 需要注意的是,很多看似不是散射介质,而是表面材质的东西,其实也是散射介质. 例如这只巧克力兔子,液体的内部仍然是散射材质,只是不明显,光线很快会在内部消失 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211000215.png) #### Hair Appearance ##### Kajiya-Kay Model 将毛发视作一个圆柱 光线在一个圆锥的范围内进行散射,效果一般 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211001424.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211001502.png) ##### Marschner Model T为折射 R为反射 TT即穿过毛发,发生两次折射 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211001515.png) cuticle为头发表面,由角质组成 cortex为内部,不同颜色的毛发有不同的,由色素决定的cortex,也能吸收光线 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211001658.png) 效果非常漂亮 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211001803.png) #### Fur Appearance 直接套用人类头发模型效果不够好 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211003356.png) 原因在于,动物毛发与人类头发本身就存在差异 头发被分为三级,cuticle,cortex,medulla,由于人类的髓质(meddula)本身就比较小,用单个cylinder模型,效果也不错,但是对于动物而言,毛发的髓质层较大,忽略之后,效果差距明显 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211003457.png) 改用Double Cylinder Model ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211003700.png) $TRT^{s}$意为穿透-经过髓质-反射-穿透 其他同理 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211003730.png) 从之前的三层变为五层结构,增加了$TT^{s}$与$TRT^{s}$层,可以看出它们对于结果的贡献也是极大的 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211003857.png) #### Granular Material 颗粒材质 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211153135.png) 目前处理得还不够好,难度很高 ### Surface Models #### Translucent Material 通透材质 相较于BRDF,增加了表面下的光线散射,叫做BSSRDF. SS应该就是Subsurface Scattering ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211154902.png) 与BRDF类似,对于面积和角度进行积分.但计算极为困难 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211155005.png) 因此提出近似方法Dipole Approximation ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211155100.png) 在表面下生成一个光源,对应的表面上的位置也生成一个光源 可以看到模拟人的皮肤,玉石的效果都很好 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211155150.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211155213.png) #### Cloth 布料模拟 物理上的组成情况 fibers->ply->yarn->cloth ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211155902.png) 有三种比较主流的渲染方式 - BRDF 简单有效 受材质限制: 对于类似天鹅绒这种本来就不在一个平面上的材质来说,效果差 对针织,在一个平面上的材质,效果好 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211160057.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211160119.png) - Render as Participating Media 当作散射介质进行渲染,与对云烟的渲染类似 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211160240.png) - Render as Actual Fibers 最最暴力的算法,直接对每一根纤维进行渲染 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211160624.png) ### Detailed appearance 这样子的茶壶虽然效果很好,但不够真实. 原因在于相对于现实世界中缺少的细节:各种划痕 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211161355.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211161745.png) 将上面两幅合成之后的效果就好多了 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211161814.png) 在传统的微表面模型中,$D(h)$是理想化的 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211161840.png) 法线的高斯分布是极其均匀的.但在正常的情况下,应该是大体符合,部分不同.这就是缺少的细节. ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211161918.png) 但要对这样充满细节的镜面模型进行渲染开销很大. path sampling经常会出现miss现象 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211162540.png) Solution: BRDF over a pixel 对一个规定区域内,求它们的平均法线方向来代替每个微表面的方向 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211162620.png) 范围越小,细节约多,范围越大,越贴近高斯分布,细节越少 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211162705.png) 不同范围有不同的P-NDF 不同的材质也有不同的P-NDF ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211162834.png) ### Wave Optics 在某些情况下,会有波动光学的特性体现出来 ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211234634.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211234659.png) 非常困难 ### Procedural Appearance 生成式 表面 利用noise函数生成 生成的结果是三维的内容.相较于表面材质,物体的内部材质也可以通过noise函数查询到. ![](https://minio.l4rk.link/picture-bucket/2023/12/11/20231211235126.png) # Lec19 Cameras, Lenses and Light Fields Imaging = Synthesis + Capture 从成像的角度来看,除了之前的光栅化与光线追踪的虚拟成像之外,还有最最原始的方法,捕捉. 利用小孔成像或者lens+sensor进行成像 ## What’s Happening Inside the Camera? 两大派别: - Pinholes - Lenses Form Image on Sensor ### Pinholes 小孔成像的结果存在问题,所有地方都不会出现应该有的虚化. 因为小孔成像没有焦距的概念,成像缺乏深度信息,自然没有虚化,景深 ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212145406.png) ### Lenses Form Image on Sensor shutter(快门)控制曝光期间的进光量(irradiance) Sensor Accumulates Irradiance During Exposure 如果缺少lens,单单一个传感器,就会导致记录所有的光线,成像得到的每个pixel都很接近. 因为sensor本身只会记录irradiance,不能区别进光的方向,记录不了radiance. ![Sensors Without Lenses](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212145133.png) ### Field of View (FOV) 可以简单计算得FOV与$f,h$的关系 $h$不变,$f$越大,FOV越小 $f$不变,$h$越大,FOV越大 ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212153003.png) 由于历史性的原因,$f$值往往都是参考35mm-format film的标准转换来的 ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212153140.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212153320.png) 在手机的小底上保持相同的FOV,就需要更小的$f$ ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212153409.png) ### Exposure Exposure = time \* irradiance time controlled by shutter irradiance controlled by lens aperture(光圈) and focal length 除了光圈大小与快门速度外,还有一个ISO增益. 三者都能影响最后成像的曝光度 ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212153712.png) - 光圈: $F$越大,光圈越小,挡光越强,越接近于小孔成像,深度信息越少,景深越少 对曝光的影响为指数.$(\frac{F_{1}}{F_{2}})^{2}$ $F2.0$与$F4.0$,前者亮度为后者4倍,越小光圈越大,越亮 - 快门: 快门时间越短,记录的时间信息越少,动作越静止,成像越清晰 对曝光的影响为线性.$1/30$与$1/15$,后者为前者亮度的两倍 标红的几组,在亮度上几乎没有区别,但成像结果也并非是一摸一样 景深与动作模糊存在区别 ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212161402.png) - ISO: ISO越小,信号放大增益越小,噪点信号与周围信号差距越小,噪点越不明显 乘法计算,且放大效果为线性.12800比100放大128倍 Multiply signal before analog-to-digital conversion Linear effect (ISO 200 needs half the light as ISO 100) ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212153806.png) ### shutter side effect - motion blur Doubling shutter time doubles motion blur ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212155928.png) - Rolling shutter 快门的开关不是一瞬间发生的,而是一个过程.这就会导致某些地方的光先被sensor接收,某些地方后被接收,成像时间上存在先后顺序 螺旋桨位置就因此发生了扭曲 ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212155953.png) ### Fast and Slow Photography High-Speed Photography ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212163132.png) Long-Exposure Photography ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212163157.png) ### Aperture F-N定义为焦距除以直径 ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212182246.png) ### The Thin Lens Equation/Gaussian Thin Lens Equation 将正常的复杂镜头组视作简单的薄棱镜,来解释各种现象 简单的光学定理,由相似三角形推导得出 ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212163342.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212163428.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212163437.png) ### Defocus Blur 不能正好出现在成像平面上的物体,会产生一个Circle of Confusion (CoC),造成景深模糊的效果. ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212181830.png) 用相似三角形的原理可以计算得出CoC大小 并且光圈越大,即$F$越小,CoC越明显 $A$为光圈的直径. 将$A=\frac{F}{N}$带入得 ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212182515.png) ### Depth of Field ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212184233.png) 景深大小也受到别的参数的影响 what is small enough? 如果成像大小为一个像素或者比一个像素小,就算是锐利的图像.反应到图上就是` Depth of focus`这个范围内成像,都被认为没有CoC ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212184334.png) $D_{F}$为最远,$D_{N}$为最近,$D_{S}$为Sensor所在的位置 ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212184346.png) [在线演示](http://graphics.stanford.edu/courses/cs178/applets/dof.html)中还能看出越$F-N,f$等参数的联系 ## Renderings with Lens Focus 示例 ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212183227.png) 计算过程 ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212183241.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212183251.png) # Lec20 Color and Perception Finishing up light field / lumigraph Color • What is color • Color perception • Color reproduction / matching • Color space ## The Plenoptic Function (全光函数) 最完整的全光函数有七大参数 分别表示方向$\theta,\phi$,颜色$\lambda$,时间$t$,位置$V_{x},V_{y},V_{z}$ ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212214453.png) 去掉颜色为黑白 去掉时间为静态照片 去掉位置为固定位置,不能移动 ## 全光函数的光线表示 - 5D,起点与方向五个参数 ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212214902.png) - 4D,2D点与2D方向 ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212214949.png) ## Light Field / Lumigraph 光场 一个三维的物体,只要两个参数就能在它的表面贴图中找到对应的位置.再来一个2D的方向,就能确定出一条光线 ![](https://minio.l4rk.link/picture-bucket/2023/12/12/20231212215240.png) 记录这全部信息,得到的就是光场.在光场中进行简单地查询,就能得到从某个方向看向某点的结果 $2D position+2D direction=2D position+2D position$ ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217151556.png) 进行替换,每个点由两个参数表示.分别为$(u,v)$ $(s,t)$ 并且物体在$(s,t)$的另外一面 ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217151604.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217151617.png) 固定$(u,v)$,变化$(s,t)$,得到的是相机从$(u,v)$观察物体的结果,与成像相同 但固定$(s,t)$,变化$(u,v)$,得到的结果很奇怪 ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217151934.png) ## Light Field Camera 苍蝇的复眼就是光场照相机. 在原本成像的位置,加上了透镜,使得已经完成聚焦的光线,被拆分开来,从irridiance变为ridiance,增加了方向性. ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217153700.png) 光场相机的优点在于,方便后期调节焦距,甚至镜头位置. ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217154945.png) 原理与苍蝇的复眼相同 ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217155202.png) 如何在后期处理的时候,改变相机位置? 只要某个固定方向的radiance,就可以得到视觉效果.例如图中得到的是从下往上看. ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217155222.png) 根本的原因在于记录的是光场信息.处理光场信息得到不同的结果 也有一些问题 ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217155527.png) ## Color ### 光谱 ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217193136.png) ### SPD Describes distribution of energy by wavelength ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217193148.png) 太阳与天空的SPD ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217193229.png) SPD是线性的,直接相加就行 开两盏灯就是两倍的亮度 ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217193331.png) ### Biological Basis of Color ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217193620.png) 有柱形感光细胞,锥形感应颜色细胞.锥形有三种SML ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217193638.png) SML对不同的波长感应不同 spectral response curve ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217193918.png) 每个人的SML也有所不同 ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217195439.png) 最终的结果是对响应曲线的积分,得到SML三个数,再把三个数传递给人脑 ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217195546.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217195643.png) ### Metamerism 同⾊异谱 SML三个值影响了最终的颜色.而SML是由积分得到的,也就是说,存在不同的频谱,但是得到的SML值相同. 同⾊异谱的现象存在发生的可能. 一样的太阳不同的频谱 ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217203238.png) ### Color Reproduction / Matching 我们使用的是加色系统,几种色彩混合的结果趋近于白色. 而现实生活中是减色系统,多种色彩混合的结果趋近于黑色 增色系统由RGB三大参数决定 ![](https://minio.l4rk.link/picture-bucket/2023/12/17/20231217203544.png) 可能存在RGB某个值是负的情况 ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218191817.png) 匹配函数 ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218192534.png) 对匹配函数进行积分,得到的就是最终的RGB值 例如在500nm波长位置,积分得到的RGB值,就是500nm波长光线的RGB表示的最终结果 ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218192520.png) ### Color Spaces #### CIE XYZ A Universal Color Space. 是一种人为构造的匹配函数,在科学界使用比较广泛 由$XYZ$三个参数确定,$Y$用来表示亮度 ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218194427.png) #### HSV Color Space ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218201159.png) #### CIELAB Space L*a*b lab系统是由人类的视觉生理特点实验得到 ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218201220.png) 红绿为互补色 蓝黄为互补色 所以才会在ab轴相反方向上采用不同的颜色 ### Gamut (⾊域) Different color spaces represent different ranges of colors So they have different gamuts, i.e. they cover different regions on the chromaticity diagram ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218195929.png) 不同标准的色域有着不同的色度图覆盖范围 以CIE $XYZ$为例 $xyz$是由$XYZ$归一化之后得到的. 如果把色域放在三维空间中展示,结果不够直观,并且也不好打印到书本上 所以要减少参数. 由于$x+y+z=1$,只需要$xyz$中的两个就够. 因为$Y$用来表达亮度,所以可以固定$Y$的值. 最终只要$XZ$就行.可视化的结果只要$xy$两轴. ![Chromaticity Diagram 色度图](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218194704.png) 白色是最不纯的,越靠近边缘颜色越纯 White at the centroid of the plot (1/3, 1/3) ### Opponent Color Theory There’s a good neurological basis for the color space dimensions in CIE LAB - the brain seems to encode color early on using three axes: - white — black, red — green, yellow — blue - the white — black axis is lightness; the others determine hue and saturation 互补色对于人来说是不能融合的.例如,有黄绿蓝绿深绿,但没有红绿. 还有一个有趣的实验[GAMES101-现代计算机图形学入门-闫令琪 1:24:35](https://www.bilibili.com/video/BV1X7411F744/?p=20&share_source=copy_web&vd_source=2e249bb630e74b68ca9b98c0660aa70b&t=5075) ### color is relative not only color,everything is relative. 就像音乐中,绝对音准虽然很酷,但最重要的还是相对音准. 在颜色中,重要的是相对,而不是绝对的RGB,或者其他颜色空间的参数. ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218201857.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218201908.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218201846.png) ### Subtractive Color Space 减色系统 CMYK C为蓝绿,M为品红,Y为黄,K为黑 ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218202453.png) 为什么有K呢? 应用中,黑色比较常见,便宜,用CMY来混,成本高 # Lec21 Animation An extension of modeling Represent scene models as a function of time Animation应用视觉残留的原理,短时间输出大量image,得到动画 ## history ## Keyframe Animation ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218235357.png) 插值法 ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218235408.png) 插值也有Linear interpolation和smooth / controllable interpolation 线性插值效果比较差 ## Physical Simulation 布料模拟,液体模拟 ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218235705.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218235924.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218235932.png) ## Mass Spring System 质点弹簧系统 Example of Modeling a Dynamic System Mass Spring Rope,头发,Mass Spring Mesh模拟 ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218235943.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218235959.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/18/20231218235907.png) Mass Spring System在布料模拟的效果很好 ![](https://minio.l4rk.link/picture-bucket/2023/12/19/20231219000053.png) ### spring 弹簧的情况从最简单理想到最复杂写实

\begin{align}
&x\
&\dot{x}=v\
&\ddot{x}=a\
\end{align}

You can't use 'macro parameter character #' in math mode- A Simple Spring 原长为0 ![](https://minio.l4rk.link/picture-bucket/2023/12/19/20231219000242.png) - Non-Zero Length Spring 会有永远简谐振动 ![](https://minio.l4rk.link/picture-bucket/2023/12/19/20231219000602.png) 引入摩擦力简单模型. 对于质点,有相反方向的摩擦力. 有如下问题: 11. 当弹簧下落时,会受到$f$的阻力,且$f$远大于实际上的空气阻力,下落速度减慢 12. 所有质点的运动速度都会变慢 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220205055.png) 改进 $\frac{b-a}{||b-a||}\cdot(\dot{b}-\dot{a})$为相对速度与弹簧方向的点乘,结果为相对速度在弹簧方向上的投影,是一个标量 解决了上面的两个问题.同时保证了,当一点不动,另外一点做匀速圆周运动时,$f=0$. ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220205359.png) ### Structures from Springs 对于弯折裁切(shear)的力量模拟不好 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220210349.png) 加上比较强的对角线弹簧,就能抵抗住裁切力了 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220210502.png) 但是bending问题没有解决 在间隔相邻的质点之间加上红色弱弹簧,就可以啦,模拟布料的效果很好 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220210535.png) ## FEM (Finite Element Method) 除了质点弹簧系统外,还有有限元方法,模拟仿真也很好,就是代码实现困难 ## Particle Systems 粒子系统. ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220213547.png) 流程上很简单,实现困难 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220213557.png) 除了比较普通的作用力,还要考虑很多 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220213655.png) 除了这样的粒子系统外,还有一些更复杂的 鸟群模拟 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220213732.png) 人群 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220213753.png) ## Forward Kinematics 正向运动学 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220220425.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220220454.png) 对于使用不方便 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220220547.png) ## Inverse Kinematics 不关注关节的运动,只关注最终结果的点 创作者决定终点,电脑决定关节的状态 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220220739.png) ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220220828.png) 如果用正向运动学推导...结果感人 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220220731.png) 逆向运动学存在多解或无解,也是要解决的. 有些优化算法 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220221102.png) ## Rigging 类似提线木偶上的线,控制角色动作.翻译不好翻译 就是角色上的控制点 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220222549.png) 用控制点控制角色 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220222628.png) 用插帧的方法控制 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220222658.png) ## Motion Capture 动补技术 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220222717.png) 效果上看非常真实,但是昂贵 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220222734.png) 实际生产中,多用控制点与摄像头的方法 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220222803.png) ## The Production Pipeline 生产管线 ![](https://minio.l4rk.link/picture-bucket/2023/12/20/20231220222859.png)