HomeWork 1:旋转与投影
代码:
1 | /* |
1 | /* |
首先研究一个粒子的运动然后泛化到大多数粒子。
我们线认为粒子的运动由速度场(velocity vector field)决定,这个速度场就是一个位置和时间的函数:v(x,t)
知道粒子的位置和时间,就知道它的速度;(这个函数我们现在是已知的)
那么,计算粒子的位置(随时间变化)需要解一个一阶的常微分方程(不存在对其他变量的微分或导数First-order意味着只存在一阶导数):
欧拉方法是一种简单的迭代方法,经常被使用、不准确、大多数都不稳定。
可以使用欧拉方法对给定初始位置和速度场的点求解经过时间t后所处的位置。
使用数值计算的方法积分,误差会累计,最后的Euler积分结果会很差。
如下图,粒子的轨迹始终不能沿着圆形或指定的轨迹。
即欧拉方法有两个关键的问题:
用有限差分数值积分法求解
导致两个问题:
Errors:
Instability:
中点法比欧拉方法多了一个二次的项。
Adaptive 是基于 error 估计选择步长的方法,非常实用,但可能得到的步长会很小。
也被称作后向方法,使用下一时间的导数来计算当前的步骤。
定义与量化 “stability” (稳定性)的方法
Runge-Kutta方法是一系列用于求解 ODE 的高级方法。
特点
h就是步长,也就是 Δt
这是一种不基于物理的方法,通过调整物体的位置使物体满足某种性质。
思想:
特点:
刚体模拟与模拟单个粒子相似,只需额外考虑一些属性(角度,角速度)
关键思想
MPM 是一种混合的(Hybrid),结合 Eulerian 和 Lagrangian 的方法。
结束,下面把作业做一做,然后打算做个玩具渲染器(当作毕设了…)
“Bring things to life”
建模的扩展
输出:按顺序播放的图片序列,提供一种运动感。
这个看一下PPT就行…
关键帧动画一般使用插值方法来进行补帧,把每一帧当作参数值的向量,下面是线性插值。
用样条进行优化:
F = ma
使用数值模拟生成物体的运动
例子:
理想化的弹簧:没有长度,作用力会导致位移。
胡克定律:
问题:永远震动下去。
定义概念:
引入能量损失
问题:所有运动都会停止(不能表现弹簧内部的损耗)。
弹簧的内部阻尼(Internal Damping for Spring)
只阻尼内部,由弹簧驱动的运动。
Viscous drag 仅限于弹簧长度的变化,不会减慢弹簧系统的整体运动(例如,整体平移或旋转)
Note: 这只是一种特殊的阻尼(damping)。
弹簧结构的连接可以决定一个图形的行为,比如改进下面的连接来模拟布料。
原来的不足之处:
改进之后:
其他模型:有限元方法FEM(Finite Element Method)
(代替弹簧系统的一种模拟布料的办法)
常用来做汽车碰撞,主要思想是力与力之间存在传导,效果如下。
挑战
步骤
粒子系统的作用力
模拟动物集群(Simulated Flocking as an ODE)
需要考虑一个例子的各种作用力
Articulated skeleton
Joint types(关节类型)
例子:2D中简单的两端骨骼。
Animator 提供角度,计算机决定 end-effector 的位置p。
Animation 是用角度参数与时间的函数来描述的。
优点:
缺点:
概述:
根据尖端获得关节的角度位置。
Animator 提供 end-effector 的位置,计算机决定满足限制的 joint 角度。
计算方法:
问题:
N-link lK 问题优化方法
Rigging 是一套高级角色控制,允许更快速和直观地修改姿势、变形、表情等。
直接在曲面之间进行插值。
最简单的方案:取顶点位置的线性组合,样条用于控制随着时间的推移权重的选择。
Motion Capture 是创建动画序列的数据驱动方法。
下面是三种动捕设备(光学、磁力和机械)。
优点:
缺点:
东西挺多的…
将整个世界看成是七个维度的函数:
P( … ) 这个函数可以表示在任何地方,任何方向,任何时间看到的东西的颜色,这个函数就是全光函数
光场就是全光函数的一部分。
光线是一个5D表示的,包含 3D 的 position 和 2D 的 direction。
另一种定义方式:两个点定义一条光线。
它是4D表示的,包含 2D 的 direction 和 2D 的 position。
想要描述一个物体的视觉信息,只要找出它的包围盒,并记录包围盒表面任意一点向任意方向的发光情况即可。
光场就是在任何一个位置往任何一个方向去的光照强度。
有了光场后,从任意位置都可以看向这个物体,有了视点和看向的方向,查询4D的函数就可以查询到记录的值(光的强度)。
有了包围盒之后,就可以忽略光场内部的细节,只要记录包围盒表面的任何位置任何方向的光照信息即可。
起始点 + 一个角度
两个相互平行的平面,两个点确定一条光线
参数化的表示两个平面(s t)(u v),找到所有 uv 和 st 的对应关系,便可以定义任意一条光线。
下面看一下解释,假设整个世界在 st 面的右边:
原理:本来是光都打在一个像素上的,但是现在把像素的位置往后移一下,原来的位置放成一个微透镜,让透镜把来自于不同方向的光分开然后记录下来,然后对于特定方向上的光线重新聚焦。
还原普通照片的方法:对于每个透镜都选择每一“块”的最底部的像素。
有了光场之后,可以虚拟移动相机的位置(重新聚焦也是一样的道理)。
总结:光场相机能实现虚拟移动相机位置,改变聚焦等功能。
光场相机特点:光场摄像机记录了所有的光场信息。
光场相机的问题
颜色是人的感知的结果,他不是光的自然属性。不同波长的光不是“颜色”。
SPD 是光线不同波长的光强分布是多少,如下图所示蓝天能量集中在波长低的部分,日光波长越高能量越大。
SPD 具有线性性质,即可以叠加。
人的眼睛是摄像机,瞳孔是光圈,晶状体是透镜(通过肌肉伸缩来控制焦距),视网膜是传感器。
视网膜具有感光细胞(Retinel Photoreceptor Cells):棒状和锥形细胞(Rods and Cones )
Rods(棒状细胞):感知光的强度,可以得到灰度图。~120 million
Cones(锥形细胞):感知光的颜色。~6-7 million
由于三种类型的细胞对于波长的感光程度不同,Cones可以进一步划分为三类:S-Cone,M-Cone,L-Cone。
以下是人类锥形细胞的相应曲线,SML是人类最终看到的结果(只是一个数,不是光谱而是积分的结果)。
每一个光的波长信息不能被人眼测量和大脑接收。
眼睛值看到了三个 response values(S,M,L),并且是大脑唯一可获取的信息。
Metamerism 是不同的光谱 spectra( ∞ − dim)会映射到相同(S,M,L)的响应。
Metamerism 对颜色reproduction很重要。
加色系统 Additive Color
(可以进行减色)
CIE RGB Color Matching
下图图显示每个CIE RGB主要(primary)光匹配x轴上给定波长的单色光需要混合的量。(注意有负的结果)。
对于任何一个光谱s,感知到的光被下面的公式匹配(缩放CIE RGB原色)。
Gamut 是被一个原色集生成的所有色度(chromaticities)。
不同的颜色空间表示不同范围的颜色,具有不同的色域(gamut),即它们覆盖charomaticities的不同区域。
CIE是人造的颜色匹配系统。
首先设定标准颜色原色组X,Y,Z。
这个系统设计成匹配函数严格为正,覆盖所有可见光的范围。
HSV 常见于颜色拾取器中(PS中常见)。
CIELAB Space是与感知有关的色彩空间。
Subtractive color model:混合的越多就越暗。
青色Cyan、洋红Magenta、黄色Yellow和黑色,并(Key Widely)广泛用于打印。
FOV:看到的角度
h:高度
f:焦距
当传感器大小一定时,FOV 随着焦距增加而减少。
通常,相机(传感器)越大,镜头(焦距)越长越好。
ISO 是 exposure 的第三个变量,简单放大ISO信号的同时会方法噪声。
Film:权衡对(grain)的敏感度。
Digital:权衡对噪声的敏感度。
写作 FN或F/N,N就是f-number。
简单理解为光圈的直径的倒数。
正式定义:镜头的 f-number 是 焦距 除以 光圈的直径。
快门可以用于调节曝光度。
运动模糊(Motion blur):由于快门打开有时间会拍摄到一段运动。
两倍的快门时间意味着两倍的运动模糊。
运动模糊不一定是坏事,从人的感知角度它可以形容速度快从采样角度,它也可以进行反走样。
Rolling shutter:图像上的不同位置可能会记录不同时间进入的光(会造成扭曲)。
两者可以组合,调节曝光度;
Photographers 需要权衡景深和运动物体的运动模糊。
High-Speed Photography:每秒拍更多的照片,也导致快门时间很少(短曝光时间,得用更大的光圈)。
Long-Exposure Photography:长曝光时间,小光圈。
真正的透镜非常复杂,需要一个简单的方法描述。
如图,Object远离Focal Plane,聚焦后的点不在Sensor Plane上,而是在它前面聚焦,然后光线在聚焦点继续直线传播,到Sensor Plane上就变成了一个圆。(产生了模糊)
其中:A是光圈直径,C是CoC的直径。
Circle of Confusion 与光圈大小成正比。所以看到的东西是否模糊与光圈的大小有关。
将上面的公式与F-Number联系起来。
步骤:
渲染:
景深:就是指 成像清晰的一段范围
或者说:在场景内对应的CoC足够小的距离范围。
推导:
图形学笔记(十七)相机,棱镜 ——FOV、焦距、曝光、F-Stop、ISO、薄透镜公式、Circle of Confusion Size、景深、理想薄透镜光线追踪_相机凌镜成像-CSDN博客
光场放在了下一篇。
东西很多,当作扩展听一听就行。
在图形学中
(路径追踪是从相机到光源使用一条路径连接起来。)
根据当前的样本可以生成与其靠近的下一个样本,他可以生成以任意形状函数为PDF的样本。
关键思想:局部扰动一个现存路径来获得一个新路径。
优点:
缺点:
从光源发射光子,让它们在四周弹射,直到光子打到diffuse的物体上,把光子记录下来。
从眼睛和摄像机开始,射出 sub-paths,让它们在周围跳跃,直到它们打到漫反射的物体上。
当第二趟打到 diffuse 物体表面时,就要做一个局部的密度估计。
思想:光子分布越集中越亮。
做法:对于每个着色点,找到最近的N个光子。计算它们占据的面积。然后就可以计算光子的密度。
为什么有偏?
解决
结合了 双向路径追踪 和 光子映射
当光通过散射介质时,任何一点可以(部分)吸收和散射。
使用相位函数(Phase Function)来描述参与介质中任意点的光散射角分布。
散射介质的渲染过程
头发会散射成一个圆锥。像是diffuse+specular。
除了考虑被散射的光线还要考虑穿过头发的光线。Marschner Model 考虑了以下三证类型的光线。
R:直接反射的光。
TT:穿进去再传出去的光。
TRT:光线进到头发里面,在头发的内壁发生一次反射再回去。
人和动物毛发都具有三层结构,如下图所示。但动物的 Medulla 比人大很多。
双层圆柱模型 Double Cylinder Model
Subsurface Scattering 是在表面下发生的散射。
Cloth: Render as Surface(把布料当作表面来渲染)
Cloth: Render as Participating Media(把布料当作散射介质来渲染)
Cloth: Render as Actual Fibers (把布料当作真实的纤维来渲染)
渲染出来的太过“完美”,而真实的世界中充满着各种各样的细节。
而细节很难通过渲染表现出来。
因为对于微表面模型来说,通过从光源的不断反射,只有非常少的一部分会被反射到相机。
由于像素覆盖很多的微表面,所以将一个像素覆盖的法线分布计算出来然后替换光滑的法线分布,用在微表面模型里。
一个可以像素覆盖不同大小的微表面,对于比较大的范围会得到统计学规律,而对于比较小的微表面得到的就比较有特点。
不同类型的法线贴图会得到不同的法线分布。
当物体非常小,就不能假设光沿直线传播,而是要考虑波动性,考虑光的波动性。
波动光学的 BRDF 与几何相似,但是相对而言比较不连续。
动机 不使用纹理贴图来定义细节。
3D noise(噪声函数): 可以直接通过噪声函数来计算细节,使用这种方法可以看到被切割或断裂的内部纹理。
应用:地形、水面、木头。
图形学笔记(十六)渲染的高级问题 —— BDPT、MLT、光子映射、VCM、IR、散射介质、毛发材质(双圆柱模型)、次表面散射、布料渲染-CSDN博客
这周事情比较多,人又懒得一批… 就一直没更…
外观是光照和材质共同作用的结果。
由于材质不同,光线作用后会得到不同的结果,同样的模型会渲染出不同的结果。
渲染方程中,由BRDF来决定材质。所以,Material == BRDF
对于完全镜面反射,有两种辨别方法:
反射方向的计算方法:
由折射定律,η 是不同材质的折射率,有:
投影后满足下面的关系:
如果入射介质的折射率 大于 折射介质的折射率 就会发生 全反射。
折射定律公式:
由于全反射现象,从空气打到水面的光线超过一定角度就无法进入人眼,形成了下面的Snell’s Window / Circle 现象。
反射 和 入射光的角度有关。
比如上面图片中,当入射光线(我们的视线)和桌子的法线越垂直,反射就越明显;
不同的材质他们的效果是不一样的,比如镜子,那么不论从哪个角度看,反射都很明显;
这个材质的性质,我们用菲涅尔项来定义;
下面这个菲尼尔项是上面例子的:可以看到角度越大反射率越高
在漫反射中,光被到达后会被均匀的反射到四面八方。
现在假设进来的光也是均匀的,即来自各个角度的 Irradiance 是相同的。那么如果表面不吸收光,那么入射和出射的 Irradiance,且入射和出射都是均匀(uniform)的,那么入射光和出射光的 Radiance 也是相同的。
漫反射的 BRDF 推导如下:
Glossy material是被打磨的铜镜之类的材质效果,是较为模糊的镜面,BRDF 的反射方向集中在一个小范围内。
此种材质同时具有反射和折射,可以使用BSDF来表示这种材质(同时考虑反射和折射)。
BSDF = BRDF + BTDF
基本思想:
例子:
微表面模型认为从远处看到的是材质外观,从近处看到的几何。
关键 研究微表面法线的分布。如下图所示,不同的法线分布会产生不同的材质:
Microfacet BRDF主要由三项构成:
各向异性会产生如下效果。
关键:各向异性的表面的法线分布具有方向性。
区别:如果BRDF不满足在方位角上旋转得到的还是相同的BRDF,则称为是各向异性材质。
简单来说各向同性的 BRDF 只和相对的方位角有关,而各向异性材质不止和相对方位角有关还和绝对方位角有关。
只有测量出的 BRDF 才是真正的 BRDF。
测量 BRDF 就是让光影和相机从各个方向去照去拍。
下图是测量工具:gonioreflectometer,可以精确到0.1°的级别。
伪代码:
1 | foreach outgoing direction wo |
优化:
把规则空间采样存储到三维数组 ( θi , θo , ∣ ϕi − ϕo ∣) 里。
参数化角度以更好地匹配镜面反射。
一般需要将测量值重新采样到表格中。
图形学笔记(十五)材质和外观 —— 菲涅尔项、常见材质(微表面材质、各向同性与各向异性)、BSDF、BRDF的性质、测量BRDF-CSDN博客
好多好难…
这节课讲的是 Light Transport & Global Illumination 当然首先包含了上一节课最后的辐射度量学;
ps:这几节课是真的难…
辐射度量学的动机:
光源中定义L=10,但是10代表的是什么无法确定,缺少单位。
定义:
辐射度量学就是在物理上准确度量光照的方法。
它定义了一系列的方法和单位,准确的定义了光在空间中的属性:
dA 是球面上的微分面积,近似成长方形
通过积分可以得到,整个球的立体角是 4π 。
定义:Radiant energy是一种电磁辐射的能量。它由 焦耳(J=Joule)单位来度量,用符号Q来表示。
定义:
主要是区别下面三种物理量:
定义:
定义:
Irradiance 例子:
Radiance 描述光线在传播过程中的属性。
定义:
注意:
因为 Irradiance 是单位面积的辐射通量,Intensity 是单位立体角发出的能量。
所以 Radiance是每单位立体角的 Irradiance,Radiance是每单位面积的正交 Intensity。
Incident Radiance 是每单位立体角的到达表面的 Irradiance。
Exiting surface radiance 是每单位面积向某个角度辐射出的 Intensity(这里参考文章里面应该是写错了)。
Irradiance:被区域 dA 吸收的所有的能量。
Radiance:被区域 dA 的来自d ω 的能量(多了一个立体角)。
如果点光源均匀的辐射出光,则可以得到点光源的强度 I 如下所示。
引入 :
意义:
定义:
如下图所示,从来自 ωi 立体角的 Irradiance(dE(ωi)),经过单位面积吸收后,向某一立体角 ωr 发射出去,发射出去的 Radiance 是 dLr(x , ωr)
BRDF 用于表示从每个入射方向进来的光线会每个向出射方向 ωr 反射的能量多少。
BRDF 就是任何一个出射方向的 Radiance 的微分 除以 在入射点上 Irradiance的微分,BRDF 如下所示。
BRDF 是描述光线对物体时如何作用的,所以可以用于定义不同的材质。
把每一个方向对出射方向的贡献积分起来就会获得向某个方向反射出光照的结果。
反射radiance取决于入射radiance,而入射Radiance不仅取决于光源,还有被其他物体反射的光,具有递归关系。
渲染方程 = 加上自己辐射的 Radiance + 反射方程
注意:
这里默认所有的方向 ω 都是向外的。
而且此时考虑的照亮到这一点的都是光源
但是实际上照亮这一点的不仅仅有光源的 Radiance,还有可能是其他物体反射过来的 Radiance;
如果考虑其他物体反射的radiance,就把反射物体和反射面当成光源,可以把渲染方程写成更通用的形式。
以上的式子可以简单的表达为:
K为反射操作符,进一步简写为:
可以看出L是递归定义的。
简写渲染方程(L= E + K L)的目的是解出 L。
解L的方法如下所示,其中K也可以理解成反射次数,反射次数越多,项越多,K^2 代表光弹射两次。
全局光照 = 直接光照(E) + 间接光照(KE + K^2E + K^3E + …)
光栅化的着色一般只有 E+EK,而后面的间接光照部分光栅化难以做到,一般使用光线追踪(路径追踪)来进行计算。
好难…
光做笔记都要写好久好久…
上一节课最后还讲了一点概率论,比较简单;
介绍了一个概念,后面常用,概率分布(密度)函数:
蒙特卡洛(Monte Carlo)积分目的是 解决定积分,但是它难以积分(解析式不好表达,不定积分不好求)的情况。
在积分域内不断采样,获得 y 值,不断的与 ab 范围获得一个个长方形,然后把所有长方形的面积相加求平均。
在积分域 [a,b] 之间不断随机取样 xi,得到结果为 f(xi),作为长方形的高,那么我们就能得到这次采样的长方形的面积 (b-a)*f(xi)(但是并不准确),当我们多次采样后求平均,那么他就准确了。
然后,采样的话可以用不同的概率密度函数p(x);
对于给定函数 f(x) 的定积分,定义蒙特卡洛(Monte Carlo)积分:
(其实不是很懂为什么这个 p(xi) 被放在了分母)
注意:
假如有一个均匀分布的概率分布函数,则他的蒙特卡洛积分为:
Whitted-Style Ray Tracing 对光线进行了如下假设:
问题1:
问题2:
color bleeding:面的颜色流到其他的面上去。 就像上方右图高长方体的左面被全局光照映照出红色。
Whitted-Style Ray Tracing 是错的,但是渲染方程是正确的。
但是此方程涉及
目的:渲染下面场景的一像素的直接光照。
ω0:观测方向,从着色点到观测方向。
ωi:各个不同的入射的方向。
这里直接搬了参考文章中的分析:
对于只考虑直接光照,算法如下:
1 | shade(p, wo) |
使用上面的方法,由于光线跳跃多次,光线的数量会爆炸(有递归)rays = N^bounces ;
解决方法 令N = 1,即每次只选取 wi~pdf 的一个方向。
路径追踪就是上面N=1的算法 ,即每次路径追踪只是随机选择一个方向反射。
1 | shade(p,wo) |
但是噪声会很大。但是只要对每个像素trace more paths并求它们radiance的平均就可以减少噪声。如下所示。
为了减少噪声,所以每个像素要生成多个光线,进行多次路径追踪,光线生成算法如下。
1 | ray_generation(camPos,pixel) |
其实这里也有点像蒙特卡洛积分,也是取平均;
问题:
解决方案:
设定一个概率,0<P<1。
用这种方法,仍然可以期望得到值 Lo:
E = P ∗ (Lo / P) + (1 − P) ∗ 0 = Lo
进行如上改进后,得到的代码如下:
1 | shade(p,wo) |
这样就能保证递归可以停止。
问题 经过以上改进,现在路径追踪算法是正确的了,但是它不高效。
如下图所示,如果均匀的四面八方采样,对于很多光线只有极少数打到光源,大部分都被浪费掉了。
所以我们直接在光源上采样,pdf = 1/A,但是渲染方程的积分是在立体角上进行的;
由于Monte Carlo方程要求在哪里积分就在哪里取样,所以只要把 dω 转变成对 dA 积分即可。
我们得到立体角和光源面积微分 dA 的关系如下:
然后重写渲染方程:
现在我们认为着色结果来源于两部分:
光源的贡献(直接采样光源,无需RR)
其他反射(indirect,需要RR)
伪代码如下:
再考虑另一个问题,如果光源和着色点之间被物体遮挡,则直接返回0。
到此 Path Tracing 算法完成。
缺点:路径追踪不好处理点光源。
优点:Path Tracing 可以做到照片级真实感PHOTO-REALISTIC(如下所示)。
早期:
现代:
太难啦
这节课讲了 光线追踪的加速 和 辐射度量学;
这篇文章写的是光线追踪的加速,辐射度量学一起放在下一篇文章;
上篇文章讲了包围盒,这节课前面讲的是如何用包围盒加速光线追踪;
格子太多和格子太少都是不好的。
格子划分法适用于大小和空间均匀分布的大型对象集合(如下图所示)。
但是此方法不适合于有很多空旷区域的场景(如下图所示),下面又称为 “teapot in stadium” 问题。(其实就是分布不均的场景,有的地方物体很密,有的地方物体很稀疏)
本质上是一颗二叉树,如下图所示(为了简化没画全,实际上1、2等节点都有子节点)。
还是有点抽象?没事,看一下下面的应用:(最好看一下原视频)
换一种思想,既然对空间划分这么麻烦,那么就直接划分物体;
下面是图解:
BVH避免了KD-Tree的问题,具有如下优点。
缺点:
每次都需要选择一个维度来分割(经验上有下面两种做法)。
1 | -- 参考的是课件里面的 |
图形学笔记(十二)光线追踪2——使用AABB包围盒加速光线追踪、空间划分(八叉树、KD树、BSP树)、物体划分(BVH加速结构)、光线与物体求交_光线追踪算法遍历八叉树-CSDN博客
AI孙燕姿 真好听 hhh
等哪天闲了也来研究研究这东西。