vtk体绘制交互问题的解决方案

体绘制的速度问题是困扰医学图像三维重建的关键环节,通过总结,得到了以下几种提高体绘制速度的方法:

方法一:介绍一下vtkImageResample,这个函数将会通过线性插值对输入数据的spacing以及extent进行修改,来达到对输入数据的重新采样。一般采用SetAxisMagnificationFactor的方法来进行设置如下所示:
    vtkImageResample:
    SetInput(reader->GetOutput());
    SetAxisMagnificationFactor(0,  0.5);
    SetAxisMagnificationFactor(1,  0.5);

方法二:对读入的数据可以进行 subsampling(二次抽样样品),这样也可以使程序很数据读入加快。如下所示:
    vtkImageShrink3D shrink
    SetInput(reader->GetOutput());
    SetShrinkFactors(3,3,3)
    AveragingOn
SetShrinkFactors 定义了x,y,z 抽样精密度 如果都是0 那么就没有必要用这个函数了,如果subsampling得值过大,那么rendering的结果会比较差。在这个时候如果对subsamping得数据进行优化显示是一个值得讨论的问题。

    优化的方法可以选在高斯平滑的函数进行,这样可以减少数据的梯度感和粗糟感,代码如下
    vtkImageGaussianSmooth:
    SetInputConnection(reader->GetOutput());
    SetDimensionality(3)
    SetRadiusFactors(1,1,0)

方法三:重新设置SampleDistance。对于使用vtkVolumeRayCastMapper来说。使用函数SetImageSampleDistance来进行设置,但同时,因为在默认状态下,它具有为了达到交互效果而自动调节显示效果的功能,所以前提必须是RayCastMapper 的自动调节功能已经关掉,(如果仍然采用自动调节作用,则可以通过SetAutoAdjustSampleDistances (int)来进行交互设置)即AutoAdjustSampleDistancesOff();如下所示:
    vtkVolumeRayCastMapper:
    SetImageSampleDistance(2);
    AutoAdjustSampleDistancesOff();

方法四:使用vtkLODProp3D。它允许加入多个Mapper,并通过设置time,来决定某一时刻应该显示哪一个Mapper。通常的做法是当在旋转时选择交互性好但准确率稍差的Mapper,当停止时,又会显示比较费时但绘制准确的Mapper。对于RayCastMapper来说,则不需要使用vtkLODProp3D。如下所示:
    vtkVolumeTextureMapper2D *lowresMapper = vtkVolumeTextureMapper2D::New();
    lowresMapper->SetInput(reader->GetOutput());
    vtkVolumeRayCaster *hiresMapper = vtkVolumeRayCaster::New();
    hiresMapper->SetInput(reader->GetOutput());
    vtkLODProp3D *volumeLOD = vtkLODProp3D::New();
    volumeLOD->AddLOD(lowresMapper, volumeProperty, 0.0);
    volumeLOD->AddLOD(hiresMapper, volumeProperty, 0.0);

你可能感兴趣的:(windows,图形,三维,VTK)