深入浅出VTK:VTK的基本概念及其入门项目讲解
本文介绍了如何在Visual Studio中编写第一个VTK程序,并通过示例代码讲解了VTK的核心概念。主要内容包括:1. 展示了创建圆柱体模型的完整VTK程序代码;2. 详细解释了vtkCylinderSource(数据源)、vtkPolyDataMapper(映射器)、vtkActor(演员)等关键类的作用;3. 用工厂流水线类比VTK的渲染流程;4. 通过舞台剧的生动比喻,帮助理解VTK的渲染窗口、场景、交互器等概念。文章适合VTK初学者快速掌握基本框架和核心概念,为进一步学习打下基础。

前言
基于上该专栏的上一篇博客——深入浅出VTK:使用Visual Studio配置VTK环境并编写示例,本篇博客是在该博客的基础上进行延申,帮助正在学习VTK的读者更好的了解VTK中的演员,过滤器等概念。
编写第一个VTK程序
本篇小节的环境配置是基于《深入浅出VTK:使用Visual Studio配置VTK环境并编写示例》进行开发的,如果有读者需要配置相关的VTK环境则可以参考该博客,具体的链接如下:
深入浅出VTK:使用Visual Studio配置VTK环境并编写示例https://blog.csdn.net/weixin_67035108/article/details/160308298在Visual Studio中配置好VTK环境以后,只需要将main.cpp文件中的代码替换为以下代码即可编译运行。
#include <vtkSmartPointer.h>#include <vtkRenderWindow.h>#include <vtkRenderer.h>#include <vtkRenderWindowInteractor.h>#include <vtkInteractorStyleTrackballCamera.h>#include <vtkCylinderSource.h>#include <vtkPolyDataMapper.h>#include <vtkActor.h>#include <vtkAutoInit.h>VTK_MODULE_INIT(vtkRenderingOpenGL2); // 始化OpenGL2渲染后端VTK_MODULE_INIT(vtkInteractionStyle); // 初始化交互风格模块int main(){ // 初始化柱体数据源 vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New(); cylinder->SetHeight(3.0); cylinder->SetRadius(1.0); cylinder->SetResolution(10); // 初始化映射器 vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); cylinderMapper->SetInputConnection(cylinder->GetOutputPort()); // 将柱体数据源转换成可绘制的图元 // 初始化演员 vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New(); cylinderActor->SetMapper(cylinderMapper); // 设置演员绘制的映射器 // 初始化渲染器 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(cylinderActor); // 设置要渲染的演员 renderer->SetBackground(0.1, 0.2, 0.4); // 初始化渲染窗口 vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New(); renWin->AddRenderer(renderer); renWin->SetSize(300, 300); // 初始化交互器 vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New(); iren->SetRenderWindow(renWin); // 初始化交互风格 vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New(); iren->SetInteractorStyle(style); iren->Initialize(); iren->Start(); // 启动交互风格 return 0;}编译成功后,执行效果如下图:

图1.第一个VTK程序运行效果
PS:当博主对代码进行迁移完毕以后,会同步在GitHub上更新VTK全系列的项目代码,如果有需要的读者可以在以下链接中获取到。而本篇博客不会着重讲解代码中每一个类的内部实现,这对于一个初学者是难以接受的,我们只需要了解VTK中的基础概念即可,不需要给自己要求那么高
深入浅出VTK:全景目录https://blog.csdn.net/weixin_67035108/article/details/156361963
程序中代码的简要说明
在上诉代码中,我们能看到main函数中主要存在以下几个类:
1.vtkCylinderSource:该类用于创建一个柱体数据,包含了一个柱体的高,横截面半径和柱体的边数等数据,主要功能是生成一个中心在渲染场景原点的柱体,也就是图一中显示的柱体。这便是VTK中的数据源概念,即数据来源
2.vtkPolyDataMapper:该类用于渲染多边形的集合数据,用于将输入的数据转换为几何图元进行渲染。这便是VTK中的映射器概念,用于将原始的几何数据转换成可以被图形库理解和绘制的图元(VTK中的最小图形块,例如点、线段、三角形、四边形,由这些图像块组成我们能看到的更复杂的图形)
3.vtkActor:该类用于渲染出我们看到的柱体,区别于vtkCylinderSource该类只负责渲染数据,不负责存储数据。该类要渲染出我们看到的三维模型需要依赖于两个对象,一个是映射器(Mapper)对象,负责存放数据和渲染的信息,另一个是属性(vtkProperty)对象,负责控制颜色,不透明度等数据。所以这是VTK中的演员概念,用于表示渲染场景中可见的实体模型
4.vtkRenderWindows:该类用于将数据渲染到窗口中,即渲染窗口,是所有的可视化内容的最终显示位置,可以渲染多个不同演员从而实现一个场景中有多个不同的三维模型
5.vtkRenderer:该类负责管理场景的渲染过程,即用来管理渲染窗口中不同的演员,也可以用来设置场景的颜色和渐变效果等
6.vtkRenderWindowsInteractor:该类用于监听用户鼠标,键盘等事件,属于是渲染窗口交互器。这便是VTK中交互器
7.vtkInteractorStyleTrackballCamera:该类用来控制不同的交互风格,主要是用于设置相同的事件响应不同的函数。这便是VTK中的交互样式
在理解了这些类的作用和各个概念,可能大多数读者还是会一头雾水,在此博主通过以下形容帮助读者理解这些概念:VTK中的渲染过程可以看作工厂流水线,数据源用来根据设定的参数生成指定形状的模型,映射器会把这些模型拆解成一个一个图元,最后由演员来把这些图元组装起来拼成我们看到的三维模型。为了显示这些在组装好的模型,我们需要通过渲染器来管理每一个演员在渲染窗口中的位置,而为了在不同的角度观察演员,则需要通过交互器配合交互样式来实现视角的旋转,缩放等功能。
图形讲解VTK中的概念
可以将以上示例看作一个舞台剧演出。观看舞台剧时,观众坐在台下展现在观众面前的是一个舞台,舞台上有各式的灯光和各样的演员。演员出场时肯定是会先化妆,观众有时还会与台上的演员有一定的互动。
整个剧院就好比VTK程序的渲染窗口(vtkRenderWindow);舞台就相当于渲染场景(vtkRenderer);而那些演员就是程序中的Actor,台上演员与台下观众的互动可以看作与应用程序的交互(vtkRenderWindowInteractor);演员与观众的互动方式有很多种,现场的观众可以直接上台跟演员们握手拥抱,电视机前的可以发短信,计算机前的可以微博关注等,这就好比程序中的交互器样式(vtkInteractorStyle);对于舞台上的演员,观众都可以一一分辨出来,不会弄混,是因为他们穿着打扮、容貌都不一样,这就相当于程序中vtkActor的不同属性(vtkProperty);台下观众的眼睛可以看作vtkCamera,前排的观众因为离得近,在观看台上演员时会觉得他们比较高大,而后排的观众因为离得远,所以那些演员看起来就会显得小些,每位观众看到的东西在他/她的世界里都是唯一的,所以渲染场景Renderer里的vtkCamera对象也是只有一个;舞台上的灯光可以有多个,所以渲染场景里的vtkLight也存在多个。可以参考图2以加深理解。

图2.图形讲解VTK中的概念