vtk面绘制的实现

如题:将图层数据(vtkimagedata)生成3D对象(vtkpolydata)
示例代码如下:

vtkSmartPointer<vtkMarchingCubes> pMarchingCubes = vtkSmartPointer<vtkMarchingCubes>::New();
    pMarchingCubes->SetInputData(vtkimagedata);
    pMarchingCubes->SetNumberOfContours(1);
    pMarchingCubes->SetValue(0, 1);

vtkMarchingCubes简称MC方法,是一个过滤器,该过滤器接受一个体数据的输入(三维规则的点集),输出一个或者多个等值面。使用它,必须给等值面赋值。或者,你可以设定的一个scalar的范围和等值面的间隔来决定这个范围内的一系列的等值面的值。
输出的数据往往有噪声,因此通常会经过一些后续处理,以下是示例代码

 vtkSmartPointer<vtkSmoothPolyDataFilter> pSmoothPolyDataFilter = vtkSmartPointer<vtkSmoothPolyDataFilter>::New();
    pSmoothPolyDataFilter->SetInputConnection(pMarchingCubes->GetOutputPort());
    pSmoothPolyDataFilter->SetNumberOfIterations(m_nNumberOfIterations);
     pSmoothPolyDataFilter->SetRelaxationFactor(0.05);

    vtkSmartPointer<vtkPolyDataNormals> pPolyDataNormals = vtkSmartPointer<vtkPolyDataNormals>::New();
    pPolyDataNormals->SetInputConnection(pSmoothPolyDataFilter->GetOutputPort());
 pPolyDataNormals->SetFeatureAngle(m_nFeatureAngle);

vtkSmoothPolyDataFilter 实现的是Laplacian 平滑,示例中只指定迭代次数和放松因子,迭代次数越多,平滑的越厉害,同时细节损失越严重。放松因子是Laplacian算法的一个参数,在所有的迭代算法中,这个参数控制迭代过程的稳定性。一般情况下小的放松系数和大的迭代次数会使迭代算法的收敛过程更稳定。
另外,可以使用其他变量控制平滑过程,BoundarySmoothing控制是否对边界点平滑。FeatureEdgeSmoothing控制是否对特征边上的点平滑,需用SetFeatureAngle指定特征角阈值,如一条边被两个相邻多边形公用,若这两个多边形的法向量的夹角(特征角)大于定义的阈值,则称该边为特征边。
vtkPolyDataNormals 用于计算polydata的法向量,计算法向量之后会使可视化之后的数据更加平滑,SetFeatureAngle用于设置特征角,两个相邻多边形的角度大于该角,则称多边形的共用边是尖锐的,默认是30度,锐边分裂(splitting)开启,多边形顺序(consistency)一致性开启。
推荐参考以下博客,介绍了体绘制与面绘制的基本实现http://blog.csdn.net/inter_peng/article/details/53931566

你可能感兴趣的:(vtk,等值面,平滑,法向量,面绘制,体绘制)