当前位置:   article > 正文

VTK模块学习(一)

vtk

VTK模块学习(一)

1、仅依赖于cmake编译好的VTK

    推荐一篇博客:《VTK基础及应用开发教程》,版权归 @东灵工作室所有
    对于仅需cmake编译好的VTK实现可视化的人群,可参考此博客进行学习(干货多多)✨✨✨。

    在此,演示如何创建一个简单的VTK程序 + 显示一个简单的VTK-3D实例。
    流程如下:
        ①:新建一个文件夹名为Examples,然后在新建的文件夹下面再创一个文件夹名为TestVTKInstall。

在这里插入图片描述
        ②:在文件夹TestVTKInstall下创建一个bin文件夹、CMakeLists.txt以及TestVTKInstall.cpp文件。

在这里插入图片描述
        ③:在CMakeLists.txt文件里插入以下代码:

CMAKE_MINIMUM_REQUIRED(VERSION 3.13)
PROJECT(TestVTKInstall)
FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})
ADD_EXECUTABLE(TestVTKInstall TestVTKInstall.cpp)
TARGET_LINK_LIBRARIES(TestVTKInstall ${VTK_LIBRARIES})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

        在此详细说明一下这几行代码实现的功能,如下:

        1、CMAKE_MINIMUM_REQUIRED 该命令用于指定构建工程时所需要的cmake版本要求。我自己的cmake版本时3.13.0,即VERSION后面所跟的版本号为3.13.0,第三个参数是可选的,0可不写。

        2、PROJECT 该命令指定工程名称。可指定工程支持的语言,默认C\C++。存在两个隐含的cmake变量 <projectName>_BINARY_DIR<projectName>_SOURCE_DIR,在这个例子里就是 TestVTKInstall_BINARY_DIR 以及 TestVTKInstall_SOURCE_DIR。同时cmake也预定义了 PROJECT_BINARY_DIRPROJECT_SOURCE_DIR 变量,他们的值分别跟 <projectname>_BINARY_DIR<projectname>_SOURCE_DIR一致。为了统一起见,以后直接使用 PROJECT_BINARY_DIRPROJECT_SOURCE_DIR 分别表示工程的编译路径和源码路径,即这个例子里的 “F:\VTK\Examples\TestVTKInstall\bin”“F:\VTK\Examples\TestVTKInstall”,因为这样即使修改了工程名称,也不会影响这两个变量。

        3、FIND_PACKAGE 该命令用于搜索并加载外部工程。隐含的变量为 <package>_FOUND,用于标示是否搜索到所需的工程。参数 [REQUIRED] 表示所要搜索的外部工程对本工程来说是必须的,如果没有搜索到,cmake会终止整个工程构建过程。对VTK为例,FIND_PACKAGE命令搜索的就是VTK的配置文件 VTKConfig.cmake

        4、INCLUDE 指定载入一个文件或者模块,如果指定的是模块,那么将在CMAKE_MODULE_PATH中搜索这个模块并载入,在本例中,指定的是VTK模块,则会在CMAKE_MODULE_PATH中搜索VTK模块并载入,变量CMAKE_MODULE_PATH指的是搜索cmake模块的目录。本人的cmake模块目录为 “D:\cmake-3.13.0-rc1-win64-x64\share\cmake-3.13\Modules”,在该目录下,有FindVTK.cmake文件。在这个文件里我们发现就有变量VTK_USE_FILE的说明信息。

        5、ADD_EXECUTABLE 定义这个工程会生成一个文件名为 <name> 的可执行文件。

        6、TARGET_LINK_LIBRARIES 指定生成可执行文件时需要链接哪些文件。采用 ${VTK_LIBRARIES} 来获取需要的lib库名称。

        ④:在TestVTKInstall.cpp文件里插入以下代码:

#include "vtkRenderWindow.h"
#include "vtkSmartPointer.h"

int main()
{
	//定义一个类型为vtkRenderWindow的对象
 	vtkRenderWindow *renWin = vtkRenderWindow::New();
 	//调用vtkRenderWindow里的方法显示并渲染VTK窗口
	renWin->Render();
	
	//使程序暂停下来,等待用户的输入
 	std::cin.get();
 	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

        ⑤:打开cmake程序,在cmake的“Where is the source code”一栏输入路径:F:/VTK/Examples/TestVTKInstall,在“Where to build the binaries”一栏输入路径:F:/VTK/Examples/TestVTKInstall/bin,接着按“Configure”按钮。

在这里插入图片描述
        ⑥:点击Finish后,会出现如下错误提示窗口(原因:由于在编译生成的VTK的时候,修改了VTK_Install的默认路径)。

在这里插入图片描述
        ⑦:点击OK后,修改VTK_DIR

在这里插入图片描述
        ⑧:点击Configure。

在这里插入图片描述
        ⑨:点击Generate。

在这里插入图片描述
        ⑩:在TestVTKInstall点击右键,设置为启动项目。

在这里插入图片描述
        ⑪:点击运行,系统错误(找不到有关vtk相关的dll文件)。

在这里插入图片描述
        ⑫:解决方法:右键项目->属性->调试,将环境设置为如下路径,并保存。

PATH=F:\VTK\VTK_Install\bin;%PATH%
  • 1

在这里插入图片描述
        ⑬:点击运行(发现并没有VTK效果图展示出来),如图所示:

在这里插入图片描述
        ⑭:解决方法:添加如下代码,运行,如图所示:

#include "vtkAutoInit.h"

//VTK是用vtkRenderingOpenGL2构建的(用于显示VTK窗体)
VTK_MODULE_INIT(vtkRenderingOpenGL2);
//Warning: Link to vtkInteractionStyle for default style selection(警示)
VTK_MODULE_INIT(vtkInteractionStyle);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

        ⑮:举例上述推荐博客中 03-VTK基础概念(1) 的代码,运行,如图所示:

在这里插入图片描述

/********************************************************************/
/*
运行的效果图可以使用鼠标与其进行交互
1、 用鼠标滚轮可以对柱体放大、缩小
2、 按下鼠标左键不放,然后移动鼠标,可以转动柱体
3、 按下鼠标左键,同时按下Shift键,移动鼠标,可以移动整个柱体
4、 按下Ctrl键时再按鼠标左键 只可旋转柱体
	
	……………………
*/
/********************************************************************/
#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 "vtkBMPReader.h"
#include "vtkTexture.h"

#include "vtkAutoInit.h"

//VTK是用vtkRenderingOpenGL2构建的(用于显示VTK窗体)
VTK_MODULE_INIT(vtkRenderingOpenGL2);
//Warning: Link to vtkInteractionStyle for default style selection(警示)
VTK_MODULE_INIT(vtkInteractionStyle);

int main()
{
	//读取图片数据
	vtkSmartPointer<vtkBMPReader> bmpReader = vtkSmartPointer<vtkBMPReader>::New();
	bmpReader->SetFileName("ganxie.bmp");

	//将读入的图片传入texture
	vtkSmartPointer<vtkTexture> texture = vtkSmartPointer<vtkTexture>::New();
	texture->SetInputConnection(bmpReader->GetOutputPort());
	texture->InterpolateOn();

	//vtkCylinderSource派生自vtkPolyDataAlgorithm
	//生成一个中心在渲染场景原点的柱体,柱体的长轴沿着Y轴,柱体的高度、截面半径等都可以任意指
	vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New();

	//设置柱体的高
	cylinder->SetHeight(3.0);
	//设置柱体截面的半径
	cylinder->SetRadius(1.0);
	//设置柱体横截面的等边多边形的边数
	cylinder->SetResolution(10);

	//vtkPolyDataMapper派生自类vtkMapper,将输入的数据转换为几何图元(点、线、多边形)进行渲染。
	vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();

	//VTK可视化管线的输入数据接口(功能暂时未知)
	cylinderMapper->SetInputConnection(cylinder->GetOutputPort());

	//vtkActor派生自vtkProp类,作用:渲染场景中数据的可视化表达(具体参考提供博客详解)
	vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New();

	//设置生成几何图元的Mapper。即连接一个Actor到可视化管线的末端(可视化管线的末端就是Mapper)。
	cylinderActor->SetMapper(cylinderMapper);
	cylinderActor->SetTexture(texture);

	//vtkRenderer派生自vtkViewport类,作用:负责管理场景的渲染过程。一个vtkRenderWindow中可以有多个vtkRenderer对象,而这些vtkRenderer可以渲染在窗口中不同的矩形区域中(即视口),或者覆盖整个窗口区域。
	vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();

	//添加vtkProp类型的对象到渲染场景中
	renderer->AddActor(cylinderActor);

	//用于设置渲染场景的背景颜色,用R、G、B的格式设置,三个分量的取值为0.0~ 1.0。(0.0,0.0, 0.0)为黑色,(1.0,1.0, 1.0)为白色。
	renderer->SetBackground(0.1, 0.2, 0.4);

	//vtkRenderWindow派生自vtkViewport类,作用:将操作系统与VTK渲染引擎连接到一起。
	vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();

	//加入vtkRenderer对象
	renWin->AddRenderer(renderer);

	//用于设置窗口的大小,以像素为单位
	renWin->SetSize(300, 300);

	//vtkRenderWindowInteractor派生自vtkObject类,作用:提供平台独立的响应鼠标、键盘和时钟事件的交互机制。
	vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();

	//设置渲染窗口,消息是通过渲染窗口捕获到的,所以必须要给交互器对象设置渲染窗口。
	iren->SetRenderWindow(renWin);

	//vtkInteractorStyleTrackballCamera派生自vtkInteractorStyle类,交互器样式的一种,该样式下,用户是通过控制相机对物体作旋转、放大、缩小等操作。
	vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	
	//设置交互器样式
	iren->SetInteractorStyle(style);

	//初始化交互窗口
	iren->Initialize();

	//启动窗口事件循环
	iren->Start();

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102

在这里插入图片描述

2、基于OpenCV编译下的VTK

    由于没有找到具体的参考文献(渴求:如果谁有整系列的(前提是免费的)可以告诉我,我会整理出来给大家分享哦,感谢

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/996159
推荐阅读
相关标签