《GAMES101-现代计算机图形学入门》学习笔记
图形学和计算机视觉
计算机视觉:从图片到模型
图形学:从模型到图片
- 3d怎么投影到2d
- 仿真
- 曲线生成
- 光栅化
地址:www.bilibili.com/video/BV1X7411F744
线代
A^T: 转置
向量的点乘:两向量长度,乘cos夹角,方向为两者之和。在图形学中通常用来算夹角
向量的叉乘:两向量长度,乘sin夹角,方向和两向量所在平面垂直。可以用来判断左右关系、点和三角形的内外关系(算三角形包裹几个像素)等
a × b = (ya*zb-yb*za, za*xb-xa*zb, xa*yb-ya*xb)
a × b = -b × a
右手定则:从a绕道b,大拇指方向为叉乘方向
矩阵
用于图形学的:移动、旋转、缩放、错切、切变
性质:
- 没有交换律
- 有结合律和分配率
矩阵的转置:
i行j列 -> j行1列
(A * B)^T = B^T * A^T
矩阵的逆:
A*A^-1 = I(单位矩阵)
(A * B)^-1 = B^-1 * A^-1
伴随矩阵:a和b叉乘的矩阵形式
模型变换
model
非齐次坐标
缩放矩阵:x缩放sx倍率,y缩放sy倍率
\(\begin{bmatrix}
sx & 0 \\
0 & sy \\
\end{bmatrix}\)
切变矩阵: y轴右拉a距离
\(\begin{bmatrix}
1 & a \\
0 & 1 \\
\end{bmatrix}\)
旋转矩阵:默认逆旋转,逆旋转x度
\(\begin{bmatrix}
cosx & -sinx \\
sinx & cosx \\
\end{bmatrix}\)
平移变化:非线性变换,因此无法表示
齐次坐标
因为平移变换无法用同阶矩阵表示,因此升维处理。即齐次坐标
齐次坐标中 (x, y, w) = (x/w, y/w, 1)
齐次坐标的点:
\(\begin{bmatrix}
x \\
y \\
1 \\
\end{bmatrix}\)
齐次坐标的向量:
\(\begin{bmatrix}
x \\
y \\
0 \\
\end{bmatrix}\)
点和向量 1和0 不同的原因:确保向量平移后是不变的
vec + vec = vec
pot - pot = vec
pot + vec = pot
pot + pot = pot / 2(中点)
平移变化:
\(\begin{bmatrix}
1 & 0 & tx \\
0 & 1 & ty \\
0 & 0 & 1 \\
\end{bmatrix}\)
仿射变换 = 线性变换 + 平移变换:
最后一行是 (0, 0, 1)
\(\begin{bmatrix}
a & b & tx \\
c & d & ty \\
0 & 0 & 1 \\
\end{bmatrix}\)
逆变换
目标点乘逆矩阵即可
旋转矩阵的逆,就是旋转矩阵的转置。这种矩阵被称作正交矩阵
变换顺序
先线性变化,再平移
根本原因是矩阵不满足交换率,不同的操作顺序会影响结果
过原点轴旋转
罗德里格斯(Rodrigues)旋转方程:
其中n表示过原点的轴的矩阵,I表示单位矩阵
非原点旋转
先把目标点移动到原点(T(-c)),经过旋转后,再移回去(T(c))。最终结果T(c)*R(a)*T(-c)
任意轴旋转
先得到一个交于原点的旋转轴和旋转角度,得到了之后只需要根据轴角公式旋转即可
三维空间的旋转
分别绕着三条坐标系旋转(原则:绕谁谁不变)
Rx(a) =
\(\begin{bmatrix}
1 & 0 & 0 & 0 \\
0 & cosa & -sina & 0 \\
0 & sina & cosa & 0\\
0 & 0 & 0 & 1\\
\end{bmatrix}\)
Ry(a) =
\(\begin{bmatrix}
cosa & 0 & sina & 0 \\
0 & 1 & 0 & 0 \\
-sina & 0 & cosa & 0\\
0 & 0 & 0 & 1\\
\end{bmatrix}\)
Rz(a) =
\(\begin{bmatrix}
cosa & -sina & 0 & 0 \\
sina & cosa & 0 & 0 \\
0 & 0 & 1 & 0\\
0 & 0 & 0 & 1\\
\end{bmatrix}\)
四元数
四元数可以表示为x = a + bi + cj + dk,其中包含i,j,k三个虚部
优点:
- 可以避免万向节锁现象;
- 只需要一个4维的四元数就可以执行绕任意过原点的向量的旋转,方便快捷,在某些实现下比旋转矩阵效率更高;
- 可以提供平滑插值;
缺点:
- 比欧拉旋转稍微复杂了一点点,因为多了一个维度;
- 理解更困难,不直观;
对比欧拉旋转的问题:
优点:
- 很容易理解,形象直观;
- 表示更方便,只需要3个值(分别对应x、y、z轴的旋转角度);但按我的理解,它还是转换到了3个3*3的矩阵做变换,效率不如四元数;
缺点:
- 之前提到过这种方法是要按照一个固定的坐标轴的顺序旋转的,因此不同的顺序会造成不同的结果;
- 会造成万向节锁(Gimbal Lock)的现象。这种现象的发生就是由于上述固定坐标轴旋转顺序造成的。理论上,欧拉旋转可以靠这种顺序让一个物体指到任何一个想要的方向,但如果在旋转中不幸让某些坐标轴重合了就会发生万向节锁,这时就会丢失一个方向上的旋转能力,也就是说在这种状态下我们无论怎么旋转(当然还是要原先的顺序)都不可能得到某些想要的旋转效果,除非我们打破原先的旋转顺序或者同时旋转3个坐标轴。
- 由于万向节锁的存在,欧拉旋转无法实现球面平滑插值;
视图变换
view
定义一个相机:
- 相机的位置:e
- 相机拍摄的方向:g
- 相机向上的方向(用来确认相机的旋转角):t
相机原点
默认相机在原点的位置,朝向-z,垂直y
移动方式就是把上面的egt分别乘以移动矩阵:g to -z, t to y, (g × t) to x
结果:
R(view) = \(\begin{bmatrix}
x(g×t) & y(g×t) & z(g×t) & 0 \\
x(t) & y(t) & z(t) & 0 \\
x(-g) & y(-g) & z(-g) & 0\\
0 & 0 & 0 & 1\\
\end{bmatrix}\)
正交投影到透视投影
\(\begin{bmatrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf\\ 0 & 0 & 1 & 0\\ \end{bmatrix}\)
投影变换
projection
- 正交投影
- 透视投影
透视投影 R(pers) = \(\begin{bmatrix} \frac{2N}{r-l} & 0 & \frac{r+l}{r-l} & 0 \\ 0 & \frac{2N}{t-b} & \frac{t+b}{t-b} & 0 \\ 0 & 0 & \frac{F+N}{F-N} & \frac{2NF}{F-N}\\ 0 & 0 & -1 & 0\\ \end{bmatrix}\)
光栅化
把模型数据,转换成像素数据
可视角度
fovY:垂直距离可视角度
tan(fovY / 2) = t / |n| (t为可视高度,n为相机距离)
采样
如何判断一个像素是亮还是不亮,则看像素点是否在三角形内,用点和向量的叉积判断
采样中的artifacts
- 锯齿
- 摩尔纹
- 车轮倒转
本质原因是:信号的变化过快,采样的速度跟不上。再根本的原因是,同一个采样频率可能会无法区分两种不同频率的信号
图片时域和频域变换
- 白色表示剧烈变换的信息。越靠近中心点表示越低频
- 横竖两条表现出现的原因:分析边界点的时候,是以图片另一边的点,来判断变换频率的。通常图片两边对不上,所以会出现非常强烈的变化,表现在图像上,就是两条无限长的线
时域的卷积 = 频域的乘积
抗锯齿算法
antialias
- MSAA:多重采样,然后得出模糊后的结果,再采样
- FXAA(Fast Approximate AA)
- TAA(Temporal AA)
超分辨率
- DLSS(Deep Learning Super Sampling)
成像
- 画家算法(nlogn): 先绘制最远的物体,再绘制近处的物体。但是无法解决两两互相覆盖的情况。
- 深度缓存算法: 存储每个像素点的深度。用framebuffer存储颜色信息,用zbuffer存z信息
shadow mapping
- 硬阴影:点光源产生的边角很明显的阴影
- 软阴影:体积光源产生的边角比较模糊的阴影
光线记录离自己最近的z值,然后用眼睛看到的点的z值和之前记录的光线的z值比较,如果相等,说明能够看到。
缺点:会产生走样。因为相等的判断有误差
着色(shading)
定义:对不同物体应用不同材质。不同材质对光线的作用是不同的
Blinn-Phong反射模型
物体的光 = 环境光 + 漫反射 + 镜面反射
L = La + Ld + Ls
漫反射
- lambert's cosine law: 亮度的百分比,和cos(光线和法线的夹角)成正比
- 光衰减: 光的强度和距离的平方成反比
由上面两个定义推出lambertian漫反射着色公式
:
Ld = kd (I/r^2)max(0, n·l)
其中ld是漫反射光强度,kd是漫反射系数,I是点光源光强,r是点光源到物体表面的距离,n是物体表面法线,l是入射光矢量
镜面反射
半程向量:视角和光线向量的角平分线
h = v + l / ||v + l||
得出镜面反射公式:
Ls = ks(I/r^2)max(0, n·h)^p
其中h是半程向量,p是用来控制高光范围的
环境光
这里假设环境光是一个常数
La = kaIa
着色频率
- 平面shading: 对面做着色
- 高洛德(gouraud)shading:对点做着色,然后三角形内做插值
- phong shading: 对上面的插值的每个像素做着色
顶点的法线计算方式:相连的所有面的法线相加(也可以改成加权平均,比如按照面积来算权值)
Nv = ∑iNi / ||∑iNi||
三角形插值
重心坐标(α, β, γ): 三角形ABC所在平面中的任意一个点,满足以下公式
(x, y) = αA + βB + γC
α + β + γ = 1
如果点在三角形内,则α β γ都非负
计算方式:
α = Aa / (Aa + Ab + Ac)
β = Ab / (Aa + Ab + Ac)
γ = Ac / (Aa + Ab + Ac)
A表示面积。点和三角形三点相连之后会出现三个三角形,Aa就是A这个点对面的那个三角形面积
note: 重心坐标在三维空间中的投影位置会发生变化,所以在投影时,先计算三维空间中的插值,再计算投影结果
三角形重心的重心坐标
(α, β, γ) = (1/3, 1/3, 1/3)
(x, y) = A/3 + B/3 + C/3
即时渲染管线
顶点数据(建模)->三角形(几何处理)->像素(光栅化)->着色像素(着色处理)->拼接+输出
纹理映射
UV坐标: 类似x和y,范围是0-1
双线性插值
当屏幕分辨率很高,但是纹理分辨率很低时,会出现纹理一格一格显示的情况(原因是四舍五入取纹理)
因此引入双线性插值
,用于平滑过渡低分辨率纹理中非整数坐标的取值
双线性插值:去临近四个texel(纹理像素),取对应位置的加权平均值
- 插值定义
- lerp(x, v0, v1) = v0 + x(v1 - v0)
- 双插值
- u0 = lerp(s, u00, u10)
u1 = lerp(s, u01, u11)
u00左下,u10右下,u01左上,u11左下 - 最终插值
- f(x, y) = lerp(t, u0, u1)
mipmap
当屏幕分辨率很低,但是纹理分辨率很高时,因为一个像素覆盖多个纹理,会导致走样现象
因此引入mipmap
,用于查询纹理范围内的均值
- mipmap
- 类似线段树一样,预存储低分辨率纹理的结果。前提:只能求类似正方形。
然后根据像素在纹理上的步长,算出覆盖纹理的近似正方形的边长L。然后在对应的D=log2L
层找到结果。
但是这里有个问题,就是如果出现一部分像素在a层,一部分像素在b层,可能会因为纹理不连续导致出现图像断层。
为了解决这个问题,引入三线性插值
。
- 三线性插值
- 现在a层做双线性插值,再在b层做双线性插值,最后两个结果再做双线性插值
- 各向在·异性过滤
- 是为了解决mipmap处理长条形的采样纹理出现的过渡模糊的问题。注意:只能解决矩形,无法解决斜着的矩形。
- EWA过滤
- 能够处理不规则图形
纹理
- cube map
- 球体每个点的法线,映射到包围盒上,产生的纹理方块
- 凹凸贴图
- 纹理上定义每个点的“假”的法线,然后着色后,会得到有凹凸感的物体,欺骗眼镜。实际上几何形体不变
- 法线贴图
- 不改变几何形体的基础上,扰动物体表面的法线
- 位移贴图
- 会真的移动几何形体的顶点。这种贴图要求形体三角形的间隔频率超过纹理频率
- 漫反射贴图
- 漫反射贴图表现了什么? 列举一下,物体的固有色以及纹理,贴图上的光影。通过颜色和明暗来绘制一幅漫反射贴图
- 曲面细分
- 根据需要来细分三角形
- 平面上点的法线计算
- n = (-dp/du, -dp/dv, 1)。前者是u方向上的偏导数,后者是v方向上的偏导数。
- dp/du = c1 * [h(u+1) / h(u)]
- dp/dv = c2 * [h(v+1) / h(v)]
其中,上面的h是纹理变化后的曲线
几何
- 隐式表示
- 用表达式表示一个几何,而非三角形。f(x,y,z) = 0,满足此表达式的所有点,表示一个几何
- 优点是方便判断点和几何的位置,缺点是不明显
- 显示表示
- (u, v) -> (x, y, z)。平面中的每个点对应空间中的一个点
- 优点是明显,缺点是不方便判断点和几何的位置
- SDF
- 用距离函数表示点到不同物体的距离,然后相加之后,再做恢复。这个过程叫做blend
- 分型
- 图像递归(套娃)
显示表示
方法:
- 点云
- 多边形面
贝塞尔曲线
- 德卡斯特里奥算法
- 假设一个[0, 1]区间内的时间t,在每个线段上,找到t位置的点,两两连接之后,递归找t位置的点和连接,最后只会剩下一个点,就是这个曲线上时间t的点
n阶贝塞尔曲线点计算公式:
其中 \(B^n_j(t)\) 为伯恩斯坦多项式(二项式展开)
性质:
- 仿射变换后不变
- 曲线一定在控制点的凸包内
逐段贝塞尔曲线
通常用每四个控制点决定一段曲线
\(C_0\)连续:前一段曲线的终点 = 后一段曲线的起点
\(C_1\)连续:前一段最后一个线段的长度 = 后一段第一个线段的长度
B样条曲线
比起逐段贝塞尔曲线,更注重修改时的局部性。
网格操作
- 网格细分
- 网格简化
- 网格规整化
网格细分
先做细分,再做调整
loop细分
前提:只有三角形网格能用
细分
每条边取中点,然后相连
调整
中点计算: 3/8(A+B) + 1/8(C+D)
其中AB是中点所在线的顶点,CD是所在四边形另两个顶点
顶点计算:(1 - n * u) * ori_pos + u * neighbor_pos_sum
其中n是顶点的度,u的计算方法:
if (n == 3)
return 3/16;
else
return 3/(8*n);
Catmull-Clark细分
优势:更容易处理四边形面
- 歧义点
- 度不为4的点
细分
细分方法:每条边取中点,面里面选取中点,然后面的中点和边的中点相连
细分后的两个特性:
- 每有一个非四边形面,会增加一个歧义点
- 细分后,全部变成四边形面
- 后续再细分,将不会增加歧义点
调整
面的中点: f = 面的顶点和 / 顶点数
边的中点:e = (两顶点和 + 相邻两面中点f之和) / 4
原来的点的调整:p' = (相邻四面中点和 + 2 * 相邻四边中点和 + 4 * p) / 16
网格简化
边坍缩
二次误差度量:新的点,到原来所有点的距离的平方和最小
流程:
- 用贪心算法,优先选取二次度量误差小的边
- 坍缩之后,用优先队列维护变化后的数据
光线追踪
光栅化遇到的困难
- 着色只关注自己,无法处理阴影。
- 光线多次弹射比较难处理
whitted-style光追
光线不断弹射,将最终所有光的结果加起来
缺点:
- 漫反射做不了。因为只考虑镜面反射,遇到漫反射认为不弹射
- 模糊做不了。因为这里的光是一条线,而不是一个锥体
射线和平面求交
- 平面上一点p
- 点法式:(p - p')·N = 0
ax + by + cz + d = 0
MT算法
根据克拉默法则,变成:
其中(上面和下面大写的都是向量):
\(E_1 = P_1 - P_0\)
\(E_2 = P_2 - P_0\)
\(S = O - P_0\)
\(S_1 = D \times E_2\)
\(E_1 = S \times E_1\)
判定是否在三角形内:
- t < 0
- b1 >= 0, b2 >= 0
光线判交加速
包围盒加速
如果光线和包围盒都碰不到,说明一定不会有交
- AABB(轴对其包围盒)
- 每条边平行于坐标轴的包围盒
- 对于每个对面,都存在最小和最大进入时间\(t_{min}\)和\(t_{max}\)
- 因此对于一个3d盒子,\(t_{enter}\) = max{\(t_{min}\)}, \(t_{exit}\) = min{\(t_{max}\)}
- 如果 \(t_{enter}\) < \(t_{exit}\) 则认为和盒子有焦点
考虑特殊情况:
- \(t_{exit}\) < 0 : 说明光线在盒子后面,因此不在盒子里面
- \(t_{exit}\) >= 0 and \(t_{enter}\) < 0 : 光线起点在盒子里
因此: \(t_{enter}\) < \(t_{exit}\) && \(t_{exit}\) >= 0 则认为光线和AABB有焦点
体素化
包围盒再细分成一格一格的小格子,然后光线对一个个格子求交
优缺点:适合紧密的场景,不适合疏松的场景
空间划分
- oct-tree: 八叉树
- kd-tree: 每次做一次划分,且按照xyz循环划分
- bsp-tree: 不按照水平轴划分
KD-Tree
通过划分形成一个二叉树,然后只要某一个节点有交,则进入所有子节点;如果没交,跳出逻辑
存在问题:三角形和盒子求交很难
BVH
划分的不是空间,而是划分物体。把物体分成两堆,然后求它的包围盒。
划分方式:
- 每次划分,按照最长的轴划分,让他变短
- 找到中间的物体,按照这个物体划分。能够保证这个树平衡
辐射度量学
用于精确的定义光(物理意义上)
名词定义
- radiant energy: 光的能量,单位J
- radiant flux(power): 单位时间的能量,单位W(瓦特)
- radiant intensity: 单位立体角的能量,单位candela(简称cd)
- 如果点光源是均匀扩算的,点光源强度 = 4π * intensity
- 立体角: 和度类似,[ 对应球面的单位曲面 / r^2 ],球的立体角是4π
- irradiance:单位面积上的能量,单位lux(w/m^2)。投影到垂直方向上的面积
- radiance:单位立体角、单位照射面积上的能量,单位nit(W / srm^2)
BRDF,双向反射分布函数
出射方向上的radiance的微分 除以 入射点上的irradiance的微分
描述了光线和物体是如何作用的(某个入射方向进来后,反射出去的结果),最后决定了物体的材质
某个点的能量方程:
即单位面积上的能量,反射到个个单位角的能量之和
\(w_i\)是入射光和法线的夹角,\(w_r\)是出射光和法线的夹角
渲染方程
上面的能量方程,加上自己发出的光,就是渲染方程:
经过一系列推算…… K表示省略后的算子
全局光照 = 直接光照 + 间接光照 + 两次弹射光照 + 三次弹射光照 + ....
蒙特卡洛路径追踪
- 概率密度函数。函数每个点的微分为该点的概率
蒙特卡洛积分
即在PDF上随机取样,求出取样点和两边形成的矩形面积,最后平均值就是概率的结果
note
1、样例越少,结果越不准
2、对x积分,样本只能是x
路径追踪
因为一个点发出N条光时,会出现指数爆炸。当N取1时,则不会出现这种情况,即路径追踪
因为N=1时噪声很大,所以可以在一个像素上取多个路径求均值
其次,因为递归需要结束条件,所以引入结束概率P。
俄罗斯轮盘赌(RR): \(E = P * (L_o / P) + (1 - P) *0 = L_o\)
shade(p, wo)
If (ksi > P_RR) return 0.0;
Randomly choose N(or ONE) 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) / P_RR
Else If ray r hit an object at q
Lo += (1 / N) * shade(q, -wi) * f_r * cosine / pdf(wi) / P_RR
Return Lo
光线生成:
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
优化
直接在光源上采样,然后将\(d\omega\)和\(dA\)关联起来
换元结果:
最终光线传播:
光源采样 + 总的球面的采样
BRDF的性质
1、非负性
2、线性
可以拆成很多块,然后再相加
3、可逆性
4、能量守恒
BRDF的测量
测量机器:gonioreflectometer
计算方式:枚举每个入射角和出射角,然后得出值
开源库:MERL BRDF Database
材质与外观
折射定律
snell's定律:入射角和折射角的sin成正比,\(n_isin\theta_i = n_tsin\theta_t\)
菲涅耳项:不同的角度下,有多少能量反射,多少能量折射
微表面模型
近处看是几何,远处看就变成材质了
根据表面法线的分布,来分辨材质
D代表在h方向上的法线分布,G阴影遮罩(没这个的话,边界会特别亮),F表示菲涅耳项
区分材质的方式
各向同性材质:法线分布没有方向性
各向异性材质:法线分布有一定方向区间
进阶话题
有偏的:非无偏的情况
无偏的:估计出来的值和目标期望一直
无偏估计
- BDPT:双向(半程)路径追踪。光源发出一条光,摄像机发出一条光,然后求出焦点
- 适合光源非直接照亮,而是间接照亮的位置
- MLT:马尔科夫链方法,找到周围近似光路求结果。
- 优点:适合做更加复杂的场景
- 缺点:收敛无法确定,以及像素各做各的,导致结果很脏
有偏估计
- 光子映射
- VCM:光子映射+双向路径追踪
- IR:每个一个照亮的点,都算作是新的光源(VPL,虚拟光源)
外观建模
非表面模型
散射介质
雾、云。光线穿过发生两件事,被吸收或者被散射
头发
- 有色高光
- 无色高光
Marschner Model:玻璃珠模型,R+TT+TRT
Double Cylinder Model:中间考虑髓质的模型,R+TT+TRT+TT's+TRT's
颗粒
晶体、沙子
透光性材质
玉石、水母
次表面散射
用来计算透光性材质的,进入光的地方,和出光的地方非同一个点
BSSRDF:\(S(x_i, w_i, x_o, w_o)\),从哪个方向进来,从哪个方向出去
替换原来的渲染方程
对方向进行积分,对面积也要进行积分
第二种方法:Dipole Approximation
在材质内部生成一个虚拟的光源。可以近似次表面反射的效果
用于渲染人的皮肤效果会比较真实
布料
渲染方法:
- 当做表面
- 当做散射介质
- 当做头发
程序化材质
3D噪声:对于空间中的任何一个点,返回给你一个值
可以用于生成地形、水面、木头纹理
相机、透镜和光场等其他话题
相机
传感器上记录的是irradiance
- FOV
- 视场,能够看到多大的范围
- ISO
- 感光度。用于扩大亮度的系数
但是系数太大的话,会导致噪声跟明显 - F-Number
- 光圈大小。等于焦距除以这个光圈直径
- 快门时间
- 时间越长,会导致运动模糊
透镜
CoC:点被模糊成一个圈
拍更清楚的东西,需要用小光圈
景深
成像清晰的一段范围
光场
- 全光函数
- 我们能看到的所有东西,在任何时刻、任何位置、任何方向看到的东西,总共7个维度
- 光场
- 在任何一个位置,往任何一个方向去的光的强度。光场是全光函数的一小部分
参数化方法:两个面上所有可能的位置和方向
- 光场照相机
- 拍完照之后,可以虚拟的移动照相机位置
也可以做重新聚焦
颜色
- 谱功率密度(SPD)
- 光线在不同的波长,强度是多少
- 同色异谱现象
- 最后得出的(S, M, L)相同,最后导致不同的光谱得出的颜色一致
- 加色系统
- RGB。当rgb为负数时,相当于对面的颜色加上这部分颜色
- 色域
- 一个颜色空间所能表示的所有颜色空间
- 颜色空间
- sRGB。
- HSV/HSL颜色空间
- 色调,饱和度,亮度。饱和度表示颜色的纯度,越高越纯
- 互补色
- 白-黑,黄-蓝,红-绿
- 减色系统
- CMYK。蓝绿色 + 品红色 + 黄色 + 黑色。这些颜料可以调出各种系统
带上黑的是因为黑色墨水成本低
动画与模拟
关键帧动画
重要的位置,就是关键帧。能够定义整个动画的走向
本质就是插值
质点弹簧系统
其中l是初始长度
阻尼公式:
\(\dot{b}\)表示b点的速度
其他方法
有限元方法(FEM):方便处理力的传导和热的传导
粒子系统
粒子之间的作用力。先模拟后渲染
运动学(Forward Kinematics)
定义一个个关节:
- 滑车关节(订上的关节)
- 球窝关节(球形包裹的关节)
- 导轨关节(中间加了可以伸缩的关节)
告诉每个关节如何运动,就知道最终的位置
优点:实现方便
反向运动学(Inverse Kinematics)
- T-Pose:模型的初始形态
- Two Bone IK:两根骨头,UE4的一种IK解算器
CCD
1、从末端关节连接的父关节A开始,计算末端关节与目标末端关节位置与该关节形成的夹角,旋转之;
2、如果旋转后的末端关节未达到目标,则以A的父关节开始重复步骤1;
3、如果到达根关节仍未将末端关节达到目标,则结束一次迭代,重复步骤1、2,进入下一次迭代。
其他
Full Body Biped ik
Rigging(骨骼绑定)
对模型上的节点,绑定一个控制节点,然后通过改变这些节点可以控制整个模型
Motion Capture(动捕)
优点:更真实;获取数据更快
缺点:动捕服不好穿;还是需要手动调整;采样是否准确?
模拟中的误差问题
欧拉方法:解决常微分方程,微分取值。上一帧数值,加上这一帧变化的量
数值法去解微分总会有误差,比如无法圆周运动,最后造成【正反馈】,即现象越来越大,无法控制
优化法:
- 中点法:类似泰勒展开,取值的时候再取中点的值
- 隐式欧拉
- 龙格库塔方法:最常用的是RK4
- Position-Based/Verlet Integration
刚体模拟
pass
流体模拟
关键概念:
- 模拟出不同小球的位置,然后再渲染成面
- 水不可压缩
梯度下降法:不断调整数据,最终和结果相似
质点法:拉格朗日方法,用来考虑一大堆物体的
网格法:欧拉方法
MPM:上面两种方法结合
其他知识
术语
- artifacts: 图形学中,采样中一切不准确的/瑕疵,都叫artifacts
- 高通滤波: 过滤掉低频的滤波
- 均值模糊
- 冲激函数: 周期离散的点
- specular:镜面的(材质)
- glossy:稍微有点镜面的(材质)
- The Utah teapot:一个著名的茶壶模型
- The Cornell box:一个用来测试全局光照的知名模型
- 计算摄影学
- 果冻效应
隔行扫描
用在CRT
优点:运算量减半
缺点:显示高速运动的物体时,会有很强的画面撕裂感
如何学习
WHY,WHAT,then HOW
radiance转换成颜色
gamma correction
全反射
当光线从较高折射率的介质进入到较低折射率的介质时,如果入射角大于某一临界角θc(光线远离法线)时,折射光线将会消失
- 反射原理不同:镜面反射光是撞到了不透明的物体反射。全反射是光通过透明的物体上出现的现象。
- 折射光存在形式不同:镜面反射,光线是任何角度,都只会有反射光,不存在折射光出现。全反射,只有大于一定角度的时候才没有折射光出现。
- 包含关系不同:全反射包含于镜面反射。