粒子发射器

1、粒子发射器

粒子发射器通过限定粒子活动范围的,并给定随机产生的粒子一个初始位移和速度,来模拟流体。发射器是根据每个单独的发射器项的设置在模拟中生成粒子的元素。对于最简单的模拟,需要一个放射状发射器和一个粒子模拟项。粒子发射后与流体相互作用。

2、程序实现

  • 创建场景图:
	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());

3、仿真效果

在仿真中间创建了一个粒子发射器,粒子发射器和地面的流体发生作用。代码参考example/GL_ParticleFluid/main.h: