当前位置: 首页 > news >正文

(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
cmake3.22、3.25
Qt5.14.2
编译器g++11.4、msvc2017
VTK9.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;
}

4. 演示效果

在这里插入图片描述



http://www.xdnf.cn/news/282169.html

相关文章:

  • MFiX(Multiphase Flow with Interphase eXchanges)软件介绍
  • 5块钱的无忧套餐卡可以变成流量卡吗
  • Winform(10.常用控件3)
  • ResNet改进(36):ResNeXt与ResNet的混合模型实现
  • Spring AI 实战:第十一章、Spring AI Agent之知行合一
  • 线程与进程深度解析:从fork行为到生产者-消费者模型
  • Raycaster光线投射
  • OPENGLPG第九版学习 -视口变换、裁减、剪切与反馈
  • dpm_sysfs_add
  • 《算法精解:C语言描述》note-2 链表
  • 文章记单词 | 第64篇(六级)
  • 【Godot】使用 Shader 实现可调节的精确切角效果
  • 超详细讲解C语言转义字符\a \b \r \t \? \n等等
  • 数模13种可视化脚本-Python
  • QT设计权限管理系统
  • BUUCTF Pwn wustctf2020_closed WP
  • 【JAVA】String类深度解析:不可变性与常量池(10)
  • 五年级数学知识边界总结思考-上册
  • 含铜废水的资源化利用
  • vue-chat 开源即时聊天系统web本地运行方法
  • python进阶(3)字符串格式化
  • 普通IT的股票交易成长史--20250504实盘记录
  • 【MyBatis-2】深入浅出MyBatis开发流程:从入门到实战
  • MATLAB基于格拉姆角场与2DCNN-BiGRU的轴承故障诊断模型
  • 10倍速学完斯坦福的大模型课程
  • 数据工程:数据清洗、特征工程与增强技术对模型性能的基础性影响
  • HTTPS协议原理
  • HTTP协议(一)
  • 11. 盛最多水的容器
  • pycharm terminal 窗口打不开了