本文已参与「新人创作礼」活动,一起开启掘金创作之路。
BestMPRBaseVtk 给测试程序增加3D体渲染
上一篇不是把图像的显示方向问题解决了吗,后面博士让我搞一下鼠标事件,最近有点神烦的,不想搞,正好我的测试程序准备完善一点,把原来vtkImageViewer2的位置给他换了,换成一个3D的。
关键字:
vtkContourFilter
、vtkPolyDataNormals
、vtkPolyDataMapper
、vtkActor
、vtkRenderer
增加3D体渲染
其实3D渲染整体还是vtk的标准流水线原则数据
->过滤器
->映射器
->Actor
->渲染器
->Window
+交互器
,理解起来简答,搞起来难。
那么久直接上代码
//读取Dicom文件
vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
reader->SetDirectoryName(url);
reader->SetDataSpacing(3.2, 1.5, 1.5);
reader->Update();
//这是一个过滤器,官方翻译如下
//vtkContourFilter是一个过滤器,它将任何数据集作为输入,并在输出等值面和/或等值线上生成。
//输出的确切形式取决于输入数据的维数。 由3D单元格组成的数据将生成等值面,由2D单元格组成的数据将生成等值线,
//由1D或0D单元格组成的数据将生成等点。 如果输入维度是混合的,输出类型的组合是可能的。
//若要使用此筛选器,必须指定一个或多个轮廓值。 您可以使用SetValue()方法来指定每个轮廓值,也可以使用GenerateValues()来生成一系列均匀间隔的轮廓。
//还可以通过使用vtkScalarTree来加速这个过滤器的操作(以额外的内存为代价)。 标量树用于快速定位包含轮廓曲面的单元。 这是特别有效的,如果多个轮廓被提取。
//如果您想要使用标量树,请调用方法UseScalarTreeOn()。
vtkSmartPointer<vtkContourFilter> skinExtractor = vtkSmartPointer<vtkContourFilter>::New();
skinExtractor->SetInputConnection(reader->GetOutputPort());
skinExtractor->SetValue(0, 500);
//vtkPolyDataNormals是一个为多边形网格计算点和/或单元法线的过滤器。
//用户通过设置ComputeCellNormals和ComputePointNormals标志来指定他们是否希望计算点和/或单元格法线。
vtkSmartPointer<vtkPolyDataNormals> skinNormals = vtkSmartPointer<vtkPolyDataNormals>::New();
skinNormals->SetInputConnection(skinExtractor->GetOutputPort());
skinNormals->SetFeatureAngle(60.0);
vtkSmartPointer<vtkPolyDataMapper> skinMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
skinMapper->SetInputConnection(skinNormals->GetOutputPort());
skinMapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor> skin = vtkSmartPointer<vtkActor>::New();
skin->SetMapper(skinMapper);
vtkSmartPointer<vtkRenderer> aRenderer = vtkSmartPointer<vtkRenderer>::New();
aRenderer->SetBackground(0, 0, 0);
aRenderer->ResetCameraClippingRange();
ui->openGLWidget->renderWindow()->AddRenderer(aRenderer);
aRenderer->AddActor(skin);
ui->openGLWidget->renderWindow()->Render();
演示效果
☞ 源码
源码链接:GitHub仓库自取
使用方法:☟☟☟
