#include "vtkUnsignedCharArray.h"
#include "vtkPiecewiseFunction.h"
#include "vtkColorTransferFunction.h"
#include "vtkVolumeRayCastCompositeFunction.h"
#include "vtkVolumeRayCastMapper.h"
#include "vtkImageData.h"
#include "vtkVolumeProperty.h"
#include "vtkVolume.h"
#include "vtkRenderWindow.h"
#include "vtkRenderer.h"
#include "vtkRenderWindowInteractor.h"
void main()
{
//-----_建立图像数据-------
vtkImageData *id=vtkImageData::New();
id->SetDimensions(10,25,100);
id->SetScalarTypeToUnsignedShort();
id->SetNumberOfScalarComponents(1);
id->AllocateScalars();
unsigned short *ptr=(unsigned short *)id->GetScalarPointer();
for(int k=0;k<100;k++)
for(int i=0;i<10;i++)
for(int j=0;j<25;j++)
{
if(k<25) *(ptr+k*10*25+i*25+j)=32;
if(k>24&&k<50) *(ptr+k*10*25+i*25+j)=96;
if(k>49&&k<75) *(ptr+k*10*25+i*25+j)=160;
if(k>74&&k<100) *(ptr+k*10*25+i*25+j)=224;
}
//-----_体绘制-------
//_线性插值透明度映射方法
vtkPiecewiseFunction *opacityTransferFunction = vtkPiecewiseFunction::New();
opacityTransferFunction->AddPoint(32,0.0);
opacityTransferFunction->AddPoint(224,1.0);
//opacityTransferFunction->ClampingOff();
//_设定标量值的颜色属性
vtkColorTransferFunction *colorTransferFunction= vtkColorTransferFunction::New();
colorTransferFunction->AddRGBPoint(16, 0.1,0.0,0.0);
colorTransferFunction->AddRGBPoint(64, 0.3,0.0,0.0);
colorTransferFunction->AddRGBPoint(128,0.5,0.0,0.0);
colorTransferFunction->AddRGBPoint(192,0.7,0.0,0.0);
colorTransferFunction->AddRGBPoint(240,0.9,0.0,0.0);
//_设定体数据的属性:的不透明性和颜色值映射标量值
vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New();
volumeProperty->SetColor(colorTransferFunction);
volumeProperty->SetScalarOpacity(opacityTransferFunction);
volumeProperty->SetInterpolationTypeToLinear(); //设定插值类型为线性插值
volumeProperty->SetDiffuse(0.7);
volumeProperty->SetAmbient(0.01);
volumeProperty->SetSpecular(0.5);
volumeProperty->SetSpecularPower(70.0);
//绘制方法:体射线投射
vtkVolumeRayCastCompositeFunction *compositeFunction=vtkVolumeRayCastCompositeFunction::New();
//_体数据映射器
vtkVolumeRayCastMapper *volumeMapper=vtkVolumeRayCastMapper::New();
volumeMapper->SetInput((vtkImageData *)id);
volumeMapper->SetVolumeRayCastFunction(compositeFunction);
//创建一个 vtkVolume(vtkProp3D 的子类,类似于_vtkActor)对象来处理被映射的体数据和体属性数据
vtkVolume *volume=vtkVolume::New();
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
// 流水线
vtkRenderer* ren=vtkRenderer::New();
ren->AddVolume(volume);
vtkRenderWindow* renwin=vtkRenderWindow::New();
renwin->AddRenderer(ren);
vtkRenderWindowInteractor* iren=vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renwin);
renwin->Render();
iren->Start();
}
结果::
有一块透明的看不到,所以看起来只有三个颜色块
若设置id的间隔,
id->SetSpacing(10.0,4.0,1.0);
结果为: