VTK管线
|---vtkProp
|---vtkAbstactMapper
|---vtkProperty
|---vtkCamera
|---vtkLight
|---vtkRenderWindowInteractor
|---vtkTransform
|---vtkLoopupTable
可以发现上面这些类都是和数据显示或者渲染相关的。用计算机图形学的专业术语来说,就是他们构成了VTK的渲染引擎。渲染引擎主要负责数据的可视化表达。是VTK里面的两个重要概念之一。而另外一个重要概念就是管线。
可视化管线是指用于获取或者创建数据、处理数据以及吧数据写入文件或者吧数据传递给渲染引擎进行显示,这样一种结构在VTK中就称为可视化管线。数据对象(Data Object)、处理对象(Process Object)和数据流方向(Direction of Data Flow)是可视化管线的三个基本要素,每个VTK程序都会有一个可视化管线。
以上这个程序的可视化管线非常的简单。先是创建一个柱体数据,接着经Mapper后生成的图元直接送入引擎渲染。创建的数据没有经过任何处理。
我们再来研究下一个稍微复杂一点的可视化管线。在该实例中,我们先读入一个后缀为TXT的文件(head.vtk)。然后用移动立方体算法提取等值面,最后吧等值面经过Mapper送入渲染引擎进行显示。
实现效果
/**********************************************************************
文件名: 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;
}