轉載來源:http://blog.163.com/adslxk@126/blog/static/100610671200911169232935/
最近無聊,琢磨出瞭如何通過已有的內存三維體數據場進行三維重建的vtk實現。以拋磚引玉:
const int dim=50;
void main()
{
//手動創建一個內存體數據
unsigned short data[dim][dim][dim];
for (int i=0;i<dim;i++)
for (int j=0;j<dim;j++)
for (int k=0;k<dim;k++)
data[i][j][k]=1000;
//根據內存數據data指針開始創建vtk數據,數據來源也可以是原有系統的三維數據,只要給出數據地址就可以
vtkUnsignedShortArray *array=vtkUnsignedShortArray::New();
array->SetVoidArray(data,dim*dim*dim,1);
//設置三維數據場格式
vtkImageData *imageData=vtkImageData::New();
imageData->GetPointData()->SetScalars(array);
imageData->SetDimensions(dim, dim, dim);//三維數據場的x、y、z方向上的體素個數
imageData->SetScalarTypeToUnsignedShort();//數據類型需要和三維數據場的實際類型一致
imageData->SetSpacing(1,1,1);//每個體素的大小
imageData->SetOrigin(0,0,0);
vtkPiecewiseFunction* opacityTransferFunction=vtkPiecewiseFunction::New();
opacityTransferFunction->AddPoint(1000,1.0);
opacityTransferFunction->ClampingOff();
vtkColorTransferFunction *colorTransferFunction=vtkColorTransferFunction::New(); colorTransferFunction->AddRGBPoint(1000.0, 0.8, 0.8, 0.8);
vtkVolumeProperty * volumeProperty=vtkVolumeProperty::New();
volumeProperty->SetColor(colorTransferFunction);
volumeProperty->SetScalarOpacity(opacityTransferFunction);
volumeProperty->SetInterpolationTypeToLinear();
vtkVolumeRayCastCompositeFunction* compositeFunction=vtkVolumeRayCastCompositeFunction::New();
vtkVolumeRayCastMapper *volumeMapper=vtkVolumeRayCastMapper::New();
volumeMapper->SetVolumeRayCastFunction(compositeFunction);
volumeMapper->SetInput(imageData);
vtkVolume* volume=vtkVolume::New();
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
vtkRenderer* ren=vtkRenderer::New();
ren->AddVolume(volume);
ren->SetBackground(0,0,1);
vtkRenderWindow* renwin=vtkRenderWindow::New();
renwin->AddRenderer(ren);
vtkRenderWindowInteractor* iren=vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renwin);
renwin->Render();
iren->Start();
}