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


结果为:

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值