Pyro 原理理解
一.
1.equations of fluids
纳维斯托克斯方程
1.参数
2.momentum equation 动量方程
3.differential equation 微分方程
不可压缩性条件
4.对于每个粒子的属性
5.对粒子的力force,牛顿第二定律
1.加速度 为速度求导
2.这里的D为 物质导数
3.带入求F
6.第一个力为pressure(压力)
gradient 梯度
取压力的负梯度
将压力带入方程
需要再volume上积分 这里取近似乘以体积
这里的==向量微分运算符==可以作用于标量场或矢量场,有三种方式,产生三种微分运算
==1.与标量场乘法 得到 梯度向量场 gradient==
直接对函数f()求偏导,这里的f()是标量场 例如f(x,y,z)=density,在某一位置的密度值。求其偏导,使用==中心差分法==,即每个轴方向前后两个值==相减==除以2,得到对应轴方向的分量,最终的到一个矢量场-梯度
指向f增加最快的方向,因为求的是导数,变化率。比如速度在时间上的变化率为加速度,即每一秒增加多少速度。
==2.与向量场点乘 得到 散度标量场 divergence==
取每个轴方向上的前后两个(位置的)向量,再以对应轴上对应的分量中心差分法求偏导数,将三个偏导数相加即为散度。
这里散度大于0为流出(源),小于0为流入(汇),等于0表示流入等于流出
==3.与向量场叉乘 得到 旋度向量场 curl==
旋度计算,
涡流 vorticity 速度场的旋度。
注意:偏导数 表示函数在某一点沿着某一坐标轴方向的变化率(使用差分法)
例如SDF中的梯度gradient
对于标量值的volume,梯度指向外
7.第二种流体力由viscosity提供(粘度)
测量某个量与周围平均值差距的微分算子是==拉普拉斯算子==
在液滴体积上积分
使用==动态粘度系数==
带入方程
当粒子数量趋于无穷大,粒子大小趋于0,取极限,所以除以体积取极限
这里的m/V,即为==流体密度==
得到方程
两边除以密度
8.进一步简化方程
动态粘度系数 除以 流体密度 得到 ==运动粘度kinematic viscosity==
9.对于流体运动,有两种追踪运动的方式,拉格朗日观点 和 欧拉观点
lagrangian 将流体看作粒子系统
eulerian 观察空间中固定的点
10.物质导数
物质导数是总的变化率,由==当地导数==,加上==对流导数==
这里的对流导数与散度差别
第一项是 q的导数,q的变化率
第二项 是修正correcting 流体经过差异(微分)的变化
11.==advection== (平流)是物质导数的第二部分
通过流体运动运输某个量(quantity),比如density field(密度场)
设置advection 为 0
使用velocity advect velocity,称为self-advection,==将速度场沿着流线方向运输==
平流的计算:
去除viscosity粘度
12. 纳维斯托克斯方程忽略粘度叫做 欧拉方程
13.incompressibility 不可压缩性条件
满足 此条件的场 称为==divergence-free 无发散==场
计算方法:
使用压力投影pressure projection,找到一个压力场,以此修正速度场,使新速度场的散度为0.
使用 压力泊松方程 PPE(pressure poisson equation),求解压力场
泊松方程
压力泊松方程
在修正预测速度场,以得到最终的速度场
14.divergence
先self-advection(自平流),再施加forces,再projection(满足无发散条件)
补充1:---------------------------------------------
1.在向量场中,(x,y,z)用于表示一个点的位置。(u,v,w)表示向量场u,的分量函数。
2.拉普拉斯算子Laplacian (通常形成梯度的散度 即两次偏导,▽·▽)
偏微分方程▽·▽f = 0,称为拉普拉斯方程,右边非零则称为泊松方程。▽·▽f = q。也可以将梯度乘以标量场 仍然是泊松问题 ,▽·(a▽f) = q
3.微分恒等式(或者叫做vector calculus identities)的应用
这里由改变偏导顺序结果不变推出(函数平滑 即任意阶的导数都存在且连续)
1. ▽·(▽ X u)≡ 0 旋度的散度恒为0
1.由旋度产生的向量场一定是无源的,即散度为0.如磁场没有磁单极子。
3. ==一个场的散度为0==,可以认为他是另一个场(向量场)的旋度。这个场称为==向量势==
2. ▽ X(▽ f)≡ 0 梯度的旋度恒为0
1.==一个场的旋度为0==,可以认为他是另一个场(标量场)的梯度 。这个场称为==标量势==
3.▲f = ▽·(▽f) 标量场的拉普拉斯 梯度的散度
4.▽ X (▽ X u) ≡ ▽(▽·u)- ▽·▽u
旋度的旋度 ≡ 散度的梯度 - 梯度的散度(拉普拉斯)
5.亥姆霍兹分解: ==任何无发散的向量场可以写成 无发散部分 和 无旋度部分 的和==
6.这种分解(5)将压力投影步骤解释为 将中间速度场v^n+1^ 分解为无发散部分 和其他部分,只保留无发散部分。将无发散速度场表示为 向量势ψ的curl,这个向量势ψ称之为流函数
4.积分恒等式(integral identities)
1.高斯散度定理
散度是每个点的流入流入,通量是穿过曲面的总流量,这里的思想即是 体积内的流入流出的流体总和(体积积分)等于通过这个体积边界流入流出的通量(面积积分)
==矢量场u的散度的体积积分 等于 矢量场u的边界积分==,n是单位法向量
数学定义
5.张量 tensor
简化的表示方法
6.数值方法 numerical methods
有限差异方法 泰勒级数
1.空间的有限差异 (finite differences in space)
一阶精度
使用q^i+1^ ,q^i-1^ 获得二阶精度
中心有限差
2.时间积分(time integration)
7.不可压缩欧拉方程(the incompressible Euler equations)
不可压缩性条件的推导
1.对于流体,总质量是密度的体积积分,总动量是密度速度的体积积分
2.质量M的变化率 由质量进出速度边界积分给定,
3.转化为散度定理的体积积分
4.展开质量M
5.连续性方程 与 不可压缩性条件
1.不可压缩流体密度的导数为0(变化率为0)
2.密度不变,即速度的散度为0
8.对于物质导数(material derivative)
1.拉格朗日视角:存在 位置为x,速度为u ,的粒子
2.观察一个通用的量q(密度,速度,温度...)
3.函数==q(t,x)==,是恰好在时间t,位置x处的粒子的q的值(这是一个欧拉变量,他是空间的函数而不是粒子的函数)
4.q的变化速度有多快? 对于位置由函数==x(t)==给出的粒子(拉格朗日问题)
取总导数(使用链式法则)
5.平流advection,意味着q并没有变化(在拉格朗日观点中),只是在移动
拉格朗日导数为0(每个粒子都由一个q值,只是粒子在移动,粒子的q值不变),但欧拉导数会变化(即q在空间固定点的变化速率)
------------------------------------------------
补充2-------------------------------------------
2d模拟流体
两种网格存储速度场
步骤
1.更新速度
2.使流体不可压缩
3.平流速度场 advection
------------------------------------------------
2.volumes
转换为volume的方式
从object创建volume
1.isooffset
2.VDB
3.pyro source
创建空volume
1.volume
以已有的point和空的volume 创建volume,使用[volumerasterize]节点
[ volumerasterizattributes ]节点
3.custom solver
1.使用isooffset创建density
2.dopnet
1.smoke object
2.smoke solver
3.volume source
3.创建自定义solver
1.使用[multisolver],自定义求解器的基础
date,force
2.使用[emptyobject],创建容器(基本容器,可以附加各种数据)
3.使用[sopcalarfield],基于sop中的density 创建标量场density
4.设置为density
5.可视化 ,使用[scalar field visualization] 节点
6.同理添加一个temperature field
7.创建一个空的 velocity 场
[sopvectorfield]节点添加一个速度场,使用faces存储,sop path为空,dataname为vel
可视化使用[ vectorfieldvisualization ]
使用[ gasbuoyancy ]节点,根据温度场计算浮力,并更新速度场
但是仍然不会对density产生影响,还需要平流==advection==。
8.平流 使用[ gasadvectfield ] 节点
先对vel速度场自平流(使用vel平流vel),再添加gasbuoyancy浮力,再平流density密度场,temperature温度场(后两个可以一起)
9.去除速度场的发散分量
[ gasprojectnondivergent ]节点,在添加浮力之后使用,
没有使用无发散速度场的
使用无发散速度场的
11.添加自定义的速度场 frome cam
4.设置碰撞 collision
1.设置物体,转换为SDF,并添加速度属性(生成一个速度的向量场)
2.设置[ staticobject ]
3.设置static object为 collision 物体
设置volumesample
4.[ gasenforceboundary ] 节点 在field上执行边界条件
这里未指定碰撞值时(默认),先将碰撞场内的点的场(如速度场)设置为0,再将碰撞体内部的未经过压力投影处理的速度场清零
指定vel
放置到投影之前
5.使用[ gasmatchfield ]节点,创建基于参考场(density)的空场(collision碰撞场)
6.[ gasbuildcollisionmask ]节点 ,生成一个碰撞场(collision是SDF),和一个碰撞速度场(collisionvel)
7.使用[ sopmergefield ]节点,合并外部VDB速度场,使速度场更精确
持续输入density问题
先创建一个emit发射场(在source的同样位置),
在advect density,平流密度之后使用emit场向density场添加。这里可以设置减小添加量
注意不同的border type效果也不一样
多重碰撞问题
设置速度场的边界,closed ends,即可实现在边界范围
在[ gasprojectnondivergenct ]节点设置surface field 为collision,可以解决穿透问题
多个碰撞物体可以设置多个static object
8.第5步也可以在开始设置好collision场 和 collisionvel场
5.[ gasprojectnondivergentmultigrid ]新的投影方法
4.smoke solver
1.在smoke object内部也是同样的emptyobject
smokeobject 用于创建不同field(density ,temperature...)
2.注意: 场field需要放置信息,否则只是空场
2.三种 advection方法
二.explosion
爆炸:
1.创建source
1.使用[pyroburstsource]节点,创建粒子
设置较少的粒子,减小thickness和separation
使用添add点控制爆炸的位置
2.创建形状
依据每一条线的curveu设置属性
官方的代码是使用起点的位置和终点位置映射

可以使用pscale 映射,==但是pscale属性在爆炸时会发生变化==
3.以起点终点生成线,设置属性
1.打开rest属性,使用rest position,由于粒子数量不变id不变,以此计算最后一帧与rest位置的向量
计算当前点的当前位置与rest(初始)位置的距离作为放缩line的参数
2.创建line,copytopoint,line指向-z方向
3.使用dist作为pscale放缩line的长度(原本是以point的pscale作为line的长度)

4.使用popnet 模拟设置爆炸动画
设置随机的airresist,不在第一帧工作,上面的airresistance参数才生效
注意这里的airresist,如果使用fit则不论参数设置多少都映射到对应的区间,如果使用if条件大于多少帧运行则使用固定值。
5.设置jitter,使用jitter节点是在直线的截面方向,这里设置沿线方向移动点
沿速度的反方向点位置随机移动,计算当前位置减去速度的位置作为新的位置
使用随机值混合原位置与反向移动的位置
6.使用nage = age/life映射pscale,使line由大变小
7.删除多余的属性个组
8.使用resample重采样增加分辨率,再依据curveu设置pscale,使其line从底部到顶端由大变小
由于discs模式只对点生效,这里查看对应的pscale时,需要添加一个add节点删除geometry保留点

使用curveu设置pscale,再将age作为乘数,使pscale随age逐渐变小
9.应用noise
1.使用curveu映射noise值,使其底部大顶点小
2.使用measure节点 测量prim的长度,以此作为噪波的乘数
当line变短的时候应用更小的噪波,保持噪波的比例更加合理

10.设置速度velocity
1.规格化life(age/life),
2.==起始速度== 使用nage(规格化的life)映射velociity,使得开始的速度更大,结束的速度消失
为了便于控制,不同的速度单独设置
3.添加==噪波速度==,使用nage(规格化的life)混合turbnoise到原速度
4.设置==方向速度==
改变noise与原速度的混合
使用speed作为 noise的乘数,使用nage映射总的的速度
7.依据nage设置density
逐渐失去density
2.rasterize栅格化为volume
栅格化 density,v,设置voxel size和particles scale,设置velocity blur,

3.dopnet smoke sim
1.volumesource
分别使用三个velocity volume作为source
2.对于非sparse的solver,需要设置[gas resize fluid dynamic]
动态的设置容器尺寸,这里可以使用bound
这里设置尺寸是为了可视化
3.对于爆炸的通用参数设置
1.设置timescale, cooling rate, buoyancy
2.对于 advanced, 设置advection类型,BFCC(需要测试),设置 clamp, 设置substep(前十五帧爆炸的开始更多的子步骤)
3.projection方法,设置为 multi grid,更快
4.对于 divergence
1.放入divergence, 系统要保持无发散状态,将density向四周扩散.像压力
5.在popnet内部创建divergence场
1.创建非静止的divergence field(在外部是静止的),将点散布到density volume内部
2.使用sopsolver
3. 使用dop import 导入density
4.将点放到接近表面的位置
1.将density转化为polygon,scatter点
5.设置属性,id,pscale,divergence
设置id随机,设置pscale(根据pscale大小创建volume), 设置div.设置life

6.合并, life自加1

7.设置大于5-15帧为从1到0.
9.设置div很小时,移除点
10.color 设置颜色
6.创建div场
1.使用[ gasmatchfield ]创建空的场div
2.使用[ gasparticletofield ]节点,将粒子转换为场
7.从自定义的div场中获取信息放到divergence场中
1.使用[ gascalculate ]节点,复制div场中的信息到divergence场(也可以修改参数)
2.[ gaslinearcombination ]节点,清除div场
使用div乘以0,即清除信息
8.使用速度场平流div粒子,让粒子随着速度移动(否则只是在固定位置scatter点)
[ gasadvect ]节点
9.repeating
1.添加一个[ gasrepeatsolver ]节点
2.[ switchvalue ]节点 切换data
3.设置为set always
4.排除一些不需要重复的步骤
[ gasintermittentsolver ]节点,设置only once 每个时间步长
2.设置resize也只需要运行一次
10.调整
gascalculate设置always
11.turbulence (湍流)
[ gasturbulence ]节点
原理:基于vel创建一个forcevel_temp的场,创建其他场
主要是curl noise
control field:可以使用不同的场控制(自定义应用turbulence的volume)
设置:使用可视化visualization ,
[ gasmatchfield ]节点 创建speed 场,使用[ gasanalysis ]节点计算vel的值
使用[scalarfieldvisualization]可视化
为temperature和density分别设置turbulence,使用speed作为control field
设置三个turbulence,
12.使用disturbance 分解平坦的区域,打破表面
1.原理:从vel 生成场,
2.创建disturbance,应用到高速区域,使用speed field作为control field
设置不同的尺寸(block size),需要测试
13.[ gasvortexconfinement ]节点,(涡流约束),视图重现被模糊的漩涡,增加更多细节。(降低模拟中的数值扩撒,模糊)
原理:计算vel的curl
2.计算curl的curlmag
3.计算curlmag的梯度作为vortexdir
4.normalization 规格化方向
5.[ gascross ]节点,计算curl与curldir的叉积
2.设置vortexconfinement
14.使用[ gaslocalsharpen ]节点,抵消density field因为advection的扩散
使density锐化(更有对比)

15.添加color mask
1.可以为source point的CD添加噪波
2.为每个箭头设置不同颜色属性
箭头与trailing有关,这里内部的trailindex属性
由于被删除,这里可以恢复该属性
3.可以根据trailindex为每个箭头设置颜色
4.设置color mask
5.加入rasterize,栅格化color_mask,和Alpha
设置Alpha
6.在模拟中设置field.
使用Alpha作为权重,blend模式
16.设置rest field用于后期处理
17.dopimportfield
添加field
18.使用[pyropostprocess]将其转化为VDB再存储
resample vel以便于速度模糊
4.render
[ pyrobakevolume ] 节点着色
使用smoke_mask混合,拆分RGB混合,以每个通道作为bias混合对应的颜色和原本色
在着色之前clamp density
5.vorticles
在工具架中的示例,seed vorticles

应用的force 叫做[ gasvorticlesforces ]
添加vorticles,将点scatter到表面.
1.创建subsolver(与advection合并)

2.拷贝一个dopimport,设置导入density
3.scatter point
添加jitter
4.添加[ gasvorticlesgeometry ]节点,设置为geometry
5.设置pscale,依据vorticles geometry的 radius
同样设置mag
6.设置id属性
7.设置id,导出为3D的up属性
8.设置age=0;合并
9.age自增,删除粒子
10.设置advection
11.设置[ gasvelocitystretch ].随着移动重定向向量
12.添加[ gasintermittentsolver ] ,[enablesolver]
13.设置[ gasvorticlesforces ]
6.shockwave冲击波
1.circle,scatter
2.设置中心渐变
3.设置noise,依据中心距离,输出为v
4.popnet 粒子模拟,只在第一帧生成粒子
1.添加pop drag(直接模拟太过于线性)
2.设置gravity
5.爆炸source一样,设置line,添加noise
6.smoke sim
7.碎片,rigbodysolver

版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
彬的特效学习指南!
喜欢就支持一下吧