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 = 0

win32{
    VTK_DIR = D:/VTK
    INCLUDEPATH += $${VTK_DIR}/include/vtk-9.3
    LIBS += $${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窗口,并展示了一个简单的三维可视化场景。     

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

        将渲染窗口 vtkRenderWindow 看作一个剧院,剧院中一般需要有灯光(vtkLight)、相机(vtkCamera,可以理解为观众)和舞台(vtkRenderer)来为观众呈现精彩的演出;舞台上负责表演的自然是演员(vtkActor),而且演员通常不止一个,可以根据需要为舞台加入更多的演员(vtkActor)。每个演员又各具特色,而用来表示其特色的则是vkProperty(负责控制颜色、材质以及不透明度等);每个vkActor 的数据和渲染信息存储在一个vtkMapper 对象中,负责将原始数据转换为渲染所需的图元数据。

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

VTK用户指南 版本4.0 William J. Schroeder 1998-2000 第一部分 VTK 介绍 第1章 欢迎 机构-----------------------------------------------------------------------------------------------8 怎样使用VTK----------------------------------------------------------------------------------8 附加资源-----------------------------------------------------------------------------------------8 第2章 安装 2.1 概述-----------------------------------------------------------------------------------------------9 2.2 安装VTK到Windows9x/NT/ME/2000/XP------------------------------------------------9 二进制安装-------------------------------------------------------------------------------------9 源代码安装-------------------------------------------------------------------------------------9 2.3 安装VTK到Unix操作系统 源代码安装------------------------------------------------------------------------------------10 运行CMake------------------------------------------------------------------------------------11 编译源代码 建立VTK多平台 安装VTK 第3章 系统概述 3.1 系统设计---------------------------------------------------------------------------------------12 图形模型--------------------------------------------------------------------------------------13 可视化模型-----------------------------------------------------------------------------------15 3.2 创建一个应用---------------------------------------------------------------------------------19 用户方法、对象和命令--------------------------------------------------------------------19 Tcl----------------------------------------------------------------------------------------------19 C++---------------------------------------------------------------------------------------------20 Java Phthon Visual Basic/COM/ActiveX 3.3 在两种语言间转换 第二部分 通过例子学习VTK 第4章 基础 4.1 创建1个简单的模型-------------------------------------------------------------------------24 程序化源对象---------------------------------------------------------------------------------24 读取源对象------------------------------------------------------------------------------------26 4.2 使用VTK交互器-----------------------------------------------------------------------------27 vtk绘制窗口交互器 交互风格 4.3 滤波数据---------------------------------------------------------------------------------------29 4.4 控制相机---------------------------------------------------------------------------------------30 安装相机 简单操作方法 控制视角方向 透视与正交视 保存与恢复相机状态 4.5 控制光线---------------------------------------------------------------------------------------32 位置光 4.6 控制3D道具-----------------------------------------------------------------------------------32 指定vtk道具3D位置 演员 演员的详细级 装配 体 vtk装载3D道具 4.7 作用纹理---------------------------------------------------------------------------------------37 4.8 拾取---------------------------------------------------------------------------------------------38 vtk装配路线 例子 4.9 vtk坐标和坐标系---------------------------------------------------------------------------40 4.10 控制vtk演员2D----------------------------------------------------------------------------41 4.11 注释--------------------------------------------------------------------------------------------41 2D注释 3D注释和vtk跟踪 4.12 特殊绘图类-----------------------------------------------------------------------------------44 尺度棒 X-Y绘制 边界盒轴 标记数据 4.13 变换数据--------------------------------------------------------------------------------------48 高级变换 第5章 可视化技术 5.1 可视化VTK数据集vtkDataSet(和子类) -------------------------------------------------50 使用数据属性进行工作 颜色映射 轮廓化 浮雕化 流线图 流线表面 剪裁 融合数据 附加数据 用另外一个尺度给等值面赋颜色 抽取单元格子集 抽取单元格作为多边形数据 5.2 可视化多边形数据---------------------------------------------------------------------------67 手工产生多边形数据 产生表面当量 十比一抽取 平滑网格 粘贴数据 产生纹理坐标 5.3 可视化结构网格-----------------------------------------------------------------------------74 手工产生结构化网格 抽取计算平面 结构网格子样化 5.4 可视化直线网格-----------------------------------------------------------------------------76 手工产生VTK直线网格 抽取计算平面 5.5 可视化非结构网格--------------------------------------------------------------------------77 手工产生VTK非结构网格 抽取部分网格 非结构网格轮廓化 第6章 可视化图像和体数据 6.1 VTK结构化点的历史表示-----------------------------------------------------------------80 6.2 手工产生VTK图像数据-------------------------------------------------------------------80 6.3 抽取图像数据子样--------------------------------------------------------------------------81 6.4 基于尺度值的弯曲--------------------------------------------------------------------------83 6.5 图像显示--------------------------------------------------------------------------------------83 图像观察者 图像演员 6.6 图像源-----------------------------------------------------------------------------------------85 2D帆布图像源 3D椭圆体图像源 高斯图像源 网格图像源 噪声图像源 正弦曲线源 6.7 图像处理--------------------------------------------------------------------------------------88 梯度化 高斯平滑 直方图 图像逻辑 重新切片 6.8 体绘制-----------------------------------------------------------------------------------------92 一个简单的例子 为什么会有多种体绘制技术? 产生一个VTK体 使用片层化函数 使用颜色变换函数 在一个体属性控制颜色和透明度 在一个体属性控制阴影 产生一个体映射 裁剪一个体 粘贴一个体 对一个体应用3D纹理 控制标准编码 体素光线计算 2D纹理映射 VolumePro绘制硬件 速度和精确度交替使用 使用vtkLODProp3D改善性能 可行性/局限性技术 第7章 建立模型 7.1 隐模型----------------------------------------------------------------------------------------114 定义隐函数 对隐函数进行抽样 7.2 挤压-------------------------------------------------------------------------------------------117 7.3 构建表面-------------------------------------------------------------------------------------119 Delaunay三角形化 高斯油彩 无组织点产生表面 第三部分 VTK研发者指南 第8章 数据接口和其他 8.1 读入器----------------------------------------------------------------------------------------130 多边形数据读入器 图像和体素读入器 数据集读入器 结构化网格读入器 线性网格读入器 非结构化网格读入器 8.2 写入器----------------------------------------------------------------------------------------131 多边形数据读入器 图像和体素读入器 结构化网格读入器 线性网格读入器 非结构化网格读入器 8.3 输入者----------------------------------------------------------------------------------------132 8.4 输出者----------------------------------------------------------------------------------------132 8.5 创建硬拷贝----------------------------------------------------------------------------------132 保存图像 保存大(高分辨率)图像 8.6 产生动画(使用样条) -----------------------------------------------------------------------134 8.7 使用现场数据工作--------------------------------------------------------------------------136 第9章 贡献编码 9.1 编码补偿--------------------------------------------------------------------------------------141 为VTK贡献编码的条件 编码风格 如何贡献编码 9.2 标准方法: 创建和消除对象---------------------------------------------------------------142 9.3 拷贝对象和受保护的方法------------------------------------------------------------------143 9.4 写一个VTK类: 综述-----------------------------------------------------------------------144 找到一个相似类 识别一个超类 单个类Per.h 文件 必需的方法 文档编码 使用SetGet宏 向VTK添加类 9.5 对象工厂--------------------------------------------------------------------------------------145 综述 如何写一个工厂 如何安装一个工厂 例子工厂 第10章 流水线执行管理 10.1 执行过程--------------------------------------------------------------------------------------151 概述和术语 更新信息通道 传播更新扩展通道 触发异步更新通道 更新数据通道 10.2 使用流---------------------------------------------------------------------------------------162 第11章 VTK数据对象接口 11.1 数据组---------------------------------------------------------------------------------------166 方法 11.2 数据集---------------------------------------------------------------------------------------169 11.3 VTK数据集接口---------------------------------------------------------------------------170 方法 例子 11.4 VTK图像数据接口-----------------------------------------------------------------------174 方法 例子 11.5 VTK点集接口-----------------------------------------------------------------------------176 方法 例子 11.6 VTK结构化网格接口---------------------------------------------------------------------178 方法 例子 11.7 VTK线性网格接口-----------------------------------------------------------------------178 方法 例子 11.8 VTK多边形数据接口---------------------------------------------------------------------179 方法 例子 11.9 VTK非结构化网格接口-----------------------------------------------------------------184 方法 例子 11.10 单元格接口(VTK单元格子类) ------------------------------------------------------185 11.11 其他接口----------------------------------------------------------------------------------187 点 单元格数组 单元格类型 单元格连接 11.12 现场和属性数据接口------------------------------------------------------------------193 现场数据方法 数据集属性方法 第12章 如何写一个过程方法 12.1 概述----------------------------------------------------------------------------------------196 永远不要修改输入数据 参考计数数据 使用Debug宏 回收/删除截入的内在 修改时间 过程事件和异常终止执行 12.2 如何写一个绘图过滤器---------------------------------------------------------------199 概述 简单过滤器 复杂过滤器和流水线执行 抽取绘图过滤器 程序过滤器 重载流水执行方法 12.3 如何写一个图像过滤器---------------------------------------------------------------210 实现一个图像过滤器 第13章 用窗口系统集成 13.1 绘制窗口交互风格--------------------------------------------------------------------------216 13.2 GUI交互的总指导线------------------------------------------------------------------------217 13.3 X Window, Xt, and Motif--------------------------------------------------------------------221 13.4 MS Windows/Microsoft Foundation Classes---------------------------------------------226 13.5 Tcl/Tk-------------------------------------------------------------------------------------------227 13.6 Java 第14章 编码资源 14.1 对象图表--------------------------------------------------------------------------------------230 基础 单元格 数据集 流水线 源 过滤器 映射器 图形 体绘制 成像 OpenGL绘制器 拾取 变换塔形结构 14.2 过滤器总结-----------------------------------------------------------------------------------237 可视化过滤器 映射者对象 演员对象 14.3 VTK文件格式--------------------------------------------------------------------------------244 二进制文件 数据集属性格式 例子 第15章 光盘 15.1 源代码 15.2 例子代码 15.3 Window 9x/NT/ME/2000/XP 预编译二进制 15.4 数据 15.5 文档 15.6 退化测试图像 15.7 Kitware 应用
在Ubuntu上配置Qt应用使用VTK( Visualization Toolkit)显示点云,你需要几个步骤: 1. **安装依赖**: - 首先,更新包列表并安装必要的软件包,如`qt5-default`, `libqt5svg5-dev`, 和 `libvtk7-dev`: ``` sudo apt-get update && sudo apt-get install qt5-default libqt5svg5-dev libvtk7-dev ``` 2. **下载和构建VTK**: - 如果需要最新版本的VTK,你可以从官网下载源码,并按照官方文档进行编译。通常在`src`目录下运行`./configure`,然后`make`和`sudo make install`。 3. **集成VTKQt项目**: - 使用Qt Creator创建新项目时,选择QMake作为工程类型,然后在.pro文件添加VTK库引用: ```pro QT += opengl vtkwidgets includePATH += /usr/include/vtk-7.0 LIBS += -L/usr/lib/x86_64-linux-gnu/vtk-7.0 -lvtkCommonWidgets -lvtkFiltersPoints -lvtkRenderingFreeType -lvtkRenderingContextOpenGL2 -lvtkImagingCore -lvtkFiltersSources ``` 或者如果你使用CMake,会在CMakeLists.txt类似设置。 4. **编写代码**: - 在你的Qt源代码,导入所需的VTK头文件,例如`#include <vtkSmartPointer.h>`, 然后创建和渲染点云数据: ```cpp vtkSmartPointer<vtkPolyDataMapper> mapper; mapper->SetInputConnection(pointCloudReader->GetOutputPort()); actor->SetMapper(mapper); scene->AddActor(actor); ``` 其`pointCloudReader`是一个代表VTK读取点云的类,比如`vtkXMLPolyDataReader`。 5. **显示**: - 最后,在窗口设置并显示VTK场景: ```cpp renderer->ResetCamera(); renderWindow->Render(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值