VTK体绘制基础
以下代码为VTK体绘制,一个简单的例子,方便初学者迅速入门。

Code
1
2
vtkRenderer *aRender = vtkRenderer::New(); //设置绘制类
3
vtkRenderWindow *renWin=vtkRenderWindow::New();//设置绘制窗口
4
renWin->AddRenderer(aRender); //装载绘制类
5
vtkRenderWindowInteractor *iRen=vtkRenderWindowInteractor::New();//设置绘制窗口的交互
6
iRen->SetRenderWindow(renWin); //装载绘制窗口
7
8
//读取数据
9
vtkVolume16Reader *reader=vtkVolume16Reader::New();
10
reader->SetDataDimensions (64,64);//设置图像像素值
11
reader->SetImageRange (1,93); //设置图片数量
12
reader->SetDataByteOrderToLittleEndian();
13
reader->SetFilePrefix("E://实验//headsq//quarter");//设置数据路径
14
reader->SetDataSpacing (3.2,3.2,1.5); //设置数据的间距
15
16
17
//对读取数据类型匹配
18
vtkImageCast *readerImageCast = vtkImageCast::New();
19
readerImageCast->SetInput((vtkDataObject *)reader->GetOutput());
20
readerImageCast->SetOutputScalarTypeToUnsignedShort();
21
22
23
//设置不透明度传递函数
24
vtkPiecewiseFunction *opacityTransferFunction=vtkPiecewiseFunction::New();
25
opacityTransferFunction->AddPoint(70.0, 0.0);
26
opacityTransferFunction->AddPoint(599.0, 0);
27
opacityTransferFunction->AddPoint(600.0, 0);
28
opacityTransferFunction->AddPoint(1195.0, 0);
29
opacityTransferFunction->AddPoint(1200, .2);
30
opacityTransferFunction->AddPoint(1300, .3);
31
opacityTransferFunction->AddPoint(2000, .3);
32
opacityTransferFunction->AddPoint(4095.0, 1.0);
33
34
35
36
//设置颜色传递函数
37
vtkColorTransferFunction *colorTransferFunction = vtkColorTransferFunction::New();
38
colorTransferFunction->AddRGBPoint(0.0, 0.5, 0.0, 0.0);
39
colorTransferFunction->AddRGBPoint(500.0, 0.6, 0.5, 0.6);//皮肤
40
colorTransferFunction->AddRGBPoint(1150, 1, 1, 0.96);//骨骼
41
colorTransferFunction->AddRGBPoint(2550.0, 1, 1, 1);
42
43
44
//设置梯度传递函数
45
vtkPiecewiseFunction *gradientTransferFunction = vtkPiecewiseFunction::New();
46
gradientTransferFunction->AddPoint(0, 2.0);
47
gradientTransferFunction->AddPoint(50, 2.0);
48
gradientTransferFunction->AddPoint(200, 1.7);
49
gradientTransferFunction->AddPoint(300, 1.5);
50
gradientTransferFunction->AddPoint(500, 1.3);
51
gradientTransferFunction-> AddSegment (600, 0.73, 900, 0.9);
52
gradientTransferFunction->AddPoint(1150, 0.6);
53
gradientTransferFunction->AddPoint(1300, 0.1);
54
55
56
57
//定义并设置相关体属性
58
vtkVolumeProperty*volumeProperty=vtkVolumeProperty::New();
59
volumeProperty->SetColor(colorTransferFunction);
60
volumeProperty->SetScalarOpacity(opacityTransferFunction);
61
volumeProperty->SetGradientOpacity(gradientTransferFunction);
62
volumeProperty->ShadeOn();
63
volumeProperty->SetInterpolationTypeToLinear();
64
volumeProperty->SetAmbient(0.2);
65
volumeProperty->SetDiffuse(0.9);
66
volumeProperty->SetSpecular(0.2);
67
volumeProperty->SetSpecularPower(10);
68
69
70
//定义光线投射方法为MIP体绘制方法,MIP为体绘制经典算法,还有合成体绘制等,只需要在这里重新定义既是
71
vtkVolumeRayCastMIPFunction*mipRaycastFunction = vtkVolumeRayCastMIPFunction::New();
72
73
mipRaycastFunction->SetMaximizeMethodToOpacity();
74
75
76
//定义绘制者
77
vtkVolumeRayCastMapper *volumeMapper = vtkVolumeRayCastMapper::New();
78
volumeMapper->SetVolumeRayCastFunction(mipRaycastFunction);//载入体绘制方法
79
volumeMapper->SetInput(reader->GetOutput());
80
81
82
//定义Volume
83
vtkVolume *volume = vtkVolume::New();
84
volume->SetMapper(volumeMapper);
85
volume->SetProperty(volumeProperty);//设置体属性
86
87
88
// create a camera with the correct view up
89
vtkCamera *aCamera = vtkCamera::New();
90
aCamera->SetViewUp (0, 0, -1);
91
aCamera->SetPosition (0, 1, 0);
92
aCamera->SetFocalPoint (0, 0, 0);
93
94
aRender->AddVolume(volume);
95
aRender->SetActiveCamera(aCamera);
96
aRender->ResetCamera();
97
aCamera->Dolly(1.5);
98
aRender->SetBackground(0,0,0);
99
aRender->ResetCameraClippingRange();
100
101
//aRender->AddVolume(volume); //将Volume装载到绘制类中
102
//aRender->SetBackground(0, 0, 0);
103
renWin->SetSize(500, 500); //设置背景颜色和绘制窗口大小
104
renWin->Render(); //窗口进行绘制
105
106
107
iRen->Initialize();
108
iRen->Start(); //初始化并进行交互绘制
109
reader->Delete();
110
iRen->Delete();
111
return 0;
1

2
vtkRenderer *aRender = vtkRenderer::New(); //设置绘制类3
vtkRenderWindow *renWin=vtkRenderWindow::New();//设置绘制窗口4
renWin->AddRenderer(aRender); //装载绘制类5
vtkRenderWindowInteractor *iRen=vtkRenderWindowInteractor::New();//设置绘制窗口的交互6
iRen->SetRenderWindow(renWin); //装载绘制窗口7

8
//读取数据9
vtkVolume16Reader *reader=vtkVolume16Reader::New();10
reader->SetDataDimensions (64,64);//设置图像像素值11
reader->SetImageRange (1,93); //设置图片数量12
reader->SetDataByteOrderToLittleEndian();13
reader->SetFilePrefix("E://实验//headsq//quarter");//设置数据路径14
reader->SetDataSpacing (3.2,3.2,1.5); //设置数据的间距15

16

17
//对读取数据类型匹配18
vtkImageCast *readerImageCast = vtkImageCast::New();19
readerImageCast->SetInput((vtkDataObject *)reader->GetOutput());20
readerImageCast->SetOutputScalarTypeToUnsignedShort();21

22

23
//设置不透明度传递函数24
vtkPiecewiseFunction *opacityTransferFunction=vtkPiecewiseFunction::New();25
opacityTransferFunction->AddPoint(70.0, 0.0);26
opacityTransferFunction->AddPoint(599.0, 0);27
opacityTransferFunction->AddPoint(600.0, 0);28
opacityTransferFunction->AddPoint(1195.0, 0);29
opacityTransferFunction->AddPoint(1200, .2);30
opacityTransferFunction->AddPoint(1300, .3);31
opacityTransferFunction->AddPoint(2000, .3);32
opacityTransferFunction->AddPoint(4095.0, 1.0);33

34

35

36
//设置颜色传递函数37
vtkColorTransferFunction *colorTransferFunction = vtkColorTransferFunction::New();38
colorTransferFunction->AddRGBPoint(0.0, 0.5, 0.0, 0.0);39
colorTransferFunction->AddRGBPoint(500.0, 0.6, 0.5, 0.6);//皮肤40
colorTransferFunction->AddRGBPoint(1150, 1, 1, 0.96);//骨骼41
colorTransferFunction->AddRGBPoint(2550.0, 1, 1, 1);42

43

44
//设置梯度传递函数45
vtkPiecewiseFunction *gradientTransferFunction = vtkPiecewiseFunction::New();46
gradientTransferFunction->AddPoint(0, 2.0);47
gradientTransferFunction->AddPoint(50, 2.0);48
gradientTransferFunction->AddPoint(200, 1.7);49
gradientTransferFunction->AddPoint(300, 1.5);50
gradientTransferFunction->AddPoint(500, 1.3);51
gradientTransferFunction-> AddSegment (600, 0.73, 900, 0.9);52
gradientTransferFunction->AddPoint(1150, 0.6);53
gradientTransferFunction->AddPoint(1300, 0.1); 54

55

56

57
//定义并设置相关体属性58
vtkVolumeProperty*volumeProperty=vtkVolumeProperty::New();59
volumeProperty->SetColor(colorTransferFunction);60
volumeProperty->SetScalarOpacity(opacityTransferFunction);61
volumeProperty->SetGradientOpacity(gradientTransferFunction);62
volumeProperty->ShadeOn();63
volumeProperty->SetInterpolationTypeToLinear();64
volumeProperty->SetAmbient(0.2);65
volumeProperty->SetDiffuse(0.9);66
volumeProperty->SetSpecular(0.2);67
volumeProperty->SetSpecularPower(10); 68

69

70
//定义光线投射方法为MIP体绘制方法,MIP为体绘制经典算法,还有合成体绘制等,只需要在这里重新定义既是71
vtkVolumeRayCastMIPFunction*mipRaycastFunction = vtkVolumeRayCastMIPFunction::New();72

73
mipRaycastFunction->SetMaximizeMethodToOpacity();74

75

76
//定义绘制者77
vtkVolumeRayCastMapper *volumeMapper = vtkVolumeRayCastMapper::New();78
volumeMapper->SetVolumeRayCastFunction(mipRaycastFunction);//载入体绘制方法79
volumeMapper->SetInput(reader->GetOutput());80

81

82
//定义Volume83
vtkVolume *volume = vtkVolume::New();84
volume->SetMapper(volumeMapper);85
volume->SetProperty(volumeProperty);//设置体属性86

87

88
// create a camera with the correct view up89
vtkCamera *aCamera = vtkCamera::New();90
aCamera->SetViewUp (0, 0, -1);91
aCamera->SetPosition (0, 1, 0);92
aCamera->SetFocalPoint (0, 0, 0);93

94
aRender->AddVolume(volume);95
aRender->SetActiveCamera(aCamera);96
aRender->ResetCamera();97
aCamera->Dolly(1.5);98
aRender->SetBackground(0,0,0);99
aRender->ResetCameraClippingRange();100
101
//aRender->AddVolume(volume); //将Volume装载到绘制类中102
//aRender->SetBackground(0, 0, 0);103
renWin->SetSize(500, 500); //设置背景颜色和绘制窗口大小104
renWin->Render(); //窗口进行绘制105

106

107
iRen->Initialize(); 108
iRen->Start(); //初始化并进行交互绘制109
reader->Delete();110
iRen->Delete();111
return 0;
浙公网安备 33010602011771号