除不可压缩性、粘性、表面张力核心求解器外,粒子系统中还包含有辅助模块。本节将对这些辅助模块进行简要的介绍。
每一帧都会输出一定量的流体粒子。现阶段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)。
边界约束节点是粒子所在空间中的边界。
"Engine/Dynamics/ParticleSystem/Module/BoundaryConstraint.h";
当该模块检测到粒子穿入边界之外时,粒子会被修正边界附近,同时会修正相应粒子的速度,对粒子施加滑移边界条件、无滑移边界条件或结于两种条件之间的条件。粒子的速度修正方式由参数 TangentialFriction (切向摩擦系数) 与 NormalFriction(法向摩擦系数)来控制。
为了快速地检测边界与粒子的距离,该模块中的边界为有向距离场形式(SDF)。边界约束节点模块中预制了解析式生成的球体边界(Sphere)和六面体边界(Cube),此外也可以通过函数load直接载入有向距离场模型文件。
该节点中,也可以设置粒子可运动的空间是位于封闭边界的内部或外部(inverted)。
SPH法中的核函数。
"Engine/Dynamics/ParticleSystem/Module/Kernel.h";
该模块中包含有以下几类核函数:
按一定比例耗散粒子速度的模块。
"Engine/Dynamics/ParticleSystem/Module/LinearDamping.h";
即粒子速度、位置更新模块。
"Engine/Dynamics/ParticleSystem/Module/ParticleIntegrator.h";
根据粒子所受到的力更新其速度,并根据其速度更新其位置。
用于计算粒子的质量密度的模块。
"Engine/Dynamics/ParticleSystem/Module/SummationDensity.h";
该模块也可根据粒子的初始间距、静态质量,计算出每个粒子的质量。
为了模拟流体以外的材料及其与流体之间的耦合,场景中的粒子需要标记为不同的材料属性和可运动属性。这一特性的标记见Attribute文件,即:
"Engine/Dynamics/ParticleSystem/Attribute.h";
粒子系统中,粒子可以有多种属性,比如:流体(fluid)、刚体(rigid)、弹性材料(elastic)、塑性材料(plastic)。此外也可将粒子标记为可运动(dynamic)、不可运动(fixed)、通过关键帧控制的运动(passive)等。
流体完整的仿真流程被封装在了model文件中,比如ProjectionBasedFluidModel、PositionBasedFluidModel。这类model文件中包含有粒子邻域查找、不可压缩性计算、粘性计算、速度位置更新等诸多流程。
"Engine/Dynamics/ParticleSystem/Module/PositionBasedFluidModel.h";
"Engine/Dynamics/ParticleSystem/Module/ProjectionBasedFluidModel.h";
节点文件中包含有仿真场景中所需要用到所有全局变量,例如场景所有粒子的空间位置数组(Position)、速度数组(Velocity)、力数组(Force)、粒子属性数组(Attribute),法向量数组(Norm)等。同时也包含了管理、分配、释放这些变量所需的函数。
"Engine/Dynamics/ParticleSystem/ParticleFluid.h";
"Engine/Dynamics/ParticleSystem/ParticleSystem.h";
"Engine/Dynamics/ParticleSystem/GhostFluid.h";