给代码进行了详细的注释,所以就不再赘述过程了。
`#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();
}`
得到结果:
反正VTK的体渲染效果不怎么样就是了。。。。