海浪模拟

1、案例介绍

案例位置examples/Cuda/HeigthField/GL_OceanPatch

功能介绍:该案例展示了 OceanPatch 类的基本使用。通过对海洋的波形及运动的模拟来实现对不同海洋等级的仿真。利用一系列单元波的振幅、频率、传播方向等参数,经线性叠加合成海浪。根据快速傅里叶变换(FFT)的海浪模拟的思想,利用Phillips波普得到海面的高度场(也就是傅里叶变换的频域),然后将其逆傅里叶变换(IFFT)得到海面(也就是时域),从何实现对海浪的模拟。

案例说明:该案例主要用于模拟测试不同等级的海浪功能。海平面在风的作用力下形成海浪,不同等级的风可以产生不同的海浪。用户通过设定风速等级,从何达到模拟不同等级海浪的效果。

2、程序实现

  • 创建场景图:
	std::shared_ptr<SceneGraph> scn = std::make_shared<SceneGraph>();
  • 创建OceanPatch节点,并将海浪等级设置为8。
	auto root = scn->addNode(std::make_shared<OceanPatch<DataType3f>>());
	root->varWindType()->setValue(8);
  • 创建渲染节点:
	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));
	sRender->varUseVertexNormal()->setValue(true);
	mapper->outTriangleSet()->connect(sRender->inTriangleSet());
	root->graphicsPipeline()->pushModule(sRender);