这篇主要讲一个VTK的简单例子,加深自己对VTK的理解。
前记
学习vtk就是觉得pcl中封装的PCLVisualizer功能有限。学习vtk主要是看《VTK图形图像开发进阶》张晓东、罗火灵编著这本书,还有就是水灵的视频。水灵的视频更加老一点,不是很影响对vtk的基本理解,我是看了一遍书之后再看水灵的视频,还是看视频理解来的更加深刻。
水灵用的版本是vtk5.6版本,东灵用的是vtk6.0版本,我用的版本是vtk8.0。
VTK介绍
VTK全称Visualization Toolkit ,即可视化工具包,它是开源、跨平台、可自由获取、支持并行处理的图形应用函数库。
VTK中主要分为可视化模型和图形模型,数据流方向如下图1所示
图1
输入数据(Source),对数据进行滤波(Filter)操作,然后对数据进行映射(vtkMapper),将其封装成一个对象(vtkActor),再将这个对象添加到渲染场景(vtkRenderer)中,再利用渲染窗口(vtkRenderWindow)中进行渲染展示。
一个故事理解VTK
首先我们先列举出VTK中绘制或者渲染一个场景需要用到的基本对象:vtkMapper、vtkActor、vtkRenderer、vtkRenderWindow、vtkRenderWindowInteractor、vtkLight、vtkCamera、vtkProperty、vtkInteractorStyle...
我们可以想象自己去看一场舞台剧演出,我们坐在台下,前面是舞台,舞台上有各种各样的灯光和许多的演员,这些演员在表演前肯定会穿衣打扮自己,在中途还会与我们有一定的互动。
图2
从上面图2可以看出,现在整个剧院就相当于一个vtk中渲染窗口vtkRenderWindow,舞台就是渲染场景vtkRenderer,演员就是一个个对象vtkActor,他们不同的容貌、服装等这些属性统称为vtkProperty,我们观众和演员的互动就是vtkRenderWindowInteractor,我们送花、拥抱、握手等这些就是交互的风格vtkInteractorStyle,舞台上的灯光就是vtkLight,每个观众的眼睛就是vtkCamera,由于我们每个观众看到的东西都是唯一的所以vtkCamera只有一个,但是灯光vtkLight却可以是多个的。
一个简单的VTK例子
下面这个例子是参照《VTK图形图像开发进阶》中第一章给出的一个例子写出来的。
//***********************************
//说明:一个简单的VTK例子
//时间:2020.08.10
//作者:BOO
//********************************
#include<vtkSmartPointer.h>
#include<vtkConeSource.h>
#include<vtkPolyDataMapper.h>
#include<vtkActor.h>
#include<vtkRenderer.h>
#include<vtkRenderWindow.h>
#include<vtkRenderWindowInteractor.h>
#include<vtkInteractorStyleTrackballCamera.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType)
int main()
{
//圆锥模型
vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New();
cone->SetHeight(3.0);
cone->SetRadius(1.0);
cone->SetResolution(10);
//映射器
vtkSmartPointer<vtkPolyDataMapper> coneMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
coneMapper->SetInputConnection(cone->GetOutputPort());
//对象
vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New();
coneActor->SetMapper(coneMapper);
//渲染
vtkSmartPointer<vtkRenderer>renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(coneActor);
renderer->SetBackground(0.0, 1.0, 1.0);
//渲染窗口
vtkSmartPointer<vtkRenderWindow>renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(renderer);
renWin->SetSize(600, 400);
//交互
vtkSmartPointer<vtkRenderWindowInteractor>renderInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderInteractor->SetRenderWindow(renWin);
//交互风格
vtkSmartPointer<vtkInteractorStyleTrackballCamera>style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
renderInteractor->SetInteractorStyle(style);
renderInteractor->Initialize();
renderInteractor->Start();
return 0;
}
运行结果图:
代码解释
目前vtk中所有的指针都是利用vtkSmartPointer智能指针来进行管理的,所以实例化一个对象需要用规定格式声明即可,例如实例化一个圆锥:
vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New();
代码中后面的部分都是对应于上面的流程进行编写的,应该是很简单的,看懂没什么问题。
错误提醒
如果报错添加这几行:
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType)
参考
《VTK图形图像开发进阶》
study VTK Together 一起学习VTK教程--水灵