等值面提取

1、等值面提取

案例位置examples/Cuda/QtGUI/Qt_MarchingCubes

功能介绍:该案例包含两个示例,介绍 MarchingCubes 类与 VolumeClipper 类的使用。示例1展示了等值面提取 (Marching Cubes,MC) 算法功能。等值面提取算法 (MC) 一种用三维标量场表示的等值面来创建多面体表面。示例2展示了有向距离场 (Signed Distance Field,SDF) 的切平面的数值可视化功能。在模型有向距离场 (Signed Distance Field,SDF) 空间中切一个平面,将有向距离场 (Signed Distance Field,SDF) 的数值投影到平面上,并根据数值大小将赋予平面不同的颜色。

案例说明: 示例1展示了等值面提取算法 (Marching Cubes,MC) 算法功能。通过修改 MarchingCubes 节点的 Grid Spacing 属性,可以动态的增加或减少模型的面片数。示例2展示有向距离场 (Signed Distance Field,SDF) 可视化功能。通过修改 VolumeClipper 节点的 RotationTranslation 属性,可以对模型不同位置的切面进行有向距离场 (Signed Distance Field,SDF) 可视化。

  • 等值面提取算法 (Marching Cubes,MC):

  • 有向距离场 (Signed Distance Field,SDF) 可视化:

2、程序实现

接下来介绍案例的实现过程:

示例1:

  • 创建场景图及边界:
	std::shared_ptr<SceneGraph> scn = std::make_shared<SceneGraph>();

  • 创建MarchingCubes类:
	auto marchingCubes = scn->addNode(std::make_shared<MarchingCubes<DataType3f>>());
  • 创建渲染节点:
	auto isoSurfaceVisualizer = scn->addNode(std::make_shared<GLSurfaceVisualNode<DataType3f>>());
	marchingCubes->outTriangleSet()->connect(isoSurfaceVisualizer->inTriangleSet());

示例2:

  • 创建场景图及边界:
	std::shared_ptr<SceneGraph> scn = std::make_shared<SceneGraph>();

  • 创建VolumeClipper类:
	auto clipper = scn->addNode(std::make_shared<VolumeClipper<DataType3f>>());

	auto colorMapper = std::make_shared<ColorMapping<DataType3f>>();
	colorMapper->varMin()->setValue(-0.5);
	colorMapper->varMax()->setValue(0.5);
	clipper->stateField()->connect(colorMapper->inScalar());
	clipper->graphicsPipeline()->pushModule(colorMapper);
 
 	auto surfaceVisualizer = std::make_shared<GLSurfaceVisualModule>();
	surfaceVisualizer->varColorMode()->getDataPtr()->setCurrentKey(1);
 	colorMapper->outColor()->connect(surfaceVisualizer->inColor());
	clipper->stateTriangleSet()->connect(surfaceVisualizer->inTriangleSet());
	clipper->graphicsPipeline()->pushModule(surfaceVisualizer);