VTK点云之旅08-VTK管线渲染

535 阅读2分钟

VTK管线

|---vtkProp
|---vtkAbstactMapper
|---vtkProperty
|---vtkCamera
|---vtkLight
|---vtkRenderWindowInteractor
|---vtkTransform
|---vtkLoopupTable

可以发现上面这些类都是和数据显示或者渲染相关的。用计算机图形学的专业术语来说,就是他们构成了VTK的渲染引擎。渲染引擎主要负责数据的可视化表达。是VTK里面的两个重要概念之一。而另外一个重要概念就是管线。

可视化管线是指用于获取或者创建数据、处理数据以及吧数据写入文件或者吧数据传递给渲染引擎进行显示,这样一种结构在VTK中就称为可视化管线。数据对象(Data Object)、处理对象(Process Object)和数据流方向(Direction of Data Flow)是可视化管线的三个基本要素,每个VTK程序都会有一个可视化管线。

image.png

以上这个程序的可视化管线非常的简单。先是创建一个柱体数据,接着经Mapper后生成的图元直接送入引擎渲染。创建的数据没有经过任何处理。

我们再来研究下一个稍微复杂一点的可视化管线。在该实例中,我们先读入一个后缀为TXT的文件(head.vtk)。然后用移动立方体算法提取等值面,最后吧等值面经过Mapper送入渲染引擎进行显示。

实现效果

image.png

/**********************************************************************

  文件名: 2.4_vtkPipelineDemo.cpp
  Copyright (c) 张晓东, 罗火灵. All rights reserved.
  更多信息请访问:
	http://www.vtkchina.org (VTK中国)
	http://blog.csdn.net/www_doling_net (东灵工作室)

**********************************************************************/

#include <vtkSmartPointer.h>
#include <vtkStructuredPointsReader.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkMarchingCubes.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);

//测试文件:data/head.vtk
int main(int argc, char* argv[])
{
	if (argc < 2)
	{
		std::cout << argv[0] << " " << "VTK-File(*.vtk)" << std::endl;
		return EXIT_FAILURE;
	}
	//读入Structured_Points类型的vtk文件。
	vtkSmartPointer<vtkStructuredPointsReader> reader =
		vtkSmartPointer<vtkStructuredPointsReader>::New();
	reader->SetFileName(argv[1]);

	//用移动立方体法提取等值面。
	vtkSmartPointer<vtkMarchingCubes> marchingCubes =
		vtkSmartPointer<vtkMarchingCubes>::New();
	marchingCubes->SetInputConnection(reader->GetOutputPort());
	marchingCubes->SetValue(0, 500);

	//将生成的等值面数据进行Mapper
	vtkSmartPointer<vtkPolyDataMapper> mapper =
		vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(marchingCubes->GetOutputPort());

	//把Mapper的输出送入渲染引擎进行显示
	//////////////////////////////////////渲染引擎部分////////////////////////////////////
	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);

	vtkSmartPointer<vtkRenderer> renderer =
		vtkSmartPointer<vtkRenderer>::New();
	renderer->AddActor(actor);
	renderer->SetBackground(1.0, 1.0, 1.0);

	vtkSmartPointer<vtkRenderWindow> renWin =
		vtkSmartPointer<vtkRenderWindow>::New();
	renWin->AddRenderer(renderer);
	renWin->SetSize(640, 480);
	renWin->Render();
	renWin->SetWindowName("vtkPipelineDemo");

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

	interactor->Initialize();
	interactor->Start();
	//////////////////////////////////////////////////////////////////////////////////////////////////

	return EXIT_SUCCESS;
}

image.png