深入浅出VTK:VTK的基本概念及其入门项目讲解
目录1.编写第一个VTK程序2.程序中代码的简要说明3.图形讲解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() { // 初始化柱体数据源 vtkSmartPointervtkCylinderSource cylinder vtkSmartPointervtkCylinderSource::New(); cylinder-SetHeight(3.0); cylinder-SetRadius(1.0); cylinder-SetResolution(10); // 初始化映射器 vtkSmartPointervtkPolyDataMapper cylinderMapper vtkSmartPointervtkPolyDataMapper::New(); cylinderMapper-SetInputConnection(cylinder-GetOutputPort()); // 将柱体数据源转换成可绘制的图元 // 初始化演员 vtkSmartPointervtkActor cylinderActor vtkSmartPointervtkActor::New(); cylinderActor-SetMapper(cylinderMapper); // 设置演员绘制的映射器 // 初始化渲染器 vtkSmartPointervtkRenderer renderer vtkSmartPointervtkRenderer::New(); renderer-AddActor(cylinderActor); // 设置要渲染的演员 renderer-SetBackground(0.1, 0.2, 0.4); // 初始化渲染窗口 vtkSmartPointervtkRenderWindow renWin vtkSmartPointervtkRenderWindow::New(); renWin-AddRenderer(renderer); renWin-SetSize(300, 300); // 初始化交互器 vtkSmartPointervtkRenderWindowInteractor iren vtkSmartPointervtkRenderWindowInteractor::New(); iren-SetRenderWindow(renWin); // 初始化交互风格 vtkSmartPointervtkInteractorStyleTrackballCamera style vtkSmartPointervtkInteractorStyleTrackballCamera::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中的概念