为VTK修复vtkOBJReader的一个segfault

Background 测试用PyTorch3D生成的Mesh时,打算用VTK对Mesh做离屏渲染生成图片,结果发现VTK的python binding和C++库都会在vtkOBJReader::Update时崩溃。由于是AI模型生成的OBJ文件,OBJ本身是有可能不太标准的,但用Blender、Open3D、trimesh测试,发现都可以加载该文件。看起来似乎VTK的vtkOBJReader实现不够健壮,遂决定调试一番。 Debug 以导致问题的OBJ文件编写复现demo,目录结构: $ tree . . ├── assets │ ├── rand_0_diffuse.png │ ├── rand_0_normal.png │ ├── rand_0_skin.mtl │ ├── rand_0_skin.obj │ └── rand_0_spec.png ├── CMakeLists.txt └── main.cpp main.cpp: #include <vtkOBJReader.h> int main() { vtkNew<vtkOBJReader> reader; reader->SetFileName("rand_0_skin.obj"); reader->Update(); return 0; } 崩溃堆栈: 1 vtkAOSDataArrayTemplate<float>::GetTuple vtkAOSDataArrayTemplate.txx 275 0x7ffff6ee05e5 2 vtkOBJReader::RequestData vtkOBJReader.cxx 978 0x7ffff7b4c793 3 vtkPolyDataAlgorithm::ProcessRequest vtkPolyDataAlgorithm.cxx 87 0x7ffff28aaec6 4 vtkExecutive::CallAlgorithm vtkExecutive.cxx 734 0x7ffff287faf9 5 vtkDemandDrivenPipeline::ExecuteData vtkDemandDrivenPipeline.cxx 461 0x7ffff2876004 6 vtkCompositeDataPipeline::ExecuteData vtkCompositeDataPipeline....

2023-01-18 · Qiao

在Windows上编译VTK-9-0-1及其示例

1 准备工作 在Windows下编译VTK需要以下内容: CMake 3.10及以上 Visual Studio及MSVC编译环境 VTK源码 1.1 下载VTK源码 可以在https://vtk.org/download/ 下载VTK的源码、测试数据、文档等内容 其中,VTKData-9.0.1.tar.gz是VTK用于测试的数据,VTKLargeData-9.0.1.tar.gz是VTK部分示例程序所用的数据,这两个文件都可以不用下载,只下载VTK-9.0.1.tar.gz即可。 2 生成VTK 2.1 创建目录 为VTK创建一个文件夹 在文件夹内,创建src和build目录,分别存放源码和生成的文件 将VTK-9.0.1.tar.gz解压到src内 目录结构类似于: c:\data\cpp\vtk\build <--空 c:\data\cpp\vtk\src c:\data\cpp\vtk\src\Accelerators c:\data\cpp\vtk\src\Charts c:\data\cpp\vtk\src\.... 2.2 运行CMake 打开CMake-GUI 选择VTK的源码路径和生成路径 点击“Configure” 选择需要的“generator”,这里选择Visual Studio 15 2017 Win64作为生成器 根据需要调整CMake选项。以下为部分常见的选项: CMAKE_INSTALL_PRFIX:生成的VTK库的安装路径。根据需要选择即可 VTK_BUILD_EXAMPLES:默认为OFF,勾选后生成测试时将一并生成示例代码。由于源码中的测试工程管理不便,且测试资源需要单独下载和配置,这里选择不生成源码中的示例,后续单独克隆VTK的测试代码仓库并生成。 VTK_USE_CUDA:默认为OFF,勾选后开启对CUDA的支持 VTK_GROUP_QT:勾选后将开启对Qt的支持,编译VTK在Qt中的控件类等 再次点击“Configure”进行配置 点击“Generator”生成VS 2017对应的工程 点击"Open Project",这时会调用VS 2017打开CMake生成的工程 2.3 构建 在VS 2017中将配置切换到"Release",右键ALL_BUILD项目,选择“生成”即可。构建完成后,在build/bin/Release下便能看到编译好的动态库文件。 2.4 安装 右键INSTALL项目,选择“生成”即可将VTK相关的头文件、库文件、动态库文件安装到CMAKE_INSTALL_PREFIX指定的位置。安装完成后,目录结构应类似于: c:\program file\VTK\bin c:\program file\VTK\include c:\program file\VTK\lib c:\program file\VTK\share 其中,\bin目录包含了所有的VTK动态库文件,可以该路径加入环境变量。 如果需要更改安装路径,再次打开CMake-GUI更改CMAKE_INSTALL_PREFIX后,重新加载工程生成INSTALL即可 3 生成示例 3.1 示例的来源 如前所言,VTK源码包内已经附带了一些示例程序,这些示例程序旨在以简单一致的格式来说明VTK的一些概念,然而这些例子只涵盖了VTK功能的一小部分。...

2020-09-17 · Qiao