VTK体渲染应用实例:读取并可视化MHD数据的程序

678 阅读1分钟

给代码进行了详细的注释,所以就不再赘述过程了。

`#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);
#include "vtkDICOMImageReader.h"
#include <vtkSmartPointer.h>
#include <vtkMetaImageReader.h>
#include <vtkPiecewiseFunction.h>
#include <vtkColorTransferFunction.h>
#include <vtkVolumeProperty.h>
#include <vtkVolumeRayCastCompositeFunction.h>
#include <vtkVolumeRayCastMapper.h>
#include <vtkVolume.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkImageCast.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkImageData.h>

VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)

void main()
{
        //设置渲染器
        vtkRenderer *ren = vtkRenderer::New();
        //设置渲染窗口
        vtkRenderWindow *renWin = vtkRenderWindow::New();
        //将渲染器加入渲染窗口
        renWin->AddRenderer(ren);
        //设置交互器窗口
        vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
        //将渲染窗口添加到交互窗口
        iren->SetRenderWindow(renWin);
        //交互相机
        vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New();
        //设置交互器样式
        iren->SetInteractorStyle(style);

        //设置数据读入
        vtkSmartPointer<vtkMetaImageReader> reader =
                vtkSmartPointer<vtkMetaImageReader>::New();
        reader->SetFileName("mhd_head/manix_small.mhd");
        reader->Update();
        vtkImageCast *readerImageCast = vtkImageCast::New();
        readerImageCast->SetInputConnection(reader->GetOutputPort());
        readerImageCast->SetOutputScalarTypeToUnsignedShort();
        readerImageCast->ClampOverflowOn();//设置阀值

        //设置不透明度传递函数,此为一维分段传输函数
        vtkPiecewiseFunction *opacityTransferFunction = vtkPiecewiseFunction::New();
        opacityTransferFunction->AddPoint(20, 0.0);
        opacityTransferFunction->AddPoint(255, 0.1);
        opacityTransferFunction->AddPoint(1005, 0.6);

        //设置颜色传递函数
        vtkColorTransferFunction *colorTransferFunction = vtkColorTransferFunction::New();
        colorTransferFunction->AddRGBPoint(0.0, 0.0, 0.5, 0.0);
        colorTransferFunction->AddRGBPoint(60.0, 1.0, 0.0, 0.0);
        colorTransferFunction->AddRGBPoint(128.0, 0.2, 0.1, 0.9);
        colorTransferFunction->AddRGBPoint(196.0, 0.27, 0.21, 0.1);
        colorTransferFunction->AddRGBPoint(255.0, 0.8, 0.8, 0.8);

        vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New();
        //设定渲染属性
        volumeProperty->SetColor(colorTransferFunction);//传输函数颜色
        volumeProperty->SetScalarOpacity(opacityTransferFunction);//传输函数不透明度
        volumeProperty->ShadeOn();//阴影
        volumeProperty->SetInterpolationTypeToLinear();//函数插值方法
        volumeProperty->SetAmbient(0.2);//环境光
        volumeProperty->SetDiffuse(0.4);//漫反射
        volumeProperty->SetSpecular(0.6);//高光系数
        volumeProperty->SetSpecularPower(10); //高光强度 

        //定义光线投射方法为RayCasting体渲染方法
        vtkVolumeRayCastCompositeFunction *compositeFunction = vtkVolumeRayCastCompositeFunction::New();
        //定义渲染Mapper
        vtkVolumeRayCastMapper *volumeMapper = vtkVolumeRayCastMapper::New();
        volumeMapper->SetVolumeRayCastFunction(compositeFunction);
        volumeMapper->SetInputConnection(readerImageCast->GetOutputPort());
        volumeMapper->SetNumberOfThreads(3);
        //定义Volume
        vtkVolume *volume = vtkVolume::New();
        volume->SetMapper(volumeMapper);
        volume->SetProperty(volumeProperty);
        //将Volume装载到渲染器中
        ren->AddVolume(volume);
        ren->SetBackground(1, 1, 1);
        renWin->SetSize(600, 600);
        renWin->Render(); 
        iren->Initialize();
        iren->Start();//初始化并进行交互绘制
        ren->ResetCameraClippingRange();

        //资源的删除和释放
        volumeMapper->Delete();
        readerImageCast->Delete();
        iren->Delete();
        ren->Delete();
        renWin->Delete();
        opacityTransferFunction->Delete();
        volumeProperty->Delete();
        compositeFunction->Delete();
        volume->Delete();
        colorTransferFunction->Delete();
}`

得到结果:

image.png 反正VTK的体渲染效果不怎么样就是了。。。。