VTK随笔一:初识VTK(QT中嵌入VTK窗口)

2024-08-23 05:36
文章标签 初识 qt 窗口 随笔 嵌入 vtk

本文主要是介绍VTK随笔一:初识VTK(QT中嵌入VTK窗口),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        VTK(Visualization Toolkit)是一个用于可视化和图形处理的开源软件库。它提供了一系列的算法和工具,可以用来创建、渲染和处理二维和三维的图形数据。VTK可以在多个平台上运行,并支持各种编程语言,包括C++、Python和Java。

        VTK的核心功能包括几何处理、图形渲染、体积渲染、图像处理、交互式可视化和数据分析。它支持多种常用的数据格式,如图像、网格、点云和体数据。使用VTK,用户可以在图形界面中创建和编辑复杂的三维场景,并进行实时的交互操作。

        VTK还提供了丰富的可视化效果,如光照、阴影、透明度、纹理映射和体积渲染等。用户可以通过编程接口来定制和扩展VTK的功能,以满足特定的需求。

        VTK被广泛应用于科学、工程、医学、地质和计算机图形学等领域。它可以用于可视化和分析科学数据,创建交互式的可视化应用程序,以及进行科学研究和教育。由于VTK的开源性质和强大的功能,它成为了可视化和图形处理领域的重要工具之一。

一、环境搭建

1、安装详情请见:Windosw下Visual Studio2022编译安装VTK(支持QT),ITK-CSDN博客 

 2、安装完VTK后将VTK目录加入环境变量

二、使用VTK

        以创建一个八边形圆柱体为示例,演示VTK的基本渲染和管道创建。 

1、创建QT项目Cylinder

2、配置VTK库

 在Cylinder.pro中添加如下代码:

QMAKE_PROJECT_DEPTH = 0win32{VTK_DIR = D:/VTKINCLUDEPATH += $${VTK_DIR}/include/vtk-9.3LIBS += $${VTK_DIR}/lib/vtk*.lib
}

需要注意的是VTK区分Debug和Release的库,链接错误运行程序会报错:QWidget: Must construct a QApplication before a QWidget 

3、编写代码 

在mainwindow.ui中添加一个Qwidget,提升为QVTKOpenGLNativeWidget ,头文件QVTKOpenGLNativeWidget.h

依次点击“添加”,“提升”

修改mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCylinderSource.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkGenericOpenGLRenderWindow.h>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// QVTKOpenGLNativeWidget//设置背景颜色vtkNew<vtkNamedColors> colors;std::array<unsigned char, 4> bkg{{26, 51, 102, 255}};colors->SetColor("BkgColor", bkg.data());//创建圆柱体 并设置为八边形圆柱体vtkNew<vtkCylinderSource> cylinder;cylinder->SetHeight(2.0);	//设置柱体的高cylinder->SetRadius(1.0);	//设置柱体横截面的半径cylinder->SetResolution(8);	//设置柱体横截面的等边多边形的边数。// 将定义好的图形推送到图形库中//vtkPolyDataMapper类用于渲染多边形几何数据(vtkPolyData),派生类自vtkMapper,将输入的数据转换为几何图元(点、线、多边形)进行渲染。vtkNew<vtkPolyDataMapper> cylinderMapper;//vtkPolyDataMapper::SetInputConnection():VTK可视化管线的输入数据接口,对应的可视化管线的输出数据接口为GetOutputPort();cylinderMapper->SetInputConnection(cylinder->GetOutputPort());// 设置纹理 颜色 点击后的旋转角度// 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是可视化管线的末端)。vtkNew<vtkActor> cylinderActor;cylinderActor->SetMapper(cylinderMapper);cylinderActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());cylinderActor->RotateX(30.0);cylinderActor->RotateY(-45.0);// 渲染// vtkRenderer 负责管理场景的渲染过程。组成场景的对象包括Prop,照相机(vtkCamera)和光照(vtkLight)都被整合到一个vtkRenderer对象中。一个vtkRenderWindow中可以有多个vtkRenderer对象,而这些vtkRenderer可以渲染在窗口不同的矩形区域中(即视口)或者覆盖整个窗口区域。vtkNew<vtkRenderer> renderer;// 该方法用于将vtkProp类型的对象添加到渲染场景中renderer->AddActor(cylinderActor);// vtkRenderer::SetBackground():该方法是从vtkRenderer的父类vtkViewport继承的,用于设置渲染场景的背景颜色,用R、G、B的格式设置,三个分量的取值为0.0~1.0。renderer->SetBackground(colors->GetColor3d("BkgColor").GetData());  renderer->ResetCamera();//根据可见的演员自动设置相机renderer->GetActiveCamera()->Zoom(1.5);// 显示renderer 的窗口vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;renderWindow->AddRenderer(renderer);ui->widget->setRenderWindow(renderWindow);}MainWindow::~MainWindow()
{delete ui;
}

 4、编译运行

 因为VTK库编译的是Release 64位的,所有编译时选择Release 64位

运行效果如下:

         。

 三、总结

        VTK是一个强大的开源可视化工具,可以帮助我们实现各种复杂的数据可视化任务。通过本文,我们初步了解了如何在QT中嵌入VTK窗口,并展示了一个简单的三维可视化场景。     

        可以将以上示例看作一个舞台剧演出。观看舞台剧时,观众坐在台下,展现在观众面前的是一个舞台,舞台上有各式的灯光和各样的演员。

        整个剧院就好比VTK程序的渲染窗口(vtkRenderWindow)舞台就相当于渲染场景(vtkRenderer);而那些演员就是程序中的Actor;对于舞台上的演员,观众都可以一一分辨出来,不会弄混,是因为他们穿着打扮、容貌都不一样,这就相当于程序中vtkActor的不同属性(vtkProperty);台下观众的眼睛可以看作vtkCamera,前排观众因为离得近,在观看台上演员时会觉得他们比较高大,而后排的观众因为离得远,所以那些演员看起来就会显得小些,每位观众看到的东西在他/她的世界里都是唯一的,所以渲染场景Renderer里的vtkCamera对象也是只有一个;舞台的灯光可以有多个,所以渲染场景里的vtkLight也存在多个。

这篇关于VTK随笔一:初识VTK(QT中嵌入VTK窗口)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.

使用WPF实现窗口抖动动画效果

《使用WPF实现窗口抖动动画效果》在用户界面设计中,适当的动画反馈可以提升用户体验,尤其是在错误提示、操作失败等场景下,窗口抖动作为一种常见且直观的视觉反馈方式,常用于提醒用户注意当前状态,本文将详细... 目录前言实现思路概述核心代码实现1、 获取目标窗口2、初始化基础位置值3、创建抖动动画4、动画完成后

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句