获取一个三维物体在某个特定点的三视图可以使用vtk的vtkImageReslice实现.首先是定义一些变量,初始化信息。在.h中定义。
vtkSmartPointer<vtkXMLImageDataReader> pXMLImageDataReader = vtkSmartPointer<vtkXMLImageDataReader>::New();
vtkSmartPointer<vtkImageCast> pImageCast = vtkSmartPointer<vtkImageCast>::New();
vtkSmartPointer<vtkImageReslice> pImageResliceX = vtkSmartPointer<vtkImageReslice>::New();
vtkSmartPointer<vtkImageReslice> pImageResliceY = vtkSmartPointer<vtkImageReslice>::New();
vtkSmartPointer<vtkImageReslice> pImageResliceZ = vtkSmartPointer<vtkImageReslice>::New();
vtkSmartPointer<vtkImageMapToColors> pImageMapToColorsX = vtkSmartPointer<vtkImageMapToColors>::New();
vtkSmartPointer<vtkImageMapToColors> pImageMapToColorsY = vtkSmartPointer<vtkImageMapToColors>::New();
vtkSmartPointer<vtkImageMapToColors> pImageMapToColorsZ = vtkSmartPointer<vtkImageMapToColors>::New();
vtkSmartPointer<vtkWindowLevelLookupTable>pWindowLevelLookupTable = vtkSmartPointer<vtkWindowLevelLookupTable>::New();
vtkSmartPointer<vtkImageActor> pImageActorX = vtkSmartPointer<vtkImageActor>::New();
vtkSmartPointer<vtkImageActor> pImageActorY = vtkSmartPointer<vtkImageActor>::New();
vtkSmartPointer<vtkImageActor> pImageActorZ = vtkSmartPointer<vtkImageActor>::New();
vtkSmartPointer<vtkRenderer> pRendererX = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderer> pRendererY = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderer> pRendererZ = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> pRenderWindow = vtkSmartPointer<vtkRenderWindow>::New();
定义一个函数,显示四视图(包括原始三维物体)。Show4DView().
Show4DView()
{
pXMLImageDataReader->SetFileName("imagedata22stl.vti");
pXMLImageDataReader->Update();
//三视图
int extent[6];
double spacing[3];
double origin[3];
pXMLImageDataReader->GetUpdateExtent(extent);
pXMLImageDataReader->GetOutput()->GetSpacing(spacing);
pXMLImageDataReader->GetOutput()->GetOrigin(origin);
// 计算中心位置。
double center[3];
center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]);
center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]);
center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);
centers[0] = center[0];
centers[1] = center[1];
centers[2] = center[2];
pWindowLevelLookupTable->SetWindow(200);
pWindowLevelLookupTable->SetLevel(100);
pImageCast->SetInputConnection(pXMLImageDataReader->GetOutputPort());
pImageCast->SetOutputScalarTypeToChar();
pImageCast->ClampOverflowOn();
pImageCast->Update();
pImageCast->SetUpdateExtentToWholeExtent();
//x
pImageResliceX->SetInputConnection(pImageCast->GetOutputPort());
pImageResliceX->SetOutputDimensionality(2);
pImageResliceX->SetResliceAxesDirectionCosines(sagittalX, sagittalY, sagittalZ);
pImageResliceX->SetResliceAxesOrigin(center);
pImageResliceX->SetInterpolationModeToLinear();
pImageResliceX->Update();
//pImageMapToColorsX->SetLookupTable(pWindowLevelLookupTable);
//pImageMapToColorsX->SetInputConnection(pImageResliceX->GetOutputPort());
pImageActorX->SetInputData(pImageResliceX->GetOutput());
pImageActorX->SetPosition(0,0,0);
pImageActorX->Update();
//y
pImageResliceY->SetInputConnection(pImageCast->GetOutputPort());
pImageResliceY->SetOutputDimensionality(2);
pImageResliceY->SetResliceAxesDirectionCosines(coronalX, coronalY, coronalZ);
pImageResliceY->SetResliceAxesOrigin(center);
pImageResliceY->SetInterpolationModeToLinear();
pImageResliceY->Update();
pImageActorY->SetInputData(pImageResliceY->GetOutput());
pImageActorY->SetPosition(0,0,0);
pImageActorY->Update();
//pImageMapToColorsX->SetLookupTable(pWindowLevelLookupTable);
//pImageMapToColorsX->SetInputConnection(pImageResliceX->GetOutputPort());
//z
pImageResliceZ->SetInputConnection(pImageCast->GetOutputPort());
pImageResliceZ->SetOutputDimensionality(2);
pImageResliceZ->SetResliceAxesDirectionCosines(axialX, axialY, axialZ);
pImageResliceZ->SetResliceAxesOrigin(center);
pImageResliceZ->SetInterpolationModeToLinear();
pImageResliceZ->Update();
pImageActorZ->SetInputData(pImageResliceZ->GetOutput());
pImageActorZ->SetPosition(0,0,0);
pImageActorZ->Update();
//pImageMapToColorsX->SetLookupTable(pWindowLevelLookupTable);
//pImageMapToColorsX->SetInputConnection(pImageResliceX->GetOutputPort());
pDataSetMapper->SetInputConnection(pXMLImageDataReader->GetOutputPort());
pActor->SetMapper(pDataSetMapper);
float fOpac = 0.5;
pActor->GetProperty()->SetOpacity(fOpac);
//绘制圆锥代表相机。
vtkSmartPointer<vtkConeSource> pConeSource = vtkSmartPointer<vtkConeSource>::New();
pConeSource->SetHeight(10.0);
pConeSource->SetRadius(5.0);
pConeSource->Update();
vtkSmartPointer<vtkPolyDataMapper> mappers = vtkSmartPointer<vtkPolyDataMapper>::New();
mappers->SetInputData(pConeSource->GetOutput());
vtkSmartPointer<vtkActor> actors = vtkSmartPointer<vtkActor>::New();
actors->SetMapper(mappers);
actors->GetProperty()->SetColor(1,0,0);
pRendererX->AddActor(pImageActorX);
pRendererY->AddActor(pImageActorY);
pRendererZ->AddActor(pImageActorZ);
pRenderer->AddActor(pActor);
pRenderer->AddActor(actors);
vtkMyCallback *mo1 = vtkMyCallback::New();
mo1->pImageReslicex = pImageResliceX;
mo1->pImageReslicey = pImageResliceY;
mo1->pImageReslicez = pImageResliceZ;
mo1->rwin=pRenderWindow;
mo1->fopac = fOpac;
actors->AddObserver(vtkCommand::ModifiedEvent,mo1);
pRenderer->SetBackground(1,1,1);
pRendererX->SetBackground(0,0,0);
pRendererY->SetBackground(0,0,0);
pRendererZ->SetBackground(0,0,0);
pRenderer->SetViewport( 0, 0 , 0.6, 1 );
pRendererX->SetViewport( 0.6, 0.66, 1, 1 );
pRendererY->SetViewport(0.6,0.33,1,0.66);
pRendererZ->SetViewport(0.6,0,1,0.33);
pRenderWindow->AddRenderer(pRendererX);
pRenderWindow->AddRenderer(pRendererY);
pRenderWindow->AddRenderer(pRendererZ);
pRenderWindow->AddRenderer(pRenderer);
pRenderWindowInteractor->SetRenderWindow(pRenderWindow);
pRenderWindow->Render();
for (int i=0;i<10;i++)
{
center[0]++;
center[1]++;
center[2]++;
actors->SetPosition(i*10,i*10,i*10);
Sleep(1000);
}
pRenderWindowInteractor->Initialize();
pRenderWindowInteractor->Start();
}
其中的回调函数是为了实现实时显示三视图的功能,只是一个demo。
回调函数:
static double centers[3]={0,0,0};
static int nCount = 0;
class vtkMyCallback : public vtkCommand
{
public:
static vtkMyCallback *New()
{
return new vtkMyCallback;
}
virtual void Execute(vtkObject *caller, unsigned long, void*)
{
//将传入参数强制转换成render类型
vtkActor *actor = reinterpret_cast<vtkActor*>(caller);
//actor->GetProperty()->SetOpacity(fopac);
//然后输出相机的位置信息
nCount++;
centers[0] += 10;
centers[1] += 10;
centers[2] += 10;
pImageReslicex->SetResliceAxesOrigin(centers);
pImageReslicey->SetResliceAxesOrigin(centers);
pImageReslicez->SetResliceAxesOrigin(centers);
pImageReslicex->Update();
pImageReslicey->Update();
pImageReslicez->Update();
rwin->Render();
}
public:
vtkMyCallback():rwin(0)
{
pImageReslicex=NULL;
pImageReslicey=NULL;
pImageReslicez=NULL;
}
vtkRenderWindow *rwin;
float fopac;
vtkImageReslice* pImageReslicex;
vtkImageReslice* pImageReslicey;
vtkImageReslice* pImageReslicez;
};