#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);
結果爲: