(39)VTK C++开发示例 ---选择区域
文章目录
- 1. 概述
- 2. CMake链接VTK
- 3. main.cpp文件
- 4. 演示效果
更多精彩内容 |
---|
👉内容导航 👈 |
👉VTK开发 👈 |
1. 概述
这段代码实现了一个基于VTK库的三维点云可视化及交互式拾取功能。以下是核心功能解析:
1. 三维场景构建
- 创建了3个三维点(坐标分别为(1,0,0)、(0,0,0)、(0,1,0))
- 使用
vtkPoints
存储点数据,vtkCellArray
管理顶点拓扑- 通过
vtkPolyData
组织几何数据,vtkPolyDataMapper
进行数据映射- 设置红色点状渲染(点尺寸10)和钢蓝色背景
2. 交互式拾取功能
- 使用
vtkAreaPicker
实现区域拾取器- 采用
vtkInteractorStyleRubberBandPick
交互模式(按R键触发框选)- 注册回调函数
PickCallbackFunction
处理拾取事件:
- 当框选操作结束时,遍历并输出被选中的3D对象指针
- 当前场景中只有单个点云actor会被选中
3.操作
允许用户通过鼠标绘制一个矩形来放大或缩小视图,适用于局部放大或缩小感兴趣的区域。默认情况下,按下键盘的’r’键可以开启框选模式,此时拖动鼠标可以拾取物体。
按下’r’键:开启框选模式,拖动鼠标绘制矩形来拾取物体。
按下’p’键:执行特定的框选操作,如拾取特定大小的窗口。
平移:通过鼠标中键拖动或同时按下 Shift 和鼠标左键拖动。
旋转:通过鼠标左键拖动。
缩放:通过鼠标左键拖动。
环境 | 说明 |
---|---|
系统 | ubuntu22.04、windows11 |
cmake | 3.22、3.25 |
Qt | 5.14.2 |
编译器 | g++11.4、msvc2017 |
VTK | 9.4.1 |
2. CMake链接VTK
cmake_minimum_required(VERSION 3.20 FATAL_ERROR) # 设置CMake最低版本
project(vtk2) # 设置项目名称
# 查找VTK库
find_package(VTK COMPONENTS
CommonColor
CommonCore
CommonDataModel
InteractionStyle
RenderingContextOpenGL2
RenderingCore
RenderingFreeType
RenderingGL2PSOpenGL2
RenderingOpenGL2
)
if(NOT VTK_FOUND)
message("VTK not found")
return()
endif()add_executable(vtk2 main.cpp) # 添加可执行文件target_link_libraries(vtk2 PRIVATE ${VTK_LIBRARIES}) # 链接VTK库
vtk_module_autoinit(TARGETS vtk2 MODULES ${VTK_LIBRARIES}) # 初始化VTK模块
3. main.cpp文件
/********************************************************************************
* 文件名: main.cpp
* 创建时间: 2025-03-23 21:06:59
* 开发者: MHF
* 邮箱: 1603291350@qq.com
* 功能:
*********************************************************************************/
#include<iostream>
#include <vtkActor.h>
#include <vtkAreaPicker.h>
#include <vtkCallbackCommand.h>
#include <vtkCellArray.h>
#include <vtkInteractorStyleRubberBandPick.h>
#include <vtkInteractorStyleTrackball.h>
// #include <vtkInteractorStyleTrackballCamera.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProp3DCollection.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
using namespace std;/**
* @brief 回调函数,用于处理选取事件
*
* 当选取事件发生时,此回调函数将被调用。它接受四个参数,分别代表调用者、事件ID、客户端数据和调用数据。
*
* @param caller 指向触发事件的vtkObject对象的指针
* @param eventId 事件ID,标识触发的事件类型
* @param clientData 客户端数据,可以是任意类型的指针,用于在回调函数中传递额外信息
* @param callData 调用数据,通常包含与事件相关的额外信息
*/
void PickCallbackFunction(vtkObject* caller, long unsigned int eventId, void* clientData, void* callData)
{auto areaPicker = static_cast<vtkAreaPicker*>(caller); // 将vtkObject对象转换为vtkAreaPicker对象vtkProp3DCollection* props = areaPicker->GetProp3Ds(); // 获取选取的对象集合props->InitTraversal(); // 初始化对象集合的遍历for(vtkIdType i = 0; i < props->GetNumberOfItems(); i++){vtkProp3D* prop = props->GetNextProp3D(); // 获取下一个对象cout << "选取了对象:" << prop << endl; // 输出对象的类名}
}int main()
{vtkNew<vtkPoints> points; // 创建点集vtkNew<vtkCellArray> vertices; // 创建顶点集vtkIdType pid; // 创建顶点ID数组pid = points->InsertNextPoint(1, 0, 0); // 添加一个顶点到点集中,并返回其IDvertices->InsertNextCell(1, &pid); // 添加一个顶点到顶点集中pid = points->InsertNextPoint(0, 0, 0); vertices->InsertNextCell(1, &pid);pid = points->InsertNextPoint(0, 1, 0);vertices->InsertNextCell(1, &pid);vtkNew<vtkPolyData> polyData; // 创建多边形数据polyData->SetPoints(points); // 设置点集polyData->SetVerts(vertices); // 设置顶点集vtkNew<vtkPolyDataMapper> mapper; // 创建多边形数据映射器mapper->SetInputData(polyData); // 设置输入数据vtkNew<vtkNamedColors> colors; // 创建颜色对象vtkNew<vtkActor> actor; // 创建演员actor->SetMapper(mapper); // 设置映射器actor->GetProperty()->SetPointSize(10); // 设置点的大小actor->GetProperty()->SetColor(colors->GetColor3d("Tomato").GetData()); // 设置颜色vtkNew<vtkRenderer> renderer; // 创建渲染器renderer->AddActor(actor); // 添加演员renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData()); // 设置背景颜色vtkNew<vtkRenderWindow> renderWindow; // 创建渲染窗口renderWindow->AddRenderer(renderer); // 添加渲染器vtkNew<vtkAreaPicker> areaPicker; // 创建区域选取器vtkNew<vtkRenderWindowInteractor> renderWindowInteractor; // 创建渲染窗口交互器renderWindowInteractor->SetRenderWindow(renderWindow); // 设置渲染窗口renderWindowInteractor->SetPicker(areaPicker); // 设置选取器// 允许用户通过鼠标绘制一个矩形来放大或缩小视图,适用于局部放大或缩小感兴趣的区域。默认情况下,按下键盘的'r'键可以开启框选模式,此时拖动鼠标可以拾取物体。// 按下'r'键:开启框选模式,拖动鼠标绘制矩形来拾取物体。// 按下'p'键:执行特定的框选操作,如拾取特定大小的窗口。 // 平移:通过鼠标中键拖动或同时按下 Shift 和鼠标左键拖动。// 旋转:通过鼠标左键拖动。// 缩放:通过鼠标左键拖动。vtkNew<vtkInteractorStyleRubberBandPick> style; // vtkNew<vtkInteractorStyleTrackballCamera> style; // 没有拾取功能style->SetCurrentRenderer(renderer); // 设置当前渲染器renderWindowInteractor->SetInteractorStyle(style); // 设置交互样式vtkNew<vtkCallbackCommand> pickCallback; // 创建选取回调函数pickCallback->SetCallback(PickCallbackFunction); // 设置回调函数areaPicker->AddObserver(vtkCommand::EndPickEvent, pickCallback); // 添加选取事件观察者,当拾取操作(如点拾取、区域拾取等)结束时触发renderWindow->Render(); // 渲染窗口renderWindowInteractor->Start(); // 启动交互return 0;
}