文章目录
概要
本文主要介绍VTK9.3.1如何在Windows10上使用VS2022和QT进行编译安装。
搭建编译环境
- 先从VTK官网下载VTK9.3.1的源码,VTK下载地址
- 我们可以按照官方推荐的编译方式进行编译,首先设置三个文件夹
VTK-9.3.1-src:存放从VTK官方下载的源码
VTK-9.3.1-build:存放使用Cmake编译VTK生成的二进制文件
VTK-9.3.1-release:存放使用Visual Studio生成的lib文件的Release版本
3.从Cmake官方下载CMake用于编译VTK库,Cmake下载地址
我的系统是Windows10_X64,所以我选在了第一个,选择哪一个下载根据自己系统决定即可。
编译源代码
打开已经安装的CMake,选在VTK的源码存放路径VTK-9.3.1-src,以及build存放路径VTK-9.3.1-build,然后点击按钮Configure,此时会弹出窗口选择Visual Studio 17 2022,编译x86还是x64可以自己选择。我编译的的x64版本。点击Finish进行编译。
编译完成后会出现一些红色选项,我们首先需要解决这些红色选项。
我们可以自己选择VTK库的安装路径,CMAKE_INSTAKK_PREFIX就是VTK库要安装的位置,V通过VTK源码编译完成后生成的库文件所在位置,在这里我把安装路径修改为VTK-9.3.1-release,然后在后续的编译中,生成的VTK就会默认存放在路径VTK-9.3.1-release下。
最后需要在搜索窗口中搜索Qt,将所有的选项从DEFAULT改为WANT即可。设置完成后点击Configure继续编译。
Configure编译结束后,仍然会出现红色区域。出现红色区域的原因主要是让我们选择Qt的版本,我们用的版本是5.14.2,所以Qt版本选择5就可以了。即VTK_QT_VERSION为5。
而Qt的位置,我们只需要在Qt安装成功后,将其加入到环境变量中,那么就会自动检测到Qt的安装路径。
以上配置完成后,继续点击按钮Configure,编译完成后,如果此时只有白色界面,那么恭喜你,代表编译成功了。然后点击按钮Generate,完成后如果也只有白色界面,代表没有错误。最后点击Open Project就会打开Visual Studio 2022。
Visual Studio 2022编译并安装VTK
我编译的是Release x64版本的,右键选择项目ALL_BUILD然后选择生成进行编译。
可以看出已经编译成功了,接下来我们来生成VTK库文件
右键点击INSTALL项目,选择生成。此时生成的VTK库文件都存放在VTK-9.3.1-release路径下。
Visual Studio 2022 + Qt使用VTK
VTK编译成功后,当然是先来试一试能否正常使用了。我是采用VS2022+Qt写了一个测试demo。VS2022如何配置Qt环境可以自行搜索相关教程,这里就不做赘述了。
首先在Qt的窗口界面添加控件openGLWidget,然后右键点击提升为,提升为QVTKOpenGLNativeWidget,界面如下所示:
示例代码:
#include "QtVTKDemo.h"
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCylinderSource.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkRenderer.h>
#include <array>
QtVTKDemo::QtVTKDemo(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());
vtkNew<vtkNamedColors> colors;
std::array<unsigned char, 4> bkg = { {26, 51, 102, 255} };
colors->SetColor("BkgColor", bkg.data());
vtkNew<vtkCylinderSource> cylinder;
cylinder->SetResolution(8);
vtkNew<vtkPolyDataMapper> cylinderMapper;
cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
vtkNew<vtkActor> cylinderActor;
cylinderActor->SetMapper(cylinderMapper);
cylinderActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());
cylinderActor->RotateX(30.0);
cylinderActor->RotateY(-45.0);
vtkNew<vtkRenderer> renderer;
renderer->AddActor(cylinderActor);
renderer->SetBackground(colors->GetColor3d("BkgColor").GetData());
renderer->ResetCamera();
renderer->GetActiveCamera()->Zoom(1.5);
vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
renderWindow->AddRenderer(renderer);
ui.openGLWidget->setRenderWindow(renderWindow);
}
效果展示:
完整代码下载