我的第一个 VTK 程序
- 我的第一个 VTK 程序
- VTK 可视化流程
- 源程序
- 运行结果
我的第一个 VTK 程序
环境:
- Visual Studio 2022 Commumity
- Qt 6.2.3 MSVC2019 64位
- VTK 9.3.0
不会Cmake编译VTK库?看这个:使用 Cmake 对 VTK-9.3.0 进行编译
不会在 VS2022里配置 VTK?看这个:VS2022+QT使用VTK教程
不会 VS2022 里配置 Qt?看这个:Visual Studio 2022 中 Qt 开发环境的搭建
VTK 可视化流程
源程序
中间遇到程序闪退,解决方法:VTK程序运行闪退解决方案
#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 <vtkProperty.h>
#include "vtkAutoInit.h"VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);int main()
{// 新建一个 Source 数据源对象vtkSmartPointer<vtkCylinderSource> cylinder = nullptr;cylinder = vtkSmartPointer<vtkCylinderSource>::New();// 设置属性cylinder->SetHeight(3.0); // 柱体高度cylinder->SetRadius(1.0); // 柱体半径cylinder->SetResolution(200); // 柱体横截面的边数// 新建一个 Mapper 映射器对象vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = nullptr;cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();// 接受 cylinder 的输出,将数据映射为几何元素cylinderMapper->SetInputConnection(cylinder->GetOutputPort());// 新建一个 Actor 演示对象vtkSmartPointer<vtkActor> cylinderActor = nullptr;cylinderActor = vtkSmartPointer<vtkActor>::New();// vtkActor 派生自 vtkProp 类,渲染场景中数据的可视化表达是通过 vtkProp 的子类负责的// vtkProp 子类负责确定渲染场景中对象的位置、大小和方向信息cylinderActor->SetMapper(cylinderMapper);cylinderActor->GetProperty()->SetColor(0.0, 0.0, 1.0);// 创建一个 Renderer 渲染器对象,负责管理场景的渲染过程vtkSmartPointer<vtkRenderer> renderer = nullptr;renderer = vtkSmartPointer<vtkRenderer>::New();// 添加 vtkProp 类型的对象到渲染场景中renderer->AddActor(cylinderActor);// 设置渲染场景的背景颜色renderer->SetBackground(1.0, 1.0, 1.0);// 创建一个 Window 窗口对象,负责本地计算机系统中窗口创建和渲染过程管理vtkSmartPointer<vtkRenderWindow> window = nullptr;window = vtkSmartPointer<vtkRenderWindow>::New();window->AddRenderer(renderer);window->SetSize(600, 480); // 设置窗口大小window->Render();window->SetWindowName("Cylinder"); // 设置窗口标题// 新建一个 Interactor 交互器对象,提供平台独立的响应鼠标、键盘和时钟事件的交互机制vtkSmartPointer<vtkRenderWindowInteractor> interactor = nullptr;interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();// 设置渲染窗口,消息是通过渲染窗口捕获到的,所以必须要给交互器对象设置渲染窗口interactor->SetRenderWindow(window);// 新建一个交互器样式对象,该样式下,用户通过控制相机对物体作旋转、放大、缩小等操作vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = nullptr;style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();// 定义交互器样式,默认的交互样式为 vtkInteractorStyleSwitchinteractor->SetInteractorStyle(style);interactor->Initialize();interactor->Start();// 使用了智能指针,不需要手动释放内存return EXIT_SUCCESS;
}
运行结果
其显示的一个多边形棱柱,其中可以通过cylinder->SetResolution(200)设置该柱体的边数,将这个值设置较大时,图中的轮廓已经看不清了。
在得到这个图像后,将鼠标左键放置在窗口内,长按并移动鼠标时能够旋转该柱体;滚动鼠标滚轮,可以缩放柱体;长按并按住shift时,可以通过鼠标拖动图像;另外,可以按P键观察到图中的红框。