粒子发射器通过限定粒子活动范围的,并给定随机产生的粒子一个初始位移和速度,来模拟流体。发射器是根据每个单独的发射器项的设置在模拟中生成粒子的元素。对于最简单的模拟,需要一个放射状发射器和一个粒子模拟项。粒子发射后与流体相互作用。
std::shared_ptr<SceneGraph> scn = std::make_shared<SceneGraph>();
//Create a particle emitter
auto emitter = scn->addNode(std::make_shared<ParticleEmitterSquare<DataType3f>>());
emitter->varLocation()->setValue(Vec3f(0.5f));
//Create a particle-based fluid solver
auto fluid = scn->addNode(std::make_shared<ParticleFluid<DataType3f>>());
fluid->loadParticles(Vec3f(0.0f), Vec3f(0.2f), 0.005f);
emitter->connect(fluid->importParticleEmitters());
auto calculateNorm = std::make_shared<CalculateNorm<DataType3f>>();
fluid->stateVelocity()->connect(calculateNorm->inVec());
fluid->graphicsPipeline()->pushModule(calculateNorm);
auto ptRender = std::make_shared<GLPointVisualModule>();
ptRender->setColor(Vec3f(1, 0, 0));
ptRender->setColorMapMode(GLPointVisualModule::PER_VERTEX_SHADER);
ptRender->setColorMapRange(0, 5);
fluid->stateVelocity()->connect(calculateNorm->inVec());
fluid->currentTopology()->connect(ptRender->inPointSet());
calculateNorm->outNorm()->connect(colorMapper->inScalar());
colorMapper->outColor()->connect(ptRender->inColor());
fluid->graphicsPipeline()->pushModule(calculateNorm);
fluid->graphicsPipeline()->pushModule(colorMapper);
fluid->graphicsPipeline()->pushModule(ptRender);
auto container = scn->addNode(std::make_shared<StaticBoundary<DataType3f>>());
container->loadCube(Vec3f(0.0f), Vec3f(1.0), 0.02, true);
fluid->connect(container->importParticleSystems());
在仿真中间创建了一个粒子发射器,粒子发射器和地面的流体发生作用。代码参考example/GL_ParticleFluid/main.h: