VTK编程指南<三>:基于VTK入门程序解析来理解VTK基础知识

1、VTK入门程序

  下面是一个完整的Vtk入门程序,我们基于这个程序来对VTK的基本知识进行一个初步了解。
在这里插入图片描述

在这里插入图片描述

#include <iostream>

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);// VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);

#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 <vtkProperty.h>

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);
	cylinderActor->GetProperty()->SetColor(1.0, 0.0, 0.0);

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

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

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

	vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
		vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	iren->SetInteractorStyle(style);

	iren->Initialize();
	iren->Start();

	return EXIT_SUCCESS;
}

2、交互快捷键及错误处理

2.1、运行错误处理

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);// VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);

  上面这三行代码是为了解决VTK运行openGL报错而添加的,现在的新的电脑大部分编译VTK默认采用的都是vtkRenderingOpenGL2,因此加上这3行,避免报如下错误:

vtkInteractorStyleSwitc:37    WARN| vtkInteractorStyleSwitchBase (00000165F8951AD0): 
Warning: Link to vtkInteractionStyle for default style selection.
Warning: In E:\VTK_9.0.1\src\Rendering\Core\vtkInteractorStyleSwitchBase.cxx, line 37
vtkInteractorStyleSwitchBase (00000165F8951AD0): 
Warning: Link to vtkInteractionStyle for default style selection.

2.2、交互快捷键

  在上图程序运行的窗口中,可以使用鼠标与柱体进行交互,比如用鼠标滚轮可以对柱体放大、缩小;按下鼠标左键不放,然后移动鼠标,可以转动柱体;按下鼠标左键,同时按下Shift
键,移动鼠标,可以移动整个柱体等。读者也可以尝试一下其他的功能,比如按下〈Ctrl〉键
时再按鼠标左键;鼠标停留在柱体上,然后按下〈P〉键;试着按一下〈E〉键呢?关于交互的内容,后续文章会进行介绍。

按键W --------------------- 网格显示模型

按键S --------------------- 曲面显示模型

按键P --------------------- 显示模型包围框

按键F --------------------- 放大到选取点

按键R --------------------- 重置相机视图

按键A ---------------------- 切换演员模式

按键C ---------------------- 切换相机模式

按键T ---------------------- 切换轨迹球模式

按键J ----------------------- 切换操纵杆模式

3、代码分析

  接下来详细解释一下示例里每行代码的含义以及所用到的VTK类。

3.1、vtkCylinderSource

  该类派生自vtkPolyDataAlgorithm。顾名思义,vtkCylinderSource 生成的数据类型就是vtkPolyData,它主要是生成一个中心在渲染场景原点的柱体,柱体的长轴沿着Y轴,柱体的
高度、截面半径等都可以任意指定。

  vtkCylinderSource::SetHeight():设置柱体的高。
  vtkCylinderSource::SetRadius():设置柱体横截面的半径。
  vtkCylinderSource::SetResolution():设置柱体横截面的等边多边形的边数。转动一下柱体然后数一数柱体横截面有多少条边,应该就能明白这个参数所表示的意思。

3.2、vtkPolyDataMapper

  该类用于渲染多边形儿何数据(vtkPolyData),派生自类vtkMapper,将输入的数据转换
为几何图元(点、线、多边形)进行渲染。
  vtkPolyDataMapper::SetInputConnection():VTK可视化管线的输入数据接口,对应的可视化管线的输出数据接口为 GetOutputPort;VTK5.0 之前的版本使用 SetInput()和 GetOutput()作为输入输出接口,后续版本继续保留。

3.3、vtkActor

  该类派生自vtkProp类,渲染场景中数据的可视化表达通过vtkProp 的子类负责。比如该示例要渲染一个柱体,柱体的数据类型是vtkPolyData,数据要在场景中渲染时,不是直接把数据加入渲染场景,而是以vtkProp的形式存在于渲染场景中。三维空间中渲染对象最常用的vtkProp子类有vtkActor(表达场景中的儿何数据)和 vtkVolume(表达场景中的体数据)。

  二维空间中的数据则是用vtkActor2D 表达:vtkProp 子类负责确定渲染场景中对象的位置、大小和方向等信息;Prop依赖于两个对象:一个是Mapper(vtkMapper)对象,负责存放数据和渲染信息;另一个是属性(vtkProperty)对象,负责控制颜色、不透明度等参数。另外,vtkActor 中还可以设置纹理(vtkTexture)对象,用于纹理贴图。

  VTK定义了大量的 Prop 类,如 vtkImageActor(负责图像显示)和 vtkPieChartActor(用于创建数组数据的饼图可视化表达形式)。其中有些 Prop内部直接包括了控制显示的参数和待渲染数据的索引,因此并不需要额外的 Property 和 Mapper 对象,例如vtkAxisActor。

  vtkActor 的子类vtkFollower 可以自动更新方向信息使其始终面向一个特定的相机,这样无论怎样旋转该对象都是可见的,例如三维场景中的广告板或者文本。vtkActor的子类vtkLODActor 可以自动改变自身的几何表达形式来实现所需的交互帧率。

  vtkAssembly建立了各个Actor 的层次结构以便在整个结构平移、旋转或缩放等变换时能够更合理地进行控制。

  vtkActor::SetMapper():该方法用于设置生成几何图元的 Mapper,即连接一个 Actor 到可视化管线的末端(Mapper是可视化管线的末端)。

3.4、vtkRenderWindow

  将操作系统与VTK渲染引擎连接到一起。不同平台下的vtkRenderWindow 子类负责管理本地计算机系统中窗口创建和渲染过程。当使用VTK开发应用程序时,只需要使用平台无关的 vtkRendererWindow 类,运行时系统会自动替换为平台相关的 vtkRendererWindow 子类。

  比如,Windows下运行上述的VTK程序,实际创建的vtkWin32OpenGLRenderWindow
(vtkRenderWindow的子类)对象。vtkRenderWindow中包含了vtkRenderer集合、渲染参数,如立体显示(Stereo)、反走样、运动模糊(Motion Blur)和焦点深度(Focal Depth)等。

  vtkRenderWindow::AddRenderer():该方法用于加入 vtkRenderer 对象。
  vtkRenderWindow::SetSize():该方法是从vtkRenderWindow的父类vtkWindow 继承过来的,用于设置窗口的大小,以像素为单位。

3.5、vtkRenderer

  负责管理场景的渲染过程。组成场景的对象包括Prop,照相机(vtkCamera)和光照
(vtkLight)都被整合到一个vtkRenderer 对象中。一个vtkRenderWindow 中可以有多个vtkRenderer对象,而这些vtkRenderer 可以渲染在窗口不同的矩形区域中(即视口)或者覆盖整个窗口区域。

  vtkRenderer::AddActor():该方法用于将 vtkProp 类型的对象添加到渲染场景中。

  vtkRenderer::SetBackground):该方法是从 vtkRenderer 的父类 vtkViewport继承的,用于设置渲染场景的背景颜色,用R、G、B的格式设置,三个分量的取值为0.0~1.0。(0.0,0.0,0.0)为黑色,(1.0,1.0,1.0)为白色。

除了可以设置单一的背景颜色之外,还可以设置渐变的背景颜色,vtkViewport::SetBackground2)用于设置渐变的另外一种颜色,但是要使背景颜色渐变生效或者关闭,必须调用以下的方法。

vtkViewport::SetGradientBackground(bool):参数为 0 时,关闭,反之,打开。
vtkViewport::GradientBackgroundOn():
该方法用于打开背景颜色渐变效果,相当于调用方法SetGradientBackground(1)。
vtkViewport::GradientBackgroundOff():
该方法用于关闭背景颜色渐变效果。相当于调用方法SetGradientBackground(0)

3.6、 vtkRenderWindowInteractor

  提供平台独立的响应鼠标、键盘和时钟事件的交互机制,通过VTK的观察者/命令模式将监听到的特定平台的鼠标、键盘和时钟事件交由vtkInteractorObserver 或其子类,如 vtkInteractorStyle 进行处理。vtkInteractorStyle 等监听这些消息并进行处理以完成旋转、拉伸和缩放等运动控制。

  vtkRenderWindowInteractor 会自动建立一个默认的3D场景交互器样式(Interactor Style):

  vtkInteractorStyleSwitch,当然也可以选择其他交互器样式或者创建自己的交互器样式,如本例中使用的 vtkInteractorStyleTrackballCamera。

  vtkRenderWindowInteractor::SetRenderWindow():该方法用于设置渲染窗口,消息是通过渲染窗口捕获到的,所以必须给交互器对象设置渲染窗口。

  vtkRenderWindowInteractor::SetInteractorStyle():该方法用于定义交互器样式,默认的交互器样式为 vtkInteractorStyleSwitch。

  vtkRenderWindowInteractor::Initialize():该方法表示为处理窗口事件做准备,交互器工作之前必须先调用这个方法进行初始化。

  vtkRenderWindowInteractor::Start。该方法表示开始进入事件响应循环,交互器处于等待状态,等待用户交互事件的发生。进入事件响应循环之前必须先调用Initialize方法。

3.7、 vtkInteractorStyleTrackballCamera

  vtkInteractorStyleTrackballCamera是交互器样式的一种。该样式下,用户通过控制相机对物体作旋转、放大、缩小等操作。打个比方,在照相时如果要想物体拍起来显得大一些,可以采取两种做法:
  第一种做法是相机不动,让要拍的物体靠近相机;第二种做法是物体不动,让相机靠近物体。第二种做法就是vtkInteractorStyleTrackballCamera 的风格,其父类为 vtkInteractorStyle。

  除了vtkInteractorStyleTrackballCamera 之外,VTK还定义了其他多种交互器样式,如vtkInteractorStyleImage,主要用于显示二维图像时的交互。

4、总结

  下面通过一个类比,从宏观角度重新审视该示例,它对理解示例的代码将会有所帮助。

  可以将以上示例看作一个舞台剧演出。观看舞台剧时,观众坐在台下,展现在观众面前的是一个舞台,舞台上有各式的灯光和各样的演员。演员出场时肯定是会先化妆,观众有时还会与台上的演员有一定的互动。

  整个剧院就好比VTK程序的渲染窗口(vtkRenderWindow);舞台就相当于渲染场景(vtkRenderer);而那些演员就是程序中的Actor,台上演员与台下观众的互动可以看作与应用程序的交互(vtkRenderWindowInteractor);

  演员与观众的互动方式有很多种,现场的观众可以直接上台跟演员们握手拥抱,电视机前的可以发短信,计算机前的可以微博关注等,这就好比程序中的交互器样式(vtkInteractorStyle)。

  对于舞台上的演员,观众都可以一一分辨出来,不会弄混,是因为他们穿着打扮、容貌都不一样,这就相当于程序中vtkActor的不同属性(vtkProperty)。

  台下观众的眼睛可以看作vtkCamera,前排的观众因为离得近,在观看台上演员时会觉得他们比较高大,而后排的观众因为离得远,所以那些演员看起来就会显得小些,每位观众看到的东西在他/她的世界里都是唯一的,所以渲染场景Renderer里的vtkCamera对象也是只有一个。

  舞台上的灯光可以有多个,所以渲染场景里的vtkLight也存在多个。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/930192.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汽车免拆案例 | 2007款宝马650i车发动机偶尔无法起动

故障现象 一辆2007款宝马650i车&#xff0c;搭载N62B48B发动机&#xff0c;累计行驶里程约为26万km。车主反映&#xff0c;发动机偶尔无法起动&#xff0c;故障频率较低&#xff0c;十几天出现1 次&#xff0c;且故障出现时起动机不工作。 故障诊断  接车后试车&#xff0c;…

Kafka单机及集群部署及基础命令

目录 一、 Kafka介绍1、kafka定义2、传统消息队列应用场景3、kafka特点和优势4、kafka角色介绍5、分区和副本的优势6、kafka 写入消息的流程 二、Kafka单机部署1、基础环境2、iptables -L -n配置3、下载并解压kafka部署包至/usr/local/目录4、修改server.properties5、修改/etc…

python中的列表、元组、字典的介绍与使用

目录 一、区别介绍 1.使用场景以及区别图 2.详细介绍 列表 元组 字典 二、例子操作 (一)列表list 1.定义和初始化 2.访问元素&#xff08;下标&#xff09; 3.修改元素&#xff08;下标&#xff09; 4.添加元素&#xff08;append、下标insert&#xff09; 5.删除…

WiFi受限不再愁,电脑无网络快速修复指南

有时在试图连接WiFi时&#xff0c;会发现网络连接受限&#xff0c;或无法正常访问互联网。这种情况不仅影响了工作效率&#xff0c;还可能错过重要的信息。那么&#xff0c;究竟是什么原因导致了电脑WiFi连接受限呢&#xff1f;又该如何解决这一问题呢&#xff1f;小A今天就来教…

【技巧】Mac上如何显示键盘和鼠标操作

在制作视频教程时&#xff0c;将键盘和鼠标的操作在屏幕上显示出来&#xff0c;会帮助观众更容易地理解。 推荐Mac上两款开源的小软件。 1. KeyCastr 这款工具从2009年至今一直在更新中。 https://github.com/keycastr/keycastr 安装的话&#xff0c;可以从Github上下载最…

c++ map对其值排序

无法直接排序,转换成vector<std::pair<string,int>> #include <iostream> #include <map> #include <vector> #include <algorithm>// 用于排序的比较函数 bool compareByValue(const std::pair<std::string, int>& a, const …

调度器、闲逛进程

调度器、闲逛进程 一、调度器/调度程序二、闲逛进程 一、调度器/调度程序 ②、③由调度程序引起&#xff0c;调度程序决定&#xff1a; 让谁运行&#xff1f;-- 调度算法 运行多长时间&#xff1f;-- 时间片大小 调度时机 – 什么事件会触发“调度程序”&#xff1f; ∙ \bull…

第七节(1)、T型加减速转动【51单片机-TB6600驱动器-步进电机教程】

摘要&#xff1a;本节介绍步进电机T型加减速的控制方法&#xff0c;分2个小节&#xff0c;本小节主要内容为该控制方法的推导与计算&#xff0c;第二节对T型加减速进行了简化计算 一.加速阶段计算 1.1 计算时间与步数关系 根据位移公式可得&#xff1a; a n g l e 0 n ∗ s…

利用 360 安全卫士极速版关闭电脑开机自启动软件教程

在使用电脑的过程中&#xff0c;过多的开机自启动软件会严重拖慢电脑的开机速度&#xff0c;影响我们的使用体验。本教程中简鹿办公将详细介绍如何使用 360 安全卫士极速版关闭电脑开机自启动软件&#xff0c;让您的电脑开机更加迅速流畅。 一、打开 360 安全卫士极速版 在电…

车联网安全学习之TBOX

Telematics BOX&#xff0c;简称 T-BOX&#xff0c;也称远程信息处理控制单元&#xff08;Telematics Control Unit, TCU&#xff09;&#xff0c;集成GPS、外部通信接口、电子处理单元、微控制器、移动通信单元和存储器等功能模块。 TBOX 提供的功能有网络接入、OTA、远程控制…

神经网络入门实战:(六)PyTorch 中的实用工具 SummaryWriter 和 TensorBoard 的说明

(一) SummaryWriter 这里先讲解 SummaryWriter &#xff0c;TensorBoard 会在第二大点进行说明。 SummaryWriter 是 PyTorch 中的一个非常实用的工具&#xff0c;它主要用于将深度学习模型训练过程中的各种日志和统计数据记录下来&#xff0c;并可以与 TensorBoard 配合使用&am…

C#实现一个HttpClient集成通义千问-开发前准备

集成一个在线大模型&#xff08;如通义千问&#xff09;&#xff0c;来开发一个chat对话类型的ai应用&#xff0c;我需要先了解OpenAI的API文档&#xff0c;请求和返回的参数都是以相关接口文档的标准进行的 相关文档 OpenAI API文档 https://platform.openai.com/docs/api-…

开发知识点-uniCloud

开发知识点-uniCloud 服务空间云函数 cloudfunctions云对象importObjectJSON 格式的文档型数据库Collection unicloud数据的指定表集合 DB SchemaJQL 语法参考资料 服务空间 项目关联空间 云函数 cloudfunctions 云对象importObject JSON 格式的文档型数据库 nosql 非关系…

Vue Web开发(二)

1. 项目搭建 1.1. 首页架子搭建 使用Element ui中的Container布局容器&#xff0c;选择倒数第二个样式&#xff0c;将代码复制到Home.vue。 1.1.1.下载less &#xff08;1&#xff09;下载less样式 npm i less   &#xff08;2&#xff09;下载less编辑解析器 npm i less…

GWAS分析先做后学

大家好&#xff0c;我是邓飞。 GWAS分析是生物信息和统计学的交叉学科&#xff0c;上可以学习编程&#xff0c;下可以学习统计。对于Linux系统&#xff0c;R语言&#xff0c;作图&#xff0c;统计学&#xff0c;机器学习等方向&#xff0c;都是一个极好的入门项目。生物信息如…

Go学习:变量

目录 1. 变量的命名 2. 变量的声明 3. 变量声明时注意事项 4. 变量的初始化 5. 简单例子 变量主要用来存储数据信息&#xff0c;变量的值可以通过变量名进行访问。 1. 变量的命名 在Go语言中&#xff0c;变量名的命名规则 与其他编程语言一样&#xff0c;都是由字母、数…

Netty 心跳机制示例 —— 服务端实现

Netty 心跳机制示例 —— 服务端实现 1. 背景 在分布式系统和网络通信中&#xff0c;保持客户端与服务器端的连接活跃是非常重要的。如果长时间没有数据传输&#xff0c;连接可能会超时或被中断。为了解决这个问题&#xff0c;我们可以通过 心跳机制 来保证连接持续有效。 N…

【Linux】 进程池 一主多从 管道通信

目录 1.代码介绍 2.channel 类 3.进程池类编写 4.主函数及其他 5. 源码 1.代码介绍 本文代码采用一主多从式&#xff08;一个主进程&#xff08;master&#xff09;多个子进程&#xff08;worker&#xff09;&#xff09;通过管道进行通信&#xff0c;实现主进程分发任务&…

小红薯最新x-s 算法补环境教程12-06更新(下)

在上一篇文章中已经讲了如何去定位x-s生成的位置&#xff0c;本篇文章就直接开始撸代码吧 如果没看过的话可以看&#xff1a;小红薯最新x-s算法分析12-06&#xff08;x-s 56&#xff09;&#xff08;上&#xff09;-CSDN博客 1、获取加密块代码 首先来到参数生成的位置&…

Nacos源码学习-本地环境搭建

本文主要记录如何在本地搭建Nacos调试环境来进一步学习其源码&#xff0c;如果你也刚好刷到这篇文章&#xff0c;希望对你有所帮助。 1、本地环境准备 Maven: 3.5.4 Java: 1.8 开发工具&#xff1a;idea 版本控制工具: git 2、下载源码 官方仓库地址 &#xff1a;https://git…