海洋仿真

1、案例介绍

案例位置examples/Cuda/HeigthField/GL_Ocean

功能介绍:该案例展示了 Ocean 类、CapillaryWave 类和 OceanPatch 类的基本使用。PeriDyno引擎支持模拟海浪以及水面涟漪的模拟。用户可以设置不同等级的海浪大小,支持0-12级海浪。案例将海浪与水面涟漪的效果进行了耦合。

案例说明:该案例主要用于模拟测试海洋仿真功能。OceanPatch类用于模拟不同等级的海浪;CapillaryWave类用于模拟水面涟漪;Ocean类将两者的仿真结果耦合在一起。如下图所示,海洋中不仅有海浪的运动,同时水面中间有涟漪效果。

2、程序实现

  • 创建场景图:
	std::shared_ptr<SceneGraph> scn = std::make_shared<SceneGraph>();
  • 创建海洋节点,其中通过多个OceanPatch组合成一个大的Ocean。CapillaryWave是用于模拟水上的波纹。
	std::shared_ptr<SceneGraph> scn = std::make_shared<SceneGraph>();

	auto oceanPatch = scn->addNode(std::make_shared<OceanPatch<DataType3f>>());

	auto root = scn->addNode(std::make_shared<Ocean<DataType3f>>());
	root->varExtentX()->setValue(2);
	root->varExtentZ()->setValue(2);
	oceanPatch->connect(root->importOceanPatch());

	auto capillaryWave = scn->addNode(std::make_shared<CapillaryWave<DataType3f>>(512, 512.0f));
	capillaryWave->connect(root->importCapillaryWaves());
  • 创建渲染节点:
	auto mapper = std::make_shared<HeightFieldToTriangleSet<DataType3f>>();

	root->stateHeightField()->connect(mapper->inHeightField());
	root->graphicsPipeline()->pushModule(mapper);

	auto sRender = std::make_shared<GLSurfaceVisualModule>();
	sRender->setColor(Vec3f(0, 0.2, 1.0));
	mapper->outTriangleSet()->connect(sRender->inTriangleSet());
	root->graphicsPipeline()->pushModule(sRender);