vtkImageData 體繪製

 

 

 

 

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


結果爲:

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章