一.

1.equations of fluids

纳维斯托克斯方程

image-20250829231543937 image-20250829231456794

1.参数

image-20250829232308548

2.momentum equation 动量方程

image-20250829232544527

3.differential equation 微分方程

不可压缩性条件
image-20250829232554274

4.对于每个粒子的属性

image-20250829232711329

5.对粒子的力force,牛顿第二定律

1.加速度 为速度求导
image-20250829233019585
2.这里的D为 物质导数
3.带入求F
image-20250829233110495

6.第一个力为pressure(压力)

image-20250829233304462
gradient 梯度
image-20250829233342779 image-20250829233405203
取压力的负梯度
image-20250829233451388
将压力带入方程
image-20250829233548996
需要再volume上积分 这里取近似乘以体积
image-20250829233859758
这里的==向量微分运算符==可以作用于标量场或矢量场,有三种方式,产生三种微分运算
image-20250830012215358 image-20250830012429257
==1.与标量场乘法 得到 梯度向量场 gradient==
直接对函数f()求偏导,这里的f()是标量场 例如f(x,y,z)=density,在某一位置的密度值。求其偏导,使用==中心差分法==,即每个轴方向前后两个值==相减==除以2,得到对应轴方向的分量,最终的到一个矢量场-梯度
image-20250830013833423 image-20250830012816318
指向f增加最快的方向,因为求的是导数,变化率。比如速度在时间上的变化率为加速度,即每一秒增加多少速度。
==2.与向量场点乘 得到 散度标量场 divergence==
image-20250830015057901
取每个轴方向上的前后两个(位置的)向量,再以对应轴上对应的分量中心差分法求偏导数,将三个偏导数相加即为散度。
这里散度大于0为流出(源),小于0为流入(汇),等于0表示流入等于流出
==3.与向量场叉乘 得到 旋度向量场 curl==
image-20250829234151719 image-20250830012203542
旋度计算,
image-20250830020704238 image-20250830020839795
涡流 vorticity 速度场的旋度。

注意:偏导数 表示函数在某一点沿着某一坐标轴方向的变化率(使用差分法)

例如SDF中的梯度gradient
对于标量值的volume,梯度指向外
image-20250829234818800

7.第二种流体力由viscosity提供(粘度)

测量某个量与周围平均值差距的微分算子是==拉普拉斯算子==
在液滴体积上积分
image-20250829235156316
使用==动态粘度系数==
image-20250829235249635
带入方程
image-20250829235306511
当粒子数量趋于无穷大,粒子大小趋于0,取极限,所以除以体积取极限
image-20250829235650680
这里的m/V,即为==流体密度==
image-20250829235738977
得到方程
image-20250829235756552
两边除以密度
image-20250829235827908

8.进一步简化方程

动态粘度系数 除以 流体密度 得到 ==运动粘度kinematic viscosity==
image-20250830000139372

9.对于流体运动,有两种追踪运动的方式,拉格朗日观点 和 欧拉观点

image-20250830000939011
lagrangian 将流体看作粒子系统
image-20250830000725309
eulerian 观察空间中固定的点
image-20250830000846808

10.物质导数

image-20250830001440263
物质导数是总的变化率,由==当地导数==,加上==对流导数==
这里的对流导数与散度差别
image-20250830022715017
第一项是 q的导数,q的变化率
第二项 是修正correcting 流体经过差异(微分)的变化
image-20250830023324182

11.==advection== (平流)是物质导数的第二部分

通过流体运动运输某个量(quantity),比如density field(密度场)
image-20250830004057204
设置advection 为 0
image-20250830004134675
使用velocity advect velocity,称为self-advection,==将速度场沿着流线方向运输==
image-20250830005107769
平流的计算:
image-20250830024048029 image-20250830024106486
去除viscosity粘度
image-20250830005155366

12. 纳维斯托克斯方程忽略粘度叫做 欧拉方程

image-20250830005702813

13.incompressibility 不可压缩性条件

image-20250830005803773
满足 此条件的场 称为==divergence-free 无发散==场
计算方法:
使用压力投影pressure projection,找到一个压力场,以此修正速度场,使新速度场的散度为0.
image-20250830025737755
使用 压力泊松方程 PPE(pressure poisson equation),求解压力场
泊松方程
image-20250830030642577
压力泊松方程
image-20250830030659209
在修正预测速度场,以得到最终的速度场

14.divergence

image-20250830024602193
先self-advection(自平流),再施加forces,再projection(满足无发散条件)
image-20250830024726313

补充1:---------------------------------------------

1.在向量场中,(x,y,z)用于表示一个点的位置。(u,v,w)表示向量场u,的分量函数。

image-20250831214558423 image-20250831214921135 image-20250831214911397

2.拉普拉斯算子Laplacian (通常形成梯度的散度 即两次偏导,▽·▽)

image-20250831215314447

偏微分方程▽·▽f = 0,称为拉普拉斯方程,右边非零则称为泊松方程。▽·▽f = q。也可以将梯度乘以标量场 仍然是泊松问题 ,▽·(a▽f) = q

3.微分恒等式(或者叫做vector calculus identities)的应用

image-20250831221004575

这里由改变偏导顺序结果不变推出(函数平滑 即任意阶的导数都存在且连续)

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,这个向量势ψ称之为流函数

image-20250831225926260

4.积分恒等式(integral identities)

1.高斯散度定理

散度是每个点的流入流入,通量是穿过曲面的总流量,这里的思想即是 体积内的流入流出的流体总和(体积积分)等于通过这个体积边界流入流出的通量(面积积分)
image-20250831234104844
==矢量场u的散度的体积积分 等于 矢量场u的边界积分==,n是单位法向量
image-20250831234944264

数学定义

image-20250831235309848 image-20250831235353692

5.张量 tensor

简化的表示方法

image-20250901001018326

6.数值方法 numerical methods

有限差异方法 泰勒级数

image-20250901001746360

1.空间的有限差异 (finite differences in space)

一阶精度
image-20250901121243217
使用q^i+1^ ,q^i-1^ 获得二阶精度
image-20250901121441595
中心有限差
image-20250901121517862

2.时间积分(time integration)

7.不可压缩欧拉方程(the incompressible Euler equations)

不可压缩性条件的推导

1.对于流体,总质量是密度的体积积分,总动量是密度速度的体积积分

image-20250901004409511

2.质量M的变化率 由质量进出速度边界积分给定,

image-20250901004422512

3.转化为散度定理的体积积分

image-20250901004511162

4.展开质量M

image-20250901004535733

5.连续性方程 与 不可压缩性条件

1.不可压缩流体密度的导数为0(变化率为0)
2.密度不变,即速度的散度为0
image-20250901004014155

8.对于物质导数(material derivative)

1.拉格朗日视角:存在 位置为x,速度为u ,的粒子

2.观察一个通用的量q(密度,速度,温度...)

3.函数==q(t,x)==,是恰好在时间t,位置x处的粒子的q的值(这是一个欧拉变量,他是空间的函数而不是粒子的函数)

4.q的变化速度有多快? 对于位置由函数==x(t)==给出的粒子(拉格朗日问题)

取总导数(使用链式法则)
image-20250902180230566

5.平流advection,意味着q并没有变化(在拉格朗日观点中),只是在移动

image-20250902182139648

拉格朗日导数为0(每个粒子都由一个q值,只是粒子在移动,粒子的q值不变),但欧拉导数会变化(即q在空间固定点的变化速率)

------------------------------------------------

补充2-------------------------------------------

2d模拟流体

两种网格存储速度场

image-20250911161837423

步骤

image-20250911161921251
1.更新速度
image-20250911162102948
2.使流体不可压缩
image-20250911165750329 image-20250911170847169 image-20250911170854719
3.平流速度场 advection

------------------------------------------------

2.volumes

转换为volume的方式

从object创建volume

1.isooffset
2.VDB
3.pyro source

创建空volume

1.volume
image-20250830155443686

以已有的point和空的volume 创建volume,使用[volumerasterize]节点

image-20250830155532798

[ volumerasterizattributes ]节点

3.custom solver

1.使用isooffset创建density

2.dopnet

1.smoke object

2.smoke solver

3.volume source

3.创建自定义solver

1.使用[multisolver],自定义求解器的基础

image-20250911192206509
date,force

2.使用[emptyobject],创建容器(基本容器,可以附加各种数据)

image-20250830161134230

3.使用[sopcalarfield],基于sop中的density 创建标量场density

image-20250830163402235

4.设置为density

image-20250830163556114

5.可视化 ,使用[scalar field visualization] 节点

image-20250830163917181

6.同理添加一个temperature field

image-20250830164233072 image-20250830164334740 image-20250830164348248

7.创建一个空的 velocity 场

[sopvectorfield]节点添加一个速度场,使用faces存储,sop path为空,dataname为vel
image-20250830164755494 image-20250830164834690
可视化使用[ vectorfieldvisualization ]
image-20250830164906187

使用[ gasbuoyancy ]节点,根据温度场计算浮力,并更新速度场

image-20250911195250432
但是仍然不会对density产生影响,还需要平流==advection==。
image-20250911195326077

8.平流 使用[ gasadvectfield ] 节点

image-20250911200843912
先对vel速度场自平流(使用vel平流vel),再添加gasbuoyancy浮力,再平流density密度场,temperature温度场(后两个可以一起)
image-20250911201149896

9.去除速度场的发散分量

[ gasprojectnondivergent ]节点,在添加浮力之后使用,
image-20250911201303342 image-20250830165854526
没有使用无发散速度场的
image-20250911211526768
使用无发散速度场的
image-20250911211616138 image-20250911211623155 image-20250911211631007

11.添加自定义的速度场 frome cam

image-20250830170804245

4.设置碰撞 collision

1.设置物体,转换为SDF,并添加速度属性(生成一个速度的向量场)

image-20250911214149611 image-20250911214243720

2.设置[ staticobject ]

image-20250830210824129

3.设置static object为 collision 物体

image-20250830210937543
设置volumesample

4.[ gasenforceboundary ] 节点 在field上执行边界条件

image-20250911230359944
这里未指定碰撞值时(默认),先将碰撞场内的点的场(如速度场)设置为0,再将碰撞体内部的未经过压力投影处理的速度场清零
image-20250830212153548
指定vel
image-20250830211715981 image-20250830211734909
放置到投影之前
image-20250830211756185

5.使用[ gasmatchfield ]节点,创建基于参考场(density)的空场(collision碰撞场)

image-20250911230425101 image-20250830211902439

6.[ gasbuildcollisionmask ]节点 ,生成一个碰撞场(collision是SDF),和一个碰撞速度场(collisionvel)

image-20250911230450752 image-20250911222247994 image-20250830212623940

7.使用[ sopmergefield ]节点,合并外部VDB速度场,使速度场更精确

image-20250911231048148 image-20250911231035372 image-20250830212722905 image-20250830212731322 image-20250830212802685

持续输入density问题

先创建一个emit发射场(在source的同样位置),

image-20250912175432798

在advect density,平流密度之后使用emit场向density场添加。这里可以设置减小添加量

image-20250912175531956 image-20250912175709450

注意不同的border type效果也不一样

image-20250912183903011

多重碰撞问题

设置速度场的边界,closed ends,即可实现在边界范围
image-20250912172551648
在[ gasprojectnondivergenct ]节点设置surface field 为collision,可以解决穿透问题
多个碰撞物体可以设置多个static object
image-20250912172702388

8.第5步也可以在开始设置好collision场 和 collisionvel场

image-20250912014802043 image-20250912094444468

5.[ gasprojectnondivergentmultigrid ]新的投影方法

image-20250830213526756

4.smoke solver

1.在smoke object内部也是同样的emptyobject

image-20250830223612916

smokeobject 用于创建不同field(density ,temperature...)

image-20250830223851696 image-20250830223724591

2.注意: 场field需要放置信息,否则只是空场

2.三种 advection方法

二.explosion

爆炸:

1.创建source

1.使用[pyroburstsource]节点,创建粒子

设置较少的粒子,减小thickness和separation

image-20250926170151108 image-20250926170206765

使用添add点控制爆炸的位置

image-20250926170538880

2.创建形状

依据每一条线的curveu设置属性

官方的代码是使用起点的位置和终点位置映射

image-20250901143845398

可以使用pscale 映射,==但是pscale属性在爆炸时会发生变化==

image-20250901144214900

3.以起点终点生成线,设置属性

image-20250901144301044

1.打开rest属性,使用rest position,由于粒子数量不变id不变,以此计算最后一帧与rest位置的向量

image-20250926172154488

计算当前点的当前位置与rest(初始)位置的距离作为放缩line的参数

image-20250926174219125

2.创建line,copytopoint,line指向-z方向

image-20250926174331848

3.使用dist作为pscale放缩line的长度(原本是以point的pscale作为line的长度)

image-20250926174658085

image-20250926174704606

4.使用popnet 模拟设置爆炸动画

设置随机的airresist,不在第一帧工作,上面的airresistance参数才生效

image-20250926195218094 image-20250926200045403
注意这里的airresist,如果使用fit则不论参数设置多少都映射到对应的区间,如果使用if条件大于多少帧运行则使用固定值。
image-20250926200138416

5.设置jitter,使用jitter节点是在直线的截面方向,这里设置沿线方向移动点

image-20250901155946460
沿速度的反方向点位置随机移动,计算当前位置减去速度的位置作为新的位置
使用随机值混合原位置与反向移动的位置
image-20250926201700589 image-20250926201709121

6.使用nage = age/life映射pscale,使line由大变小

image-20250926212520172

7.删除多余的属性个组

image-20250926212418918

8.使用resample重采样增加分辨率,再依据curveu设置pscale,使其line从底部到顶端由大变小

由于discs模式只对点生效,这里查看对应的pscale时,需要添加一个add节点删除geometry保留点

image-20250926213316993

使用curveu设置pscale,再将age作为乘数,使pscale随age逐渐变小

image-20250926214103735

9.应用noise

image-20250901170351655

1.使用curveu映射noise值,使其底部大顶点小

image-20250901170447128

2.使用measure节点 测量prim的长度,以此作为噪波的乘数

当line变短的时候应用更小的噪波,保持噪波的比例更加合理

image-20250926215723899

10.设置速度velocity

1.规格化life(age/life),

image-20250901170930823

2.==起始速度== 使用nage(规格化的life)映射velociity,使得开始的速度更大,结束的速度消失

image-20250927111355570 image-20250927111409070
为了便于控制,不同的速度单独设置

3.添加==噪波速度==,使用nage(规格化的life)混合turbnoise到原速度

image-20250927112900573

4.设置==方向速度==

改变noise与原速度的混合
image-20250927112913351
使用speed作为 noise的乘数,使用nage映射总的的速度
image-20250901172107137

7.依据nage设置density

逐渐失去density

image-20250901172326821

2.rasterize栅格化为volume

栅格化 density,v,设置voxel size和particles scale,设置velocity blur,

image-20250927114128686

3.dopnet smoke sim

image-20250901172747850

1.volumesource

分别使用三个velocity volume作为source

image-20250901173000031

2.对于非sparse的solver,需要设置[gas resize fluid dynamic]

动态的设置容器尺寸,这里可以使用bound

image-20250901173317275

这里设置尺寸是为了可视化

image-20250901173419279

3.对于爆炸的通用参数设置

1.设置timescale, cooling rate, buoyancy

image-20250901173533883

2.对于 advanced, 设置advection类型,BFCC(需要测试),设置 clamp, 设置substep(前十五帧爆炸的开始更多的子步骤)

image-20250901173901635

3.projection方法,设置为 multi grid,更快

4.对于 divergence

1.放入divergence, 系统要保持无发散状态,将density向四周扩散.像压力

image-20250901174518711

5.在popnet内部创建divergence场

1.创建非静止的divergence field(在外部是静止的),将点散布到density volume内部

image-20250901175007437

2.使用sopsolver

image-20250901175127041

3. 使用dop import 导入density

image-20250901175309406

4.将点放到接近表面的位置

1.将density转化为polygon,scatter点
image-20250901175610936

5.设置属性,id,pscale,divergence

设置id随机,设置pscale(根据pscale大小创建volume), 设置div.设置life

6.合并, life自加1

image-20250927151222992

7.设置大于5-15帧为从1到0.

image-20250901194700282

9.设置div很小时,移除点

image-20250901194814755

10.color 设置颜色

image-20250901195125040

6.创建div场

1.使用[ gasmatchfield ]创建空的场div

image-20250901195210648

2.使用[ gasparticletofield ]节点,将粒子转换为场

image-20250901195449731 image-20250901195534530

7.从自定义的div场中获取信息放到divergence场中

1.使用[ gascalculate ]节点,复制div场中的信息到divergence场(也可以修改参数)

image-20250901195838358

2.[ gaslinearcombination ]节点,清除div场

使用div乘以0,即清除信息
image-20250901201959072

8.使用速度场平流div粒子,让粒子随着速度移动(否则只是在固定位置scatter点)

[ gasadvect ]节点

image-20250901202341859

9.repeating

1.添加一个[ gasrepeatsolver ]节点

image-20250901202815628

2.[ switchvalue ]节点 切换data

image-20250901202852949

3.设置为set always

image-20250901203023610

4.排除一些不需要重复的步骤

[ gasintermittentsolver ]节点,设置only once 每个时间步长
image-20250927190308024 image-20250901222007419
2.设置resize也只需要运行一次
image-20250901222128020

10.调整

gascalculate设置always

image-20250927190610438

11.turbulence (湍流)

[ gasturbulence ]节点

原理:基于vel创建一个forcevel_temp的场,创建其他场

image-20250904152854581 image-20250904152948295
主要是curl noise

control field:可以使用不同的场控制(自定义应用turbulence的volume)

设置:使用可视化visualization ,

image-20250904153807841

[ gasmatchfield ]节点 创建speed 场,使用[ gasanalysis ]节点计算vel的值

image-20250904154045821 image-20250904154212272
使用[scalarfieldvisualization]可视化
image-20250904154327105

为temperature和density分别设置turbulence,使用speed作为control field

设置三个turbulence,
image-20250904154745861

12.使用disturbance 分解平坦的区域,打破表面

image-20250904154928258

1.原理:从vel 生成场,

image-20250904155102741

2.创建disturbance,应用到高速区域,使用speed field作为control field

设置不同的尺寸(block size),需要测试
image-20250904160255671 image-20250904160339368

13.[ gasvortexconfinement ]节点,(涡流约束),视图重现被模糊的漩涡,增加更多细节。(降低模拟中的数值扩撒,模糊)

image-20250904161435884

原理:计算vel的curl

image-20250904161548796 image-20250904161643991
2.计算curl的curlmag
3.计算curlmag的梯度作为vortexdir
image-20250904161711937
4.normalization 规格化方向
5.[ gascross ]节点,计算curl与curldir的叉积
image-20250904161854613

2.设置vortexconfinement

image-20250904162229858

14.使用[ gaslocalsharpen ]节点,抵消density field因为advection的扩散

image-20250904162444145

使density锐化(更有对比)

image-20250904162617261

image-20250904162751578

15.添加color mask

1.可以为source point的CD添加噪波

image-20250904163247625

2.为每个箭头设置不同颜色属性

箭头与trailing有关,这里内部的trailindex属性
image-20250904163619887
由于被删除,这里可以恢复该属性
image-20250904163708748

3.可以根据trailindex为每个箭头设置颜色

image-20250904163820896

4.设置color mask

image-20250904163916069

5.加入rasterize,栅格化color_mask,和Alpha

image-20250904164200217
设置Alpha
image-20250904164132741

6.在模拟中设置field.

使用Alpha作为权重,blend模式
image-20250904164248142

16.设置rest field用于后期处理

image-20250904164443278

17.dopimportfield

image-20250904164555327

添加field

image-20250904164619594

18.使用[pyropostprocess]将其转化为VDB再存储

resample vel以便于速度模糊
image-20250904164753993

4.render

[ pyrobakevolume ] 节点着色

使用smoke_mask混合,拆分RGB混合,以每个通道作为bias混合对应的颜色和原本色
image-20250904193249379

在着色之前clamp density

image-20250904193410414

5.vorticles

在工具架中的示例,seed vorticles

image-20250904193652836

应用的force 叫做[ gasvorticlesforces ]

image-20250904194121353

添加vorticles,将点scatter到表面.

1.创建subsolver(与advection合并)

image-20250904194413639

2.拷贝一个dopimport,设置导入density

image-20250904194620899

3.scatter point

image-20250904194714054

添加jitter

image-20250904194809627

4.添加[ gasvorticlesgeometry ]节点,设置为geometry

image-20250904194917910 image-20250904195151015

5.设置pscale,依据vorticles geometry的 radius

image-20250904195242080

同样设置mag

image-20250904195340061

6.设置id属性

image-20250904195508185

7.设置id,导出为3D的up属性

image-20250904200144563

8.设置age=0;合并

image-20250904200228876

9.age自增,删除粒子

image-20250904200303119

10.设置advection

image-20250904200357350

11.设置[ gasvelocitystretch ].随着移动重定向向量

image-20250904200454556

12.添加[ gasintermittentsolver ] ,[enablesolver]

image-20250904200824590

13.设置[ gasvorticlesforces ]

image-20250904200929640

6.shockwave冲击波

1.circle,scatter

image-20250904201533358

2.设置中心渐变

image-20250904201632034

3.设置noise,依据中心距离,输出为v

image-20250904201721085

4.popnet 粒子模拟,只在第一帧生成粒子

image-20250904201832520

1.添加pop drag(直接模拟太过于线性)

image-20250904201941697

2.设置gravity

5.爆炸source一样,设置line,添加noise

image-20250904202121382

6.smoke sim

7.碎片,rigbodysolver

image-20250904203033155

image-20250904203048336

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