vtkImageData 体绘制

来源:互联网 发布:阿里云服务器域名备案 编辑:程序博客网 时间:2024/05/29 15:48

 

 

 

 

#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);


结果为:

 

 

 

 

 

原创粉丝点击