深入浅出VTK:使用Visual Studio配置VTK环境并编写示例
本文详细介绍了在Visual Studio中配置和使用VTK库的方法。主要内容包括:如何在VS中配置VTK环境,包括设置头文件路径、静态链接库路径和依赖项;如何将配置好的项目导出为模板,方便后续快速创建VTK项目;提供了一个简单的VTK示例代码,验证环境配置是否正确。文章还提供了相关配置截图和详细的静态库列表,并强调了使用vtkAutoInit进行模块初始化的必要性。通过本文的指导,读者可以快速搭建VTK开发环境并开始相关开发工作。

前言
本篇博客主要内容是讲解入门VTK的一个简单项目,包含如何在Visual Studio中引入VTK,导出项目模板等内容。
Visual Studio中导入VTK
讲解如何在Visual Studio中引入VTK并使用之前,需要读者自行配置好VTK库,如果还没有配置的读者可以参考以下文章:
深入浅出VTK:编译并使用VTKhttps://blog.csdn.net/weixin_67035108/article/details/142257431?sharetype=blogdetail&sharerId=142257431&sharerefer=PC&sharesource=weixin_67035108&spm=1011.2480.3001.8118由于市面上大多数的内容是使用CMake来编写对VTK项目的管理,所以如果刚兴趣如何使用CMake以及如何编写CMakeLists的读者可以参考以下文章:
高效工具实战指南:CMake构建工具https://blog.csdn.net/weixin_67035108/article/details/155361963?spm=1001.2014.3001.5501高效工具实战指南:从零开始编写CMakeListshttps://blog.csdn.net/weixin_67035108/article/details/142031902?spm=1001.2014.3001.5501在了解这些前置内容后,本篇博客将重点讲解如何在Visual Studio中配置VTK并且使用VTK来实现功能。在我们编译好VTK的Debug版本和Release版本以后,我们会得到以下文件:
VTK9.5.2_MSVC_Win ├─debug │ ├─bin // Debug动态链接库文件 │ ├─include // Debug头文件 │ │ └─vtk-9.5 │ ├─lib // Debug静态链接库文件 │ └─share // 源码 └─release ├─bin // Release动态链接库文件 ├─include // Release头文件 │ └─vtk-9.5 ├─lib // Release静态链接库文件 └─share // 源码在了解这些文件夹的作用以后,我们需要在Visual Studio创建一个空项目。修改项目属性为Release或者Debug,本小节以Release配置为例,然后右击选择项目属性,在属性页中选择VC++目录,修改包含目录并填入VTK库的头文件路径,具体如下:

图1.填写VTK头文件路径
填写VTK头文件路径以后,我们需要在属性页中点击链接器,然后修改附加库目录为VTK的静态链接库路径,具体如下:

图2.填写VTK静态链接库路径
填写完静态链接库路径以后,我们还需要点击链接器下的输入项,修改附加依赖项的内容,把运行VTK中所需的静态链接库填写到附加依赖项中,具体如下:

图3.填写VTK的静态链接库文件
为了方便读者快捷配置,可以参考博主所配置的内容,如编译的VTK库版本不同则需要对应修改静态库的名称,具体如下:
vtkChartsCore-9.5.libvtkCommonColor-9.5.libvtkCommonComputationalGeometry-9.5.libvtkCommonCore-9.5.libvtkCommonDataModel-9.5.libvtkCommonExecutionModel-9.5.libvtkCommonMath-9.5.libvtkCommonMisc-9.5.libvtkCommonSystem-9.5.libvtkCommonTransforms-9.5.libvtkDICOMParser-9.5.libvtkDomainsChemistry-9.5.libvtkDomainsChemistryOpenGL2-9.5.libvtkFiltersAMR-9.5.libvtkFiltersCellGrid-9.5.libvtkFiltersCore-9.5.libvtkFiltersExtraction-9.5.libvtkFiltersFlowPaths-9.5.libvtkFiltersGeneral-9.5.libvtkFiltersGeneric-9.5.libvtkFiltersGeometry-9.5.libvtkFiltersGeometryPreview-9.5.libvtkFiltersHybrid-9.5.libvtkFiltersHyperTree-9.5.libvtkFiltersImaging-9.5.libvtkFiltersModeling-9.5.libvtkFiltersParallel-9.5.libvtkFiltersParallelImaging-9.5.libvtkFiltersPoints-9.5.libvtkFiltersProgrammable-9.5.libvtkFiltersReduction-9.5.libvtkFiltersSMP-9.5.libvtkFiltersSelection-9.5.libvtkFiltersSources-9.5.libvtkFiltersStatistics-9.5.libvtkFiltersTemporal-9.5.libvtkFiltersTensor-9.5.libvtkFiltersTexture-9.5.libvtkFiltersTopology-9.5.libvtkFiltersVerdict-9.5.libvtkGUISupportQt-9.5.libvtkGUISupportQtQuick-9.5.libvtkGUISupportQtSQL-9.5.libvtkGeovisCore-9.5.libvtkIOAMR-9.5.libvtkIOAsynchronous-9.5.libvtkIOCGNSReader-9.5.libvtkIOCONVERGECFD-9.5.libvtkIOCellGrid-9.5.libvtkIOCesium3DTiles-9.5.libvtkIOChemistry-9.5.libvtkIOCityGML-9.5.libvtkIOCore-9.5.libvtkIOERF-9.5.libvtkIOEnSight-9.5.libvtkIOEngys-9.5.libvtkIOExodus-9.5.libvtkIOExport-9.5.libvtkIOExportGL2PS-9.5.libvtkIOExportPDF-9.5.libvtkIOFDS-9.5.libvtkIOFLUENTCFF-9.5.libvtkIOGeometry-9.5.libvtkIOHDF-9.5.libvtkIOIOSS-9.5.libvtkIOImage-9.5.libvtkIOImport-9.5.libvtkIOInfovis-9.5.libvtkIOLANLX3D-9.5.libvtkIOLSDyna-9.5.libvtkIOLegacy-9.5.libvtkIOMINC-9.5.libvtkIOMotionFX-9.5.libvtkIOMovie-9.5.libvtkIONetCDF-9.5.libvtkIOOggTheora-9.5.libvtkIOPLY-9.5.libvtkIOParallel-9.5.libvtkIOParallelXML-9.5.libvtkIOSQL-9.5.libvtkIOSegY-9.5.libvtkIOTecplotTable-9.5.libvtkIOVeraOut-9.5.libvtkIOVideo-9.5.libvtkIOXML-9.5.libvtkIOXMLParser-9.5.libvtkImagingColor-9.5.libvtkImagingCore-9.5.libvtkImagingFourier-9.5.libvtkImagingGeneral-9.5.libvtkImagingHybrid-9.5.libvtkImagingMath-9.5.libvtkImagingMorphological-9.5.libvtkImagingSources-9.5.libvtkImagingStatistics-9.5.libvtkImagingStencil-9.5.libvtkInfovisCore-9.5.libvtkInfovisLayout-9.5.libvtkInteractionImage-9.5.libvtkInteractionStyle-9.5.libvtkInteractionWidgets-9.5.libvtkParallelCore-9.5.libvtkParallelDIY-9.5.libvtkRenderingAnnotation-9.5.libvtkRenderingCellGrid-9.5.libvtkRenderingContext2D-9.5.libvtkRenderingContextOpenGL2-9.5.libvtkRenderingCore-9.5.libvtkRenderingFreeType-9.5.libvtkRenderingGL2PSOpenGL2-9.5.libvtkRenderingGridAxes-9.5.libvtkRenderingHyperTreeGrid-9.5.libvtkRenderingImage-9.5.libvtkRenderingLICOpenGL2-9.5.libvtkRenderingLOD-9.5.libvtkRenderingLabel-9.5.libvtkRenderingOpenGL2-9.5.libvtkRenderingQt-9.5.libvtkRenderingSceneGraph-9.5.libvtkRenderingUI-9.5.libvtkRenderingVolume-9.5.libvtkRenderingVolumeOpenGL2-9.5.libvtkRenderingVtkJS-9.5.libvtkTestingCore-9.5.libvtkTestingRendering-9.5.libvtkViewsContext2D-9.5.libvtkViewsCore-9.5.libvtkViewsInfovis-9.5.libvtkViewsQt-9.5.libvtkWrappingTools-9.5.libvtkcgns-9.5.libvtkdoubleconversion-9.5.libvtkexodusII-9.5.libvtkexpat-9.5.libvtkfmt-9.5.libvtkfreetype-9.5.libvtkgl2ps-9.5.libvtkglad-9.5.libvtkhdf5-9.5.libvtkhdf5_hl-9.5.libvtkioss-9.5.libvtkjpeg-9.5.libvtkjsoncpp-9.5.libvtkkissfft-9.5.libvtklibharu-9.5.libvtklibproj-9.5.libvtklibxml2-9.5.libvtkloguru-9.5.libvtklz4-9.5.libvtklzma-9.5.libvtkmetaio-9.5.libvtknetcdf-9.5.libvtkogg-9.5.libvtkpng-9.5.libvtkpugixml-9.5.libvtksqlite-9.5.libvtksys-9.5.libvtktheora-9.5.libvtktiff-9.5.libvtktoken-9.5.libvtkverdict-9.5.libvtkzlib-9.5.libopengl32.lib在配置完这些内容以后,我们还需要在运行结束以后把生成的可执行文件所需的VTK动态链接库复制到可执行文件路径下,这时候需要我们修生成事件中的生成后事件里的命令行,具体的修改可以参考图4,具体的命令可参考以下代码:
xcopy /Y /D /R "VTK9.5.2_MSVC_Win\release\bin\*.dll" "$(OutDir)"
图4.修改命令行
做完这些我们就可以在Visual Studio中使用VTK来实现具体的功能了
Visual Studio中导出项目模板
为了让这些配置能减少我们后续的开发,帮助我们快速的搭建VTK环境并且编写代码,我们需要使用Visual Studio中提供的项目模板功能把上一小节中配置的环境打包成模板,在后续创建新的VTK项目时不再手动配置环境。具体操作如下图:

图5.在Visual Studio中导出模板
点击Visual Studio中的导出模板以后,我们在弹窗的界面里点击下一步即可,如下:

图6.导出模板
然后我们修改模板名称并且给模板加上说明,再点击下一步即可。

图7.选择模板选项
然后我们就可以在弹出的文件管理器中看到我们创建的模板文件了,如图:

图8.模板文件
在创建好模板文件以后,我们使用Visual Studio创建新项目的时候就可以选择这个模板创建项目,后续就不需要再配置VTK的环境了。

图9.Visual Studio中使用模板创建新项目
编写VTK入门示例
在配置好环境以后,我们可以着手编写一个简单的代码验证环境是否配置完毕,代码如下:
#include <vtkAutoInit.h>#include <vtkRenderWindow.h>#include <vtkSmartPointer.h>VTK_MODULE_INIT(vtkRenderingOpenGL2); // 始化OpenGL2渲染后端VTK_MODULE_INIT(vtkInteractionStyle); // 初始化交互风格模块int main(){ vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New(); renWin->Render(); std::cin.get(); return 0;}由于使用的是Visual Studio来管理项目而不是CMake,所以我们需要导入vtkAutoInit头文件,对VTK中的模块进行初始化,否则会导致渲染异常。本篇博客不会讲解具体的类,代码中所出现的类型和头文件将在后续的博客中进行讲解。