VTK面绘制实例

例子通过vtkVolume16Reader读取人头一系列的二维切片,采用vtkContourFilter滤波器抽取等值面为500的皮肤,在等值面上利用vtkPolyDataNormals产生一系列的法线,用vtkOutlineFilter滤波器在图像外面产生个外围的边框。

在console下的代码如下:

//Surface rendering
#include<vtkRenderer.h>
#include<vtkRenderWindow.h>
#include<vtkRenderWindowInteractor.h>
#include<vtkInteractorStyleTrackballCamera.h>
#include<vtkVolume16Reader.h>
#include<vtkPolyDataMapper.h>
#include<vtkActor.h>
#include<vtkOutlineFilter.h>
#include<vtkCamera.h>
#include<vtkProperty.h>
#include<vtkPolyDataNormals.h>
#include<vtkContourFilter.h>
#include<vtkSmartPointer.h>
#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);
void main()
{
	vtkSmartPointer<vtkRenderer>renderer = vtkSmartPointer<vtkRenderer>::New();
	vtkSmartPointer<vtkRenderWindow>renWin = vtkSmartPointer<vtkRenderWindow>::New();
	renWin->AddRenderer(renderer);

	vtkSmartPointer<vtkRenderWindowInteractor>iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	iren->SetRenderWindow(renWin);

	vtkSmartPointer<vtkVolume16Reader>v16 = vtkSmartPointer<vtkVolume16Reader>::New();
	v16->SetDataDimensions(64, 64);
	v16->SetDataByteOrderToLittleEndian();
	v16->SetFilePrefix("F:\\vtkshuju\\Data\\headsq\\quarter");
	v16->SetImageRange(1, 93);
//	v16->SetFilePattern("%s.%d");
	v16->SetDataSpacing(3.2, 3.2, 1.5);

	vtkSmartPointer<vtkContourFilter>skinExtractor = vtkSmartPointer<vtkContourFilter>::New();
	skinExtractor->SetInputConnection(v16->GetOutputPort());
	skinExtractor->SetValue(0,500);

	vtkSmartPointer<vtkPolyDataNormals>skinNormals = vtkSmartPointer<vtkPolyDataNormals>::New();
	skinNormals->SetInputConnection(skinExtractor->GetOutputPort());
	skinNormals->SetFeatureAngle(60.0);

	vtkSmartPointer<vtkPolyDataMapper>skinMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	skinMapper->SetInputConnection(skinNormals->GetOutputPort());
	skinMapper->ScalarVisibilityOff();

	vtkSmartPointer<vtkActor>skin = vtkSmartPointer<vtkActor>::New();
	skin->SetMapper(skinMapper);

	vtkSmartPointer<vtkOutlineFilter>outlineData = vtkSmartPointer<vtkOutlineFilter>::New();
	outlineData->SetInputConnection(v16->GetOutputPort());

	vtkSmartPointer<vtkPolyDataMapper>mapOutline = vtkSmartPointer<vtkPolyDataMapper>::New();
	mapOutline->SetInputConnection(outlineData->GetOutputPort());

	vtkSmartPointer<vtkActor>outline = vtkSmartPointer<vtkActor>::New();
	outline->SetMapper(mapOutline);
	outline->GetProperty()->SetColor(0, 0, 0);

	vtkSmartPointer<vtkCamera>aCamera = vtkSmartPointer<vtkCamera>::New();
	aCamera->SetViewUp(0, 0, -1);
	aCamera->SetPosition(0, 1, 0);
	aCamera->SetFocalPoint(0, 0, 0);
	aCamera->ComputeViewPlaneNormal();

	aCamera->Azimuth(30.0);
	aCamera->Elevation(30.0);

	renderer->AddActor(outline);
	renderer->AddActor(skin);
	renderer->SetActiveCamera(aCamera);
	renderer->ResetCamera();
	aCamera->Dolly(1.5);//close to the image

	renderer->SetBackground(0.2, 0.3, 0.4);
	renWin->SetSize(320, 240);

	renderer->ResetCameraClippingRange();
	vtkSmartPointer<vtkInteractorStyleTrackballCamera>style =      vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	iren->SetInteractorStyle(style);
	iren->Initialize();
	iren->Start();
	return;
}




猜你喜欢

转载自blog.csdn.net/thecentry/article/details/79170131
今日推荐