其它模块

除不可压缩性、粘性、表面张力核心求解器外,粒子系统中还包含有辅助模块。本节将对这些辅助模块进行简要的介绍。

1. 粒子发射器

每一帧都会输出一定量的流体粒子。现阶段PeriDyno中包含有两种粒子发射器,分别为方形粒子发射器和圆形粒子发射器,在PeryDyno工程中的路径为:

"Engine/Dynamics/ParticleSystem/Module/SquareEmitter.cu";
"Engine/Dynamics/ParticleSystem/Module/SquareEmitter.h";

以及

"Engine/Dynamics/ParticleSystem/Module/CircularEmitter.cu";
"Engine/Dynamics/ParticleSystem/Module/CircularEmitter.h";

这两种粒子发射器有共同的基类,即:

"Engine/Dynamics/ParticleSystem/Module/ParticleEmitter.cu";
"Engine/Dynamics/ParticleSystem/Module/ParticleEmitter.h";

两种发射器都可以通过代码或在GUI界面中修改粒子间距(samplingDistance)、粒子初速度(initialVelocity)、方向(Rotation),以及发射器的尺寸大小(weight/hight/Radius)。

2. 边界约束(节点)

边界约束节点是粒子所在空间中的边界。

"Engine/Dynamics/ParticleSystem/Module/BoundaryConstraint.h";

当该模块检测到粒子穿入边界之外时,粒子会被修正边界附近,同时会修正相应粒子的速度,对粒子施加滑移边界条件、无滑移边界条件或结于两种条件之间的条件。粒子的速度修正方式由参数 TangentialFriction (切向摩擦系数) 与 NormalFriction(法向摩擦系数)来控制。

为了快速地检测边界与粒子的距离,该模块中的边界为有向距离场形式(SDF)。边界约束节点模块中预制了解析式生成的球体边界(Sphere)和六面体边界(Cube),此外也可以通过函数load直接载入有向距离场模型文件。

该节点中,也可以设置粒子可运动的空间是位于封闭边界的内部或外部(inverted)。

3. 核函数

SPH法中的核函数。

"Engine/Dynamics/ParticleSystem/Module/Kernel.h";

该模块中包含有以下几类核函数:

  • SpikyKernel,较为尖锐的核函数;
  • ConstantKernel,常数;
  • SmoothKernel,平滑核函数;
  • CorrectedKernel,修正后的核函数(避免粒子距离过近而导致奇点问题)
  • CubicKernel,三次样条函数形式的核函数;
  • QuarticKernel,四次样条函数形式的核函数。

4. 粒子速度耗散模块

按一定比例耗散粒子速度的模块。

"Engine/Dynamics/ParticleSystem/Module/LinearDamping.h";

5. 粒子积分模块

即粒子速度、位置更新模块。

"Engine/Dynamics/ParticleSystem/Module/ParticleIntegrator.h";

根据粒子所受到的力更新其速度,并根据其速度更新其位置。

6. 密度计算模块

用于计算粒子的质量密度的模块。

"Engine/Dynamics/ParticleSystem/Module/SummationDensity.h";

该模块也可根据粒子的初始间距、静态质量,计算出每个粒子的质量。

7. 粒子属性

为了模拟流体以外的材料及其与流体之间的耦合,场景中的粒子需要标记为不同的材料属性和可运动属性。这一特性的标记见Attribute文件,即:

"Engine/Dynamics/ParticleSystem/Attribute.h";

粒子系统中,粒子可以有多种属性,比如:流体(fluid)、刚体(rigid)、弹性材料(elastic)、塑性材料(plastic)。此外也可将粒子标记为可运动(dynamic)、不可运动(fixed)、通过关键帧控制的运动(passive)等。

8. 流体模型

流体完整的仿真流程被封装在了model文件中,比如ProjectionBasedFluidModel、PositionBasedFluidModel。这类model文件中包含有粒子邻域查找、不可压缩性计算、粘性计算、速度位置更新等诸多流程。

"Engine/Dynamics/ParticleSystem/Module/PositionBasedFluidModel.h";
"Engine/Dynamics/ParticleSystem/Module/ProjectionBasedFluidModel.h";

9. 节点文件

节点文件中包含有仿真场景中所需要用到所有全局变量,例如场景所有粒子的空间位置数组(Position)、速度数组(Velocity)、力数组(Force)、粒子属性数组(Attribute),法向量数组(Norm)等。同时也包含了管理、分配、释放这些变量所需的函数。

"Engine/Dynamics/ParticleSystem/ParticleFluid.h";
"Engine/Dynamics/ParticleSystem/ParticleSystem.h";
"Engine/Dynamics/ParticleSystem/GhostFluid.h";