GAMES101-现代计算机图形学入门
学习时间:2022年2月5日19:46:58
作者:聪头
课程URL:https://www.bilibili.com/video/BV1X7411F744
课程主页:https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html(含课件)
拓展URL:
- 清华大学-计算机图形学基础(国家级精品课):https://www.bilibili.com/video/av66548502
学习思路:
- 为什么?(Why)
- 是什么?(What)
- 怎么做?(How)
必须课程:线性代数、微积分、数据结构
扩展课程:信号与系统、概率论与数理统计、数值分析(龙格库塔)
Ch1.概述 P1
图形学应用:游戏、电影、动画、设计、可视化、VR/AR、数字绘图、模拟、GUI(Graphical User Interfaces)、字体(Typography)
教学内容:光栅化、曲线和网格、光线追踪、动画/模拟
CV vs. CG
https://www.bilibili.com/video/BV1X7411F744?t=2411.7
推荐书籍
Ch2.变换
2.1 线性代数 P2
向量
向量、单位向量、加法:7m50s
向量点乘:16m35m
- 两个向量点乘是一个数
- 两个向量是单位向量,点乘结果为cos
- 作用:找到两个向量的夹角;找到一个向量投影到另一个向量上的向量
向量叉乘:30m25s(默认右手定则)
- 满足负交换律
- 作用:判定左/右;判定内/外
叉积应用
- 判定内外:AP x AB、BC x BP、CA x CP(结果符号一致就在内部,否则在外部)
矩阵 45:00
矩阵及其乘法:45m
特殊矩阵:51m35s
- 转置矩阵、单位矩阵、逆矩阵
矩阵和向量转化,即向量乘积可以写成矩阵形式
2.2 变换1 P3
二维变换
2维旋转矩阵及其推导:16m15s
线性变换:24m30s
齐次坐标:26m
仿射变换
- 特点:最后一行为0..01,可压缩
2D变换矩阵:41m35s
逆变换:44m15s
复合变换:45m30s
三维变换 58:00
三维变换:58m
2.3 变换2 P4
本节内容:3D变换、观测变换(包括视图、投影变换)
三维旋转 9:30
观测变换 22:30
投影变换 39:00
正交投影
透视投影 51:30
y轴挤压
x同理
目前已知:除了z变换关系,其他均已知
求z
`。根据近平面的点映射前后,z不变
求z
`。根据远平面中心点映射前后坐标不变
至此,挤压部分的变换矩阵就求完了,剩下就是乘上正交矩阵即可
摘自LearnOpenGL_CN
Ch3.光栅化
3.1 三角形 P5
投影补充 6:45
规范立方体到屏幕 14:45
视口变换
绘制机器 25:45
不同光栅化设备 26:35
CRT、LCD、LED
光栅化过程 39:30
为什么使用三角形?
- 最基本的多边形
- 可以拆解任意多边形
- 独有属性
- 共面
- 内外定义明确
- 容易插值
采样
函数离散化过程。即给定离散x,得到y
采样实现光栅化 43:55
如何判断像素是否在三角形内 49m45s
在每条边(顺时针或逆时针方向)上利用叉积,看结果方向是否一致
包围盒 55m
优化:如果像素不在包围盒内,就更不可能在三角形内
3.2 反走样 P6
前置知识:信号系统与处理
扩展知识:数字图像处理(滤波小节提到)
英文:Anti Aliasing
- Artifacts:瑕疵,图形学中表示一切不希望看到的结果或不太对的东西
采样产生的问题:锯齿、摩尔纹、车轮效应
产生原因:信号变化太快,但是采样跟不上
解决办法
对原始函数或信号模糊(滤波)再采样,缓解锯齿问题
- 反走样不可先采样再模糊
频域 17:25
英文:Frequency Domain
傅里叶级数展开:任何一个周期函数,都可以写成一系列正弦和余弦函数的线性组合,以及一个常数项
傅里叶变换:给定任何一个函数,可以通过傅里叶变换,成为另一个函数
低频信号:充分采样,合理重构
高频信号采样不足:重构信号不正确,似乎来自于低频信号
走样 27:40
走样:同样的采样方法,采样两种不同频率的函数,得出的结果无法区分(一致),就称为“走样”
- 下图中用蓝色和黑色去拟合近似黑色的曲线,会发现采样的结果一致
高频信号采样不足:采样错误地显示为来自低频信号
在一个给定的采样中无法区分的两个频率被称为“走样”
滤波 29:30
英文:Filtering
白话解释:把某个特定的频段删掉(去掉特定频率)
傅里叶变换作用:把一个函数从时域变换到频域
- 下图展示了从图像空间变换到频率空间
- 频率空间:中心低频、周围高频
- 频率空间表达的就是图像之间颜色变化的信息,白色代表有信息,黑色代表无信息。之所以被分为四个象限,主要是因为傅里叶变换是针对周期函数,图像是非周期的,所以需要左右重复拼接,上下重复拼接形成,所以在边界处的信号有跳变,从而产生高频信号,所以看到四条白线(可忽略)
高通滤波:High-pass filter,高频信号可通过,所以只剩下高频。用于得到边界
低通滤波:Low-pass filter,只剩下低频。用于模糊。
卷积 35:55
滤波=卷积=平均
Filter = Convolution = Averaging
卷积定理:时域卷积 = 频域乘积(同时,时域乘积 = 频域卷积)
采样 51:30
Sampling = Repeating Frequency Contents
频域上就是把原始函数的频谱,复制粘贴很多
冲激函数就是采样的函数,将时域上连续函数变成离散函数
频谱混叠,就是走样现象
反走样 57:38
英文:Antialiasing
减少锯齿的办法:
- 增加分辨率(即提高采样率)
- 反走样
反走样过程
- 使用低通滤波拿走高频信息,然后再采样
- 低通滤波器在图像中实际就是卷积操作
卷积示例
在对一个三角形进行光栅化时,f(x,y)=inside(triangle,x,y)像素区域内的平均值等于该三角形所覆盖的像素区域的面积
MSAA 64:30
英文:MultiSampling Anti-Aliasing
中文:多重采样抗锯齿
通过增加采样点(而非提升分辨率)来减少锯齿
通过对一个像素内的多个位置进行采样并取其平均值来近似1像素Box滤波器的效果
结果
其他抗锯齿方案
- FXAA:Fast Approximate AA,快速近似抗锯齿
- 本质是图像后期处理,模糊边界。开销小
- TAA:Temporal AA,时间抗锯齿
- 本质是复用上一帧采样的结果,即将MSAA采样的结果分布在时间上。开销小
超分辨率
- DLSS:Deep Learning Super Sampling
- 本质是猜测
3.3 深度测试 P7
画家算法:先画远的,再画近的
Z-Buffer
- 存储当前最小深度值在深度缓存中
- 最小深度值均为正数,近小远大
算法核心思想
Ch4.着色 P7
4.1 着色 30:45
有道翻译:
- 用平行线或一块颜色使插图或图表变暗或着色
- 本课程:对于不同物体应用不同材质
简单光照模型 38:00
本节介绍的是:Blinn-Phong反射模型
方向定义
- 方向均为单位向量不考虑阴影
漫反射
根据球的表面积算(原因是三维空间)
- k
d:漫反射系数,0~1
高光 P8 6:10
高光项的p
k
s与p,ks控制高光亮度,p控制高光范围
环境光 14:45
最终效果 17:05
着色频率 P8 20:30
flat shading
Gouraud shading
Phong shading
小结
- 当模型足够复杂,三种着色频率得出的效果差不多
顶点法线 29:10
逐顶点法线
- 顶点关联的面求平均
逐像素法线
- 重心插值
4.2 图形管线 P8 32:30
Shader编程 40:30
- 每个顶点和像素都会执行一次(分别是顶点着色器和像素着色器)
- 只需编写一种规则(处理一个顶点和像素),其他都适用
扩展 47:00
- 推荐学习网站:ShaderToy
- GPU:渲染管线的硬件实现,高度并行的多核处理器
- 其他着色器
- Geometry Shader:动态修改几何形体
- Compute Shader:通用计算
4.3 纹理映射 P8 54:10
引入
UV 61:15
- 无缝贴图技术:Wang Tile
重心坐标 P9 5:00
参考链接:https://zhuanlan.zhihu.com/p/58199366
作用:做三角形内的插值
举例
任意一点(了解)
重心处的重心坐标
应用 16:30
重心坐标在投影前后会发生变化。这就要求我们需要在投影前的三角形内做插值,而不能在投影之后(即建议在三维空间中做插值)
纹理应用1 P9 20:50
对每个像素进行采样(通常就是像素中心点)
- 通过重心坐标公式得到该点的uv值
- 使用uv值采样得到漫反射颜色
问题:纹理过小 23:00
- 纹理过小,屏幕上多个像素映射到同一个纹素中。需要放大纹理以匹配映射
Nearest:四舍五入
双线性插值 Bilinear
- 取周围4个像素,分别在水平和竖直插值
- 双三次插值 Bicubic
- 取周围邻近的16个进行水平和竖直的插值
问题:纹理过大 34:30
Mipmap 43:30
快速、近似、正方形的范围查询
- 存储:4/3(公比为1/4的等比数列求和,额外开销为原图的1/3)
Mipmap的计算
- L的计算:在屏幕空间上一个像素的微小变换dx和dy,会导致纹理空间中一个纹素的变化量(这里分别对u和v方向做微分,本质就是纹理空间移动的长度)。纹素变化量越大,说明Mipmap层级越高
- D的计算:L每增长2倍,面积就增大4倍(1个实际像素对应4个纹素),此时Mipmap提升一级(精度下降1/4)
在Mipmap间采用Nearest,使用四舍五入求MipMap等级D
在Mipmap间采用Trilinear Interpolation,使用三线性插值
- 先对两张Mipmap使用双线性插值
- 再对这两张Mipmap做层与层间插值
各向异性过滤 62:41
- Mipmap是正方形贴图(每次缩小时长宽各缩小1/2),在特殊场合不适用
- 各向异性过滤(考虑不同方向性)
- Ripmap
- 箭头起始表示采样点,终点表示还原之后的采样区域(画得比较夸张)
- 开销最终会收敛为原图的3倍(打游戏各项异性过滤等级理论上可以开到最高也没事)
- 从屏幕的像素映射到uv像素,不总是方形,而这时使用传统的Mipmap就会产生OverBlur
- 对于斜着的区域,采用EWA filtering(质量好但开销大)
纹理高级应用 P10 7:00
环境贴图
Cubemap 14:30
- 从圆心发射一条射线,打在立方体表面
凹凸贴图和法线贴图 17:15
- 凹凸贴图:假装改变顶点位置,重新计算法线信息(运行时计算:先计算利用导数计算切线,再计算法线(二维转90度,三维用叉乘))
- 法线贴图:直接修改法线信息(提前计算好)
添加表面细节而不添加更多的三角形
- 扰动每像素的表面法向
- 由纹理定义的每个纹素控制高度的移动
翻译:凹凸贴图就是,改变法线的同时改变顶点位置
- 二维空间的凹凸映射:经凹凸贴图变换后顶点的法线计算
这里的1表示1个单位,对应到纹理上就是一个纹素
- 三维空间的凹凸映射
本质上就是在两个方向上做叉积
推导见《马同学》的多变量微积分4.8:第二类曲面积分的有向切平面小节,里面提到三维空间任意曲面的法线求法。(记得最后把dx=1和dy=1代入)
最后结果(-dp/du, -dp/dv, 1)
置换(位移)贴图 29:05
- 凹凸贴图(法线贴图)边缘或投影会很假
- 真正改变三角形顶点位置(要求:三角形数足够多,否则跟不上纹理的变化速度,从而产生走样)
- 实际解决办法:动态曲面细分
3D纹理 33:40
没有纹理贴图,直接根据点的位置计算
其他信息 35:30
ao贴图
体渲染(后面讲)
Ch5.几何 P10 38:30
5.1 显式和隐式几何 45:55
- 类似隐函数和显函数
隐式几何
- 不告诉顶点具体位置,只知道关系
- 缺点:很难画出物体
- 优点:很容易判断点是否在物体内外
显式几何 51:00
- 优点:很容易画出物体
- 缺点:很难判断点是否在物体内外
隐式几何 56:30
代数表面
体素构造表示
距离函数 61:00
- 如果仅仅把A,B叠加,得到的是2/3黑,1/3白(结果好像B把A覆盖了)
- 如果利用SDF进行A,B的叠加,得到的就是1/2黑,1/2白(结果好像A,B融合在一起,构成新物体。新物体的边界就是值为0的边)
水平集
- 距离函数的拓展
- 值为0的地方组成边界,构成物体形体
- 类比等高线
三维水平集
- 例如三维空间的物体中同一密度值构成边界,又组成一个新物体
分形 72:45
- 递归,不断重复自身
小结 75:00
隐式表示优点:
- 描述紧凑(连续函数)
- 某些查询简单(物体内,到表面距离)
- 利于光线与表面求交
- 对于简单的形状,准确的描述/没有采样误差
- 易于处理拓扑变换(例如液体)
隐式表示缺点:
- 复杂形状很难建模
显式几何 P11 3:10
- 直接定义或由参数定义
点云
最简单的表示:点列表(x,y,z)
很容易表示任何几何图形
适用于大型数据集(>>1点/像素)
经常转换成多边形网格
在采样不足的地区很难提取
多边形网格
Obj
v:顶点
vn:法线
vt:纹理坐标
f:面
f 5/1/1 1/2/1 4/3/1
- 第一个点使用第5个点,第1个纹理坐标,第1个法线
- 以此类推,将三个点联系起来构成一个三角形
5.2 曲线 P11 10:45
贝塞尔曲线
曲线属于显式几何(由参数定义)
应用:摄像机路径、动画曲线(模型沿着曲线运动)
De Casteljau 算法(图像上表示,而非代数式表示)
解释:取t=1/3
- 每条线段上取1/3:在b0–b1取1/3,在b1–b2取1/:
- 二者连线再取1/3(此时点两端共线,递归结束)
动画演示:https://www.bilibili.com/video/BV1X7411F744?p=11&t=1260.0
实现思路(代数表示)
- 观察发现:系数遵循二项分布(下面提到的伯恩斯坦多项式)
推广到n+1个点(下标从0开始到n,称作n次贝塞尔曲线)
- 举例:参考上一张截图,代入n=2去验证发现符合公式
推广到三维
性质
以三次贝塞尔曲线为例(4个点)
- 经过起始点和终点
- 在起点和终点的导数值斜率为3
- 各顶点经过仿射变换后仍是三次贝塞尔曲线(相当于对顶点变换后重新画贝塞尔曲线)
- 凸包性(任意贝塞尔曲线一定在所形成控制点的凸包内)
逐段贝塞尔曲线
- Piecewise Bezier Curves
- 优势:容易控制
- 通常是4个点分一段(三次贝塞尔曲线)
连续(泰勒展开)
- C0连续:在某点的函数值相等
- C1连续:在某点的一阶段导数值相等(一阶导数连续)
样条线 46:40
英文:Spline
连续曲线为了通过一组给定的点并具有一定数量的连续导数而构造的连续曲线
简而言之,这是一条可控的曲线
B样条*
贝塞尔曲线升级版,具有局部性(不会牵一“点”而动全身)
5.3 曲面 P11 53:15
贝塞尔曲面
三次贝塞尔曲面
- 类似双线性插值,在两个方向上插值
- 动画演示:https://www.bilibili.com/video/BV1X7411F744?p=11&t=3307.8
第一个方向插值得到贝塞尔曲线
第二个方向插值得到贝塞尔曲面
计算贝塞尔曲面 56:40
通过uv两个参数映射,所以是显式几何
- 两个参数u,v分别控制两个方向的插值情况
- 先找到u对应的曲线,再找到v对应的点
5.4 网格 P11 59:30
分类:Mesh subdivision、Mesh simplification、Mesh regularization
网格:细分 P12 7:00
细分(Subdivision)
Loop细分 9:20
- Loop是人名
- 适用情况:三角形网格
第一,增加更多三角形(定点数)
第二,调整它们的位置
- 对于新顶点
- 对于旧顶点:根据自己和周围顶点位置加权平均
图中白点度为6
Catmull-Clark细分 20:40
- 适用情况:一般网格
相关概念:
- 四边面和非四边面
- 奇异点:度不为4的点
Step1.添加顶点
步骤:
- 每条边取一个中点
- 每个面取一个中点
- 连接新顶点
一次细分
一次细分结论:
- 细分后增加奇异点数 = 细分前非四边面数
- 细分后非四边形面数 = 0
多次细分
Step2.调整规则* 28:20
新旧顶点位置调整规则(了解)
本质:依次求平均
- f:面中心
- e:边中心
- v:中心
两种细分比较
- Loop细分:仅适用于三角形
- Catmull细分:适用于一般网格
网格:简化 P12 33:40
边坍缩
- 多少几何误差是由简化引入的?
- 执行顶点的局部平均不是一个好主意(如左图)
- 二次误差:新顶点应该放在到之前各个面,距离的平方和最小的位置(机器学习的L2 distance)
算法浅析
- 需要预计算每条边的二次度量误差,每次取最小的坍缩(贪心算法)
- 每次坍缩后需要重新调整相关边的二次度量误差(堆排序)
遍历坍缩边,计算二次度量误差
到所包含三角形表面的距离和的近似
取值最小的坍缩
贪婪算法…好的结果!
实际举例
就是优先坍缩平坦的面,最后坍缩转角很大的面
Ch6.光线追踪
6.1 前置知识补充 P12
阴影映射 52:30
英文:Shadow mapping(不要和阴影贴图 Shadow map 混淆)
- 以下默认讨论点光生成的阴影
关键思想:摄像机和灯光都看得到的点不在阴影里
大致思路
1.从光源出发看,记录物体的深度
2.从摄像机出发看,将点投影回光源处,根据深度缓冲判断是否位于阴影内
思路可视化:可视化阴影映射
1.光源看向场景
2.摄像机看向场景
- 绿色:不在阴影里
问题
(第三条)涉及到浮点深度值的相等比较意味着缩放、偏差、容忍度等问题
硬阴影和软阴影 71:00
硬阴影:非0即1的阴影,没有过渡,来自于点光源(点光源无大小)
软阴影:越靠近物体根部越硬,阴影程度取决于光源大小
Umbra:本影区域,完全看不到光源的区域
Penumbra:半影区域,部分看到光源的区域
6.2 Whitted-Style光线追踪 P13
为什么要光线追踪?
基础光线追踪算法 10:20
光线
关于光线的三个观点
- 光沿直线传播(尽管这是错误的)
- 光线交叉时不会“碰撞”(尽管这仍然是错误的)
- 光路可逆,光线从光源传播到眼睛(但在路径反转的情况下,物理是不变的——互换性)
光线投射 15:25
思路
- 通过每像素投射一束光线来生成图像
- 最近交点通过向灯光发送光线来检查阴影
光线投射之像素着色
1.从摄像机出发,==每像素==投射一束光线(Eye Ray),相交于场景中最近的点
2.从交点出发,与光源相连(Shadow Ray),查看是否被照亮(被阻挡,在阴影里;否则,被照亮)
3.着色计算
Whitted-Style光线追踪 21:05
Recursive (Whitted-Style) Ray Tracing:递归光线追踪
本质:和基础光线追踪算法相比,追加一次反射和折射(能量衰减),将全部==结果累加==
- primary ray:第一根光线
- secondary rays:除第一根光线外的其他光线
- shadow rays:往光源的连线
① 光线与表面交点 31:15
光线与隐式几何求交
光线代数定义:有起点有方向的向量
光线上的点满足方程:r(t) = o + td [0, +∞)
光线与球相交:既满足光线方程也满足球方程(p = o + td)
要求:根为正实数
本质:求二次函数的根的最小值(根存在的话)
推广到一般情况
光线与三角形求交 38:40
光线起点在物体内/外:如果光线在==封闭物体内==朝外发射,仅有==奇数==个交点;在==封闭物体外==与物体相交则有==偶数==个交点
一般方法
求交思路:先计算光线与三角形所在平面相交,再判断交点是否在三角形内
平面的一般方程
联立光线方程和平面方程(p = o + td),求出交点。再利用叉积判断点是否在三角形内
公式法(一步到位)
本质:利用光线方程和三角形重心坐标性质联立求解线性方程组
求解思路:都是三维向量(表示点或方向),就有三个方程组,同时有三个未知数(t,b1,b2)。使用克拉默法则解线性方程组即可
结果需满足点在三角形内,进而得到结果需满足:
- t是正实数
- b1,b2,1-b1-b2均非负数(理由:[重心坐标 P9 5:00](#重心坐标 P9 5:00))
重点就是画红线的那一段,其他可不看
- 克拉默法则:参考《马同学》线性代数 7.8 克拉默法则
② 光线与包围盒求交 52:50
将每个三角形都和每个像素发射的光线求交?Very Slow!
英文:Bounding Volumes
避免碰撞(光线与物体)的快速方法:绑定复杂的对象与简单的体积
- 对象完全包含在体积中
- 如果(光线)没有击中体积,就不会击中物体
- 首先测试包围盒,然后测试对象是否命中
实现思路 57:45
通俗理解:3个无限延伸的对面形成的交集
AABB包围盒:任何一条边都平行于x或y或z轴(任何一个面都平行于xoy或xoz或yoz)
二维角度看
求光线在盒子内的时间(长度)
- 先假设光是直线(而非射线)
- 光线和对线(二维就是对线,三维就是对面)有两个交点(t
min和tmax,由于假设光线是直接,故可t可正可负) - 求每个对线交集,结果就是答案
三维角度看 66:00
关键思想:
- 光线进入盒子:只有当所有对面都进入才算进入
- 光线离开盒子:只要有一个对面离开就算离开
- t
enter= max {tmin};texit= min {tmax} - 如果t
enter< texit则有交点
分类讨论(从特殊到一般)
1.光线起点在包围盒内(texit >= 0 and tenter < 0),相交
2.texit < 0,不相交
3.texit > 0,但是tenter > texit,不相交
相交结论
使用AABB的好处
方便计算
t * d
x= p’x- ox(p’就是交点)d
x:d在x轴方向的投影
③ 加速光线与表面求交 P14 7:40
法1.均匀空间划分(格子)
英文:Uniform Spatial Partitions (Grids)
加速求交具体过程
1.预处理
2.光线与盒子求交,如果盒子内有物体再和物体求交
格子不能太稀疏,否则要判断很多物体(如果场景物体很多的话)
格子也不能太密集,否则一直要判断是否和盒子求交
法2.空间划分 18:00
均匀空间划分预处理的不足:在空旷场景内,也需要进行多次光线和盒子求交(优化思路:稀疏的地方用大的盒子)
预处理改进:
- Oct-Tree:每次沿每个坐标轴固定平分
- KD-Tree:每次选一个坐标轴和物体边界平分
- BSP-Tree:根据一定规则平分,较复杂
KD-Tree 25:30
- 在非叶结点上存储划分情况
- 在叶子结点上存储划分结果(哪些物体在区域内)
Tips:图示是均匀划分,实际KD-Tree不必均匀划分
KD-Tree数据结构
内部节点存储(非叶结点)
- 分离轴:x,y or z
- 分离位置:分离平面沿某一轴分离的坐标
- 子节点:指向子节点的指针
- 内部节点中不存储对象
叶节点存储
- 对象列表
举例演示 29:00
法3.物体划分&包围盒层级(常用!!!) 38:30
空间划分的不足:无法很好的表示物体在区域内,且物体可能在多个区域内
英文:Object Partions & Bounding Volume Hierarchy (BVH)
- 把物体分为两堆,重新计算包围盒,递归下去直到包围盒内物体数足够小
如何分
1.总是选结点中轴最长的分(例如,物体沿x轴方向排列,则x轴方向最长,从中间划分)
2.取中间物体划分(快速选择算法,O(n))
何时终止
数据结构:和KD-Tree相似
算法 52:10
KD-Tree VS BVH 52:10
空间划分(eg.KD-Tree)
- 将空间划分为不重叠的区域
- 一个对象(三角形)可以包含在多个区域中
对象划分(eg.BVH)
- 将对象集划分为不相交的子集
- 每组的边界盒在空间上可以重叠
推荐加速结构使用BVH
补充:DLSS 和 RTXGI
6.3 辐射度量学 P14 57:00
英文:Radiometry
1.专业术语
1.辐射能量和通量 (Flux) 63:50
英文:Radiant Energy and flux (power)
定义:Radiant Energy,辐射能量是电磁辐射的能量
- 单位:焦耳( J ),并用符号Q表示
定义:Radiant Flux,辐射通量是单位时间内发射、反射、传播或接收的能量
- 单位:lumen,lm,流明 (光通量单位)
辐射通量百度百科:https://baike.baidu.com/item/%E8%BE%90%E5%B0%84%E9%80%9A%E9%87%8F/4924207?fr=aladdin
辐射通量又称辐射功率,指单位时间内通过某一截面的辐射能,是以辐射形式发射、传播或接收的功率,单位为W(瓦),即1W=J/s(焦耳每秒)。它也是辐射能随时间的变化率Φ=dQ/dt 。测量辐射通量的方法一般是由直流电置换辐射通量的等价置换原理进行的。
后续物理量概述(含小结)
左1:辐射强度。一个光源向==每单位立体角==所投送的辐射通量
I = dφ / dw
中:辐照度。物体表面在==每单位面积==接收的能量
E = dφ * cosθ / dA
(考虑光线衰减还需要除以r^2^)右1:辐射亮度。物体==每单位立体角==上,==每单位投影面积==上辐射的能量 $L = \frac{d^{2}\phi}{dwdAcosθ}$(d^2^φ为二阶导,从积分角度更好理解)
可参考链接:
- 路径追踪(Path Tracing)与渲染方程(Render Equation):https://zhuanlan.zhihu.com/p/370162390
- 但是通常情况下,辐照度Irradiance的公式里不写cosθ,我们默认指的就是投影后的光线能量。
2.辐射强度 (Intensity) 70:00
英文:Intensity
定义:辐射(发光)强度是由点光源发出的单位立体角的通量
- 通俗理解:辐射强度指的是指单位时间,单位立体角上的发射的能量
单位:candela[kænˈdiːlə],cd,坎,坎德拉(发光强度单位);
百度百科:https://baike.baidu.com/item/%E8%BE%90%E5%B0%84%E5%BC%BA%E5%BA%A6/1298089
立体角 w
单位:sr,steradian
立体角通俗理解:单位球上的面积所对应的三维角。
单位立体角通俗理解:单位球上的单位面积所对应的三维角。单位立体角在不同方向大小是一样的。
立体角:https://baike.baidu.com/item/%E7%AB%8B%E4%BD%93%E8%A7%92
立体角(Solid Angle),常用字母*Ω*表示,是一个物体对特定点的三维空间的角度,是平面角在三维空间中的类比。它描述的是站在某一点的观察者测量到的物体大小的尺度。例如,对于一个特定的观察点,一个在该观察点附近的小物体有可能和一个远处的大物体有着相同的立体角。
球面度(如下图):https://baike.baidu.com/item/%E7%90%83%E9%9D%A2%E5%BA%A6/4256270?fr=aladdin
球面度(Sr=Steradian)是立体角的计量单位。面积为半径平方(r^2^)的球表面对球心的张角等于1球面度。因为球的表面积是4πr^2^,所以,整个球面有4π球面度。一个发光强度等于1坎德拉的理想光源,每球面度能够产生1流明光通量
Differential Solid Angles:单位立体角(微分立体角)dA
分别求出矩形两条边(用到弧长公式 l=r*θ):
- 长:
r*sinθdφ
- 宽:
rdθ
- dA:长*宽
验证:整个球面积分得到4π(先积θ,再积φ,这里的表示和高数书相反)
立体角可以用二维向量w表示(θ,φ)
辐射强度I
各向同性点光源的辐射强度I(均匀分散到四面八方)
通俗理解:单位时间内,光源从任何一个立体角度发射出能量(总能量 / 面积)
计算:整个光通量除以球的立体角
3.辐照度 (Irradiance) P15 11:40
英文:irradiance
定义:辐照度是每(垂直/投影)单位面积接收的辐射通量
- 通俗理解:单位时间,单位面积接收的投影能量
单位:lux,lx,“勒克斯”,简称“勒” (照度(luminance)的单位)
Tips:一定是和该点垂直的量!即需要是经过投影的能量
百度百科:https://baike.baidu.com/item/%E5%85%89%E7%85%A7%E5%BA%A6/2651022?fr=aladdin
光照度,可简称照度,其计量单位的名称为“勒克斯”,简称“勒”,单位符号为“lx”,表示被摄主体表面单位面积上受到的光通量。1勒克斯等于1流明/平方米,即被摄主体每平方米的面积上,受距离一米、发光强度为1坎德垃的光源,垂直照射的光通量。光照度是衡量拍摄环境的一个重要指标。
仅看点光源产生的能量,则辐照度是呈1/r^2^衰减的
4.辐射亮度 (Radiance) P15 18:20
引入
亮度是描述光在环境中的分布的基本场量
辐射亮度是与光线有关的量
渲染是关于计算亮度的
定义:亮度(luminance)是一个单位立体角,单位投影面积表面发射、反射、传播或接收的通量
- 通俗理解:单位时间,单位立体角,单位投影面积上的能量
单位:nit,尼特是亮度的单位,1nit=1 cd/m²
上图dφ不是平方,而是二阶微分
不难发现L不是一成不变的,会随着位置和立体角变化而变化。
不同角度理解辐射亮度
以辐照度(接收)对立体角微分为例
- 分母移项到左边,更好理解
以辐射强度(发射)对单位面积微分为例
- 分母移项到左边,更好理解
ChatGPT-辐射亮度
各种结物理量小结(含小结)
可参考 后续物理量概述(含小结)
Radiant xxx:
- Flux:辐射通量,单位时间内的能量
- 单位:流明,lumen,lm
- Intensity:辐射强度,单位时间,单位立体角发射的能量
- 单位:坎,坎德拉,candela,cd
- Irradiance:辐照度,单位时间,单位投影面积接收的能量(相当于Radiance的积分)
- 单位:勒,勒克斯,lux,lx
- Radiance:辐射亮度,单位时间,单位立体角,单位投影面积发射、反射、传播或接收的能量(相当于Irradiance的微分)
- 单位:尼特,nit(1nit=1 cd/m²)
立体角:w(读作Ω)
- 单位:球面度,steradian,sr
辐照度 VS 辐射亮度 P15 26:15
- 辐照度(Irradiance)和辐射亮度(Radiance)区别:前者不考虑方向,后者考虑方向
2.BRDF P15 29:00
英文:BRDF,Bidirectional Reflectance Distribution Function
中文:双向反射分布函数
反射建模
BRDF定义:任何一个==出射==方向的Radiance占该单位面积==入射==Irradiance的==比例==
通俗理解:以下默认为单位时间
- 第一阶段:可以先想象来自半球面所有方向的入射光线(Radiance)对该单位面积(或点)进行积分(Irradiance)得到该单位面积的总能量(dE);
- 第二阶段:将第一阶段得到的总能量反射给各个方向(dL
r)
反射等式
递归等式
- 每一个入射光线经过BRDF反射后又会产生新的入射光线
3.渲染方程 P15 42:00
理解渲染方程* 46:55
单一点光源
多个点光源(和的形式)
面光源:点光源的积分(积分的形式)
反射光源:其他物体反射或来自光源的光线作为入射光线
渲染方程写成积分方程
翻译:Fredholm积分方程的第二类[广泛研究的数值]与标准形式
化简写成算子(不太理解!!!)
可以离散为一个简单的矩阵方程
[或线性方程组联立](L, E为向量,K为光传输矩阵)
L出射:该物体(或者说该点,后面略)反射出的总能量
E:物体自发光
KL出射:来自其他物体入射并由BRDF反射的能量
光线追踪和全局光照引入 56:30
全局光照:所有反射光线累加起来的结果(直接光 + n次间接光)
光栅化内容
光线追踪演示
- 最终会收敛到一定亮度(根据能量守恒)
直接光照(相当于弹射一次)
直接光 + n次间接光
- 玻璃球内会弹射多次,因此灯的地方在弹射次数少时可能是黑的
4.概率论回顾 P15 65:45
随机变量及其分布
X:随机变量值
X~p(x):取某个X值的概率使p(x)
性质
取任何值的概率 >= 0
所有概率累加在一起为1
期望
概率密度函数
函数的期望:本质就是 函数值 * 概率 做积分
5.蒙特卡洛积分 P16 9:00
英文:Monte Carlo Integration
引入
问题:有时无法很好表示函数,对函数直接求定积分很困难
解决办法:随机采样函数值,对其积分(算面积),累加结果求平均得到近似数值解(连续 –概率–> 离散)
本质:对定积分结果的近似
定义
均匀分布的概率密度函数
均匀分布的蒙特卡洛积分
蒙特卡洛积分的一般形式!
6.路径追踪 P16 20:35
英文:Path Tracing
介绍
Whitted-style ray tracing:
始终执行镜面反射/折射
在漫反射表面停止弹跳
这些简化合理吗?
进阶:让我们逐步改进whited - style光线跟踪,并引导我们的路径跟踪算法!
Whitted-Style光线追踪问题1:对于Glossy材质还沿着镜面方向反射是不对的
Whitted-Styly光线追踪问题2 - 光线射到漫反射表面停止,接受不到其他物体的漫反射作为间接光
Whitted-Style光线追踪是错误的,但是渲染方程是正确的
待解决的问题:
- 半球面的积分
- 来自于其他半球的积分(递归)
简单的蒙特卡洛解决方案 31:05
整体思路:
- 从每一个像素发射N条光线,如果光线打到物体表面p点,则计算p点的着色。
- 在p点随机朝外发射一条光线,方向为w
i,如果打到光源就计算来自光源的着色,如果打到物体,就计算来自物体的着色(递归计算) - 在该像素处对N条光线的结果取平均
考虑表面上一点p
使用蒙特卡洛积分近似对半球表面的定积分
直接光伪代码 38:10
目的:取表面上某一点p计算其反射给w0方向的Radiance
大致流程:
- 在p所在的半球上随机取若干个入射方向w
i(记作pi点) - 利用蒙特卡洛积分,近似计算各种直接光源从pi点入射并由BRDF反射的Radiance(辐射亮度)的总和
加入:间接光 40:35
相当于从P点出发看Q点的直接光
带缺陷的全局光照伪代码
大致流程:
- 在直接光的基础上进行改进,如果入射方向出发打到的不是光源而是其他物体,就继续递归计算被击物体Q点到该方向的Radiance
缺陷:发射光线的数量呈指数级增长
改进:使用一根光线
路径追踪大致代码(仍有缺陷,递归结束条件有问题,后面会改进)
路径追踪:每次每个着色点只发射一根光线
加入:产生光线
本质:从相机位置朝不同像素发射光线,在每个像素内随机取方向发射光线,打到不同物体的表面(如果打到,定义成p点),从而计算该方向上物体反射的Radiance
光线生成伪代码
改进:间接光(RR思想)
RR:Russian Roulette,俄罗斯轮盘赌
路径追踪问题:递归结束条件不明
本质:利用概率的期望去近似无限次弹射的结果
以一定概率p选择是否从p点发射光线,如果发射,那么把结果再除以概率p;如果不发射,直接返回0。最终会发现期望就是L
0
RR伪代码
改进:直接采样光源
问题:如果光源很小,可能永远也无法打到光源,因此直接对光源进行采样计算直接光
物体微小表面一点p上,对立体角的积分 =改写成=> 在光源上,对微小面积的积分(类似换元的思想)
蒙特卡罗方法允许任何采样方法,因此我们可以对光线进行采样(因此没有光线被“浪费”)
dA和dw关系:光源微表面对半球微表面的投影
- 考虑立体角与光源的夹角(分子 cos θ^’^)
- 考虑光线衰减(分母)
蒙特卡洛采样光源
pdf:1/A
整合:路径追踪 + 蒙特卡洛 70:15
整体思路:
- 从每一个像素发射N条光线,如果光线打到物体表面p点,则计算p点的着色。
- 在p点随机朝外发射一条光线,方向为w
i,分别计算直接光(来自光源)和间接光(来自其他物体)的着色,并加和- 对于直接光:直接采样光源,对光源积分。如果有遮挡再判断一下遮挡情况
- 对于间接光:使用俄罗斯轮盘赌朝随机方向发射光线。直到赌到0终止
- 在该像素处对N条光线的结果取平均
细节修复:光线被阻挡则为0
课后杂谈 75:50
早期RayTracing:Whitted-Style光线追踪
现代RayTracing:所有光线传播方法的大集合
课程未涉及
- 如何在半球表面相对均匀的采样,即如何定义随机的光源入射方向(光路可逆,也可以理解成如何从p点出发采样间接光的光源)
- 除了均匀分布,不同的pdf
- 随机数是否随机
- 结合不同采样方法
- 像素颜色一定是各种反射光线的Radiance吗?可不可有不同权重?
- 得到的是Radiance(辐射亮度),不是颜色,需要通过gamma校正
- HDR图,颜色空间是什么?
- ……
补充:Ray Tracing和Path Tracing的区别
光线投射(Ray Casting ),光线追踪(Ray Tracing),路径追踪(Path Tracing)的区别:https://blog.csdn.net/weixin_45019478/article/details/105369278
Ch7.材质和外观 P17
什么是图形学中的材质?
7.1 材质==BRDF
BSDF(散射) = BRDF(反射) + BTDF(折射)
S:scattering
T:transmit
R:reflection
漫反射材质 10:50
漫反射项
假设:所有入射光和反射光是均匀的(Li是常数),物体该点不吸收能量(纯白色)
根据能量守恒,反射的能量 == 入射的能量
- 入射Irradiance == 出射Irradiance
- 入射Radiance == 出射Radiance
反射率Albedo:可以是1维,3维(控制不同通道),0~1之间
BRDF:常数,在一般情况下使
1 / π
(这里因为是漫反射,因此增加了一个漫反射系数)推导:cosθ 对半球积分,θ ∈ (0, π / 2);$ \phi $ ∈ (0, 2π)
高光材质 16:00
理想反射/折射材质 17:05
反射 19:05
推导1.根据平行四边形法则(左图)
推导2.入射和出射方向的方位角相反
θ:仰角,与法线方向的夹角(竖的夹角,就是高数书本球面坐标系的φ)
φ:方位角,与法线在xoy平面的夹角(横的夹角,高数书本的θ)
所以根据反射原理得
- 出射仰角 = 入射仰角(θ = θ
o= θi) - 方位角相差一个π(φ
o= (φi+ π) mod 2π)
折射 25:00
不同介质有不同折射率,但是折射前后,不同折射率乘sinθ的值相等
- 折射率越大,sin(θ)就越小,θ就越小
折射角余弦的计算
- 当入射折射率 > 反射折射率,会发生全反射(即无出射光)
折射:BTDF
反射 + 折射:BSDF
菲涅尔项 35:20
菲涅尔现象:与法线垂直地方会发生大量反射,与法线平行的地方发生折射(如下图是折射率为1.5的绝缘体)
- 绝缘体
- S和P是极化现象(不需要了解)
- 导体(折射率是负数)
菲涅尔公式
7.2 微表面材质 43:20
英文:Microfacet Material
- 远看,表面近似光滑
微表面理论
macrosurface:平面(远处看,平坦粗糙,同法线)
microsurface:微表面(近处看,凹凸不平的镜面反射,不同法线)
微表面BRDF
光滑:glossy,微表面法线相对集中(朝上)
- 镜面反射:完全朝上
粗糙:微表面法线相对随机,漫反射
F:菲涅尔反射项
G:边缘修正项(当光线贴着边缘入射时,微表面之间可能会存在遮挡关系)
D:表示微表面的法线分布(例如给定半程向量h,整个表面有多少法线和h接近,如果多则值就大,表面越光滑)
举例 55:00
各项同性/异性材质 57:30
英文:Isotropic / Anisotropic Materials (BRDFs)
各项异性BRDF
各项异性BRDF:方位角旋转后的入射到出射方向得到结果不一致
BRDF的性质 66:05
非负性和线性
可逆性原则和能量守恒(完全反射的情况下就是1)
各项同性和各项异性的BRDF
- 各向同性性质
- 可逆性原则
7.3 测量BRDF 71:25
动机
避免开发/派生模型的需要
- 自动包含所有的散射效应
能否准确渲染真实世界的材料
- 适用于产品设计,特效,…
理论 vs. 实际
简单测量算法
表示BRDF 76:30
每个材质测量 90 x 90 x 180 个数据
Ch8.渲染进阶 P18
8.1 高级光线传播 3:40
内容总览
- 无偏光线传播
- 有偏光线传播
- 实时辐射度
有偏vs.无偏蒙特卡洛积分
双向路径追踪(BDPT, 无偏)7:05
适合:场景以间接光为主的采用双向路径追踪效果好
本质:光源和相机打出许多射线(light sub-paths 半路径),形成连线
Metropolis光线传播(MLT, 无偏) 11:00
核心:马尔科夫链的蒙特卡洛积分(去随机性,不再是均匀分布)
本质:在一个path周围找其他path
适合:复杂场景的光线追踪
- 缺点:不知道收敛时机,图很脏
光子映射(有偏)20:00
caustics:焦散线(适合翻译成焦线,因为没有发散)
步骤:
- 从光源出发,四面八方发射大量光子,直到打到漫反射物体上
- 从视角出发,四面八方发射大量路径,直到打到漫反射物体上
局部密度估计
- 摄像机射线打到物体表面后,在周围找光子,并除以面积(得到密度),得到该点能量(类似KNN)
缺点:太少光子噪声大,即使光子数多,依旧容易糊(毕竟是局部平均值嘛,除非无穷多个光子,取无限小的dA)
有偏:模糊
一致:光子足够多就不模糊
顶点连接与合并(VCM,有偏) 30:20
英文:Vertex Connection and Merging
双向路径追踪(BDPT)和光子映射(Photon Mapping)的结合
实时辐射度(IR)31:55
别名:Many Light算法
本质:已经被照亮的表面可以当做是光源再照亮别人
8.2 高级外观模型 37:30
内容总览
非表面化模型 38:40
散射介质
举例:雾、云
当光通过参与介质时,它可以(部分)被吸收和散射
由Phase Function(相位函数)规定光线如何散射
头发材质
近似
更真实:把头发想象成玻璃
Double Cylinder Model
颗粒材质 58:15
举例:沙子
表面模型 60:05
半透明散射材质
英文:Translucent Material
别名:次表面散射
举例:玉石、水母
次表面散射(BSSRDF)和BRDF区别:不在是一个点接受光线并反射,而可能从其他地方反射出去
SS:Sub-Surface Scattering
将次表面散射的光线近似成新的光源
布料 68:30
组成:一系列缠绕的纤维
Fibers:纤维
Ply:股(由纤维缠绕构成)
Yarn:线(由股缠绕构成)
当成物体表面
当成散射介质(空间中的体积)
当成实际纤维
细节材质 74:40
结果过于完美,很假
实际应该不完美,更真实
法线体现细节
渲染很久很困难
原因:从相机发射的光线很难通过反射的方式打到光源
解决办法:一个像素打出很多光线,覆盖很多微表面
根据覆盖范围,有以下现象:范围越小越有特点
程序化外观 87:10
英文:Procedural Appearance
纹理定义在空间中,需要时去找
Ch9.相机,棱镜和光场 P19
Camera,Lenses and Light Field
棱镜改口为透镜
9.1 相机 5:45
针孔相机
快门
传感器:传感器上的点记录的是Irradiance
视场 FOV 12:40
英文:Field of View
Sensor:感光原件最终接收光线的平面
固定Sensor大小:
- 左图:焦距(Focal length)大,视场小
- 右图:焦距小,视场大
默认传感器是35mm,通过定义焦距的方式定义FOV(即默认传感器固定)
焦距越大,视场越小
传感器越大,视场越大
传感器和焦距同时变小可以摆出尺寸想当的图,但分辨率更低
曝光 Exposure 21:50
time:由快门时间控制
irradiance:由场景和光圈控制
摄影中的曝光控制
Aperture size:光圈大小
- 通过打开/关闭光圈来改变f光圈(如果相机有光圈控制)
Shutter speed:快门速度
- 改变传感器像素集成光的持续时间
ISO gain:感光度(可以理解成后期处理)
- 在传感器值和数字图像值之间改变放大(模拟和/或数字)
补充:光圈F数的
,
相当于.
(即小数点)
ISO 32:20
通俗解释 ISO:往比较暗的图乘上一个数(线性增大),增大亮度同时也会增大噪声,一般用于微调
光圈:F数
英文F-Number(F-Stop):Exposure Levels
N:F数具体数值大小,可以理解为光圈 1 / 直径
(N越小,光圈越大)
- 实际 N = f / A (f:焦距,A:光圈直径)
快门
快门时间越长,在快门打开时刻接受的信息容易不一致,从而经传感器平均后会产生运动模糊
快门时间越短,不容易产生运动模糊,但会导致亮度越低
运动模糊不一定是坏处(更加有冲击感)
果冻效应:拍摄高速移动的物体,可能会发生扭曲
URL:https://baike.baidu.com/item/%E6%9E%9C%E5%86%BB%E6%95%88%E5%BA%94/4763603?fr=aladdin
补充:如上图的螺旋桨
综合考虑 42:55
等价曝光度
调小光圈并非等价增大快门,还需考虑额外因素
- F数:控制景深
- 快门:控制模糊
摄影中的快和慢 45:15
高速摄影
延时摄影(有种拉丝感)
- 用特别长的曝光时间,小光圈
9.2 棱镜
薄棱镜近似 48:10
性质:==平行光==经过棱镜一定过==焦点==,光路可逆,反之成立
现实生活中,棱镜的焦距可以改(底层就是棱镜的==组合==)
薄棱镜等式(理想)
穿过棱镜前后:平行光过焦点,过焦点平行光。穿过中心的光方向不变
zo:物距(透镜到物体平面的距离)
f:焦距
zi:像距
推导
散焦模糊 56:50
英文:Defocus Blur
Coc:模糊圈
zo:物距
f:焦距
zi:像距
zs:Sensor距离
补充:Coc与光圈的大小成比例
D:光圈大小
f:焦距
N:F数
F数:焦距f / 光圈直径A
补充:f是焦距,N是F数
薄棱镜下的理想光线追踪 64:30
英文:Ray Tracing Ideal Thin Lenses
景深 69:15
Depth of Field
景深:成像清晰的一段范围(指物距)
实际使用中只需记住:光圈越小,越接近小孔成像模型,结果会越清晰即可
光场 P20 10:00
Light Field / Lumigraph
全光函数(The Plenoptic Function):看到的整个世界都可以用该函数表示
- θ、φ:仰角和方位角(表示三维空间中任意方向)
- $\lambda$:波长,表示不同光颜色
- t:时间
- V
x、Vy、Vz:表示任何一个位置
三维空间中的任意一条光线
用4维向量定义
使用两个平面上的点定义光场
- 两个平面各取一个点得到一个方向(记录所有可能的组合)
补充:图(b)理解成同一个像素的Irradiance展开成各种Radiance
分光:将不同方向的光分开
光场照相机 34:35
可以先拍照再调焦距!
在各个圆内部还记录方向信息
- 感光元件后移,原来的一个像素(图中黄色椭圆)现在是一块圆形区域(后移的感光元件)
广场照相机的不足:分辨率不足(原来的1个像素要更多像素来记录其他信息,导致分辨率低);成本高;计算复杂
9.3 颜色与感知 P20
颜色 48:30
光谱
不同波长的光对应不同的折射率
谱功率密度 SPD:描述不同光源的光在任何波长的能量分布是多少
SPD线性性质
- 可加性
什么是颜色?
- 颜色是人感知的结果
感知 54:30
瞳孔:类似光圈
晶状体:类似透镜
视网膜:感知
感光细胞
Rod cells:棒状细胞,感知光线强度
Cone cells:锥形细胞,感知光的颜色,内分有三种(S、M、L)
- S:感知短波长(高频)
- M:感知中间波长
- L:感知长波长
cone cells分类:S、M、L
不同人这三种细胞的分布有差异
颜色三刺激理论 59:35
Tristimulus Theory of Color
本质:人眼最终看到的是==三个数==(分别是三种颜色和强度的积分,也就是不同种类锥形细胞感光的期望)
同色异谱 62:25
Metamerism
不同光源光谱不一样,但是通过调节可以使得颜色一样
左边:照片拍摄
右边:显示器显示
颜色匹配 64:20
Color Reproduction / Matching
- 计算机使用加色系统(区别于画画的减色系统),混合之后越来越亮
颜色混合
- RGB混合最下面的?颜色
结果:一个匹配函数。给定一个波长,混合三个颜色即可得到?色该波长下的分布(画一条竖线)
颜色空间 72:00
补充:Y只控制亮度,因此一般固定Y(把Y当成常数)。这样取x,y(x,y是关于X,Z的函数,z = 1-x-y)就可以得到最终颜色
色域
感知组织的颜色空间 80:00
Perceptually Organized Color Spaces
HSV
CIELAB
CMYK(减色系统,不同颜色会越混越黑)
- 黑色便宜
Ch10.动画 P21
历史、关键帧动画、物理模拟、骨骼、绑定
- 模拟和渲染是分开的!该章只谈模拟,不谈渲染!
10.1 介绍 5:40
历史 8:45 暂略
关键帧动画 16:30
Keyframe Animation
10.2 物理仿真 21:00
质点弹簧系统 25:30
Mass Spring System
质点弹簧系统:一系列相互连接的质点和弹簧
假设初始状态下a、b重合(理想)
假设初始状态a、b间距为l(实际,但没有考虑能量损失)
引入摩擦力:上图能量守恒,永远不停
物理仿真中的导数(此处用·
表示导数)
引入能量损失,但是会导致运动的物体停下
- 问题:AB一起运动,弹簧内部本身没有拉伸,但是却受到阻力
弹簧内部阻力(和弹簧长度无关,只和a、b相对速度有关)
红框部分为投影到ab方向的相对速度值(考虑圆周运动时不会有能量损耗)
弹簧的组合
质点弹簧系统组成布料
抵抗切变的力
抵抗弯折(非平面)的力
有限元系统:力可以传导
10.3 粒子系统 49:30
Particle Systems
粒子动画过程
粒子之间作用力
ODE 模拟群体行为
10.4 运动学 59:45
正向运动学:实现容易,使用不易
逆向运动学:实现不易,使用容易
逆运动学问题
逆运动学优化
- 优化问题解法:梯度下降法
10.5 绑定 68:20
Rigging
Blend Shapes
本质:混合控制点,进而混合不同形状
动作捕捉 73:00
光学动捕(应用最广泛)
控制点追踪
面部动画
电影生产流水线 81:00
10.6 如何实现 P22
1.单个粒子模拟 5:10
使用速度场
常微分方程
欧拉方法
- 稳定性差
误差:步长过大,易产生不精确
稳定性差:例如无法圆周运动
问题
数值解法面对的两个问题:误差和不稳定
解决不稳定的方法 18:00
中点法
中点法思路:先用△t走到a点,取中点速度,利用中点的速度重新从起点出发,走△t得到c点
中点法:对距离中点求速度作为平均速度
修改欧拉:对速度直接求平均作为平均速度
自适应步长法
思想:减少△t,如果减少前后位置差距不大就不再分,否则就多次使用欧拉法
隐式欧拉方法* 1阶
思想:用==下一刻==的速度和加速度计算
提问:老师没有讲下一时刻的加速度具体怎么算。。
隐式欧拉是1阶的(随δt减小,误差减小的比例,阶数越高越好)
龙格库塔方法 4阶 33:05
适合解常微分方程(ODE)
==最常用==:四阶龙格库塔方法
扩展课程:数值分析
非基于物理的方法* 37:30
2.刚体的模拟 40:00
Rigid Body Simulation
3.流体模拟 42:30
Fluid Simulation
分析:
- 假设水体是由许多不可压缩的刚体小球组成
- 给出任何一个时刻t,都可以知道任何位置的密度,参考原密度进行修正(使用梯度下降)
拉格朗日方法 Vs. 欧拉方法
拉格朗日方法(质点法):知道每个质点的运动
欧拉方法(网格法):知道每个网格内的运动(对流体来说就是把空间拆分成很多网格,计算内部密度)
混合方法 MPM
完结撒花!