VTK —— 二、教程七 - 对点云进行操作(按下r键切换选取或观察模式)(附完整源码)

代码效果

在这里插入图片描述

本代码编译运行均在如下链接文章生成的库执行成功,若无VTK库则请先参考如下链接编译vtk源码:

     VTK —— 一、Windows10下编译VTK源码,并用Vs2017代码测试(附编译流程、附编译好的库、vtk测试源码)

教程描述

     本示例演示介绍点云操作。按下"r"键可以来回切换对点云的选取或对点云的视图观察操作;按下"f"键对视图进行放大。

完整源码
#include <vtkActor.h>
#include <vtkAreaPicker.h>
#include <vtkDataSetMapper.h>
#include <vtkDataSetSurfaceFilter.h>
#include <vtkExtractGeometry.h>
#include <vtkIdFilter.h>
#include <vtkIdTypeArray.h>
#include <vtkInteractorStyleRubberBandPick.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkObjectFactory.h>
#include <vtkPlanes.h>
#include <vtkPointData.h>
#include <vtkPointSource.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkRendererCollection.h>
#include <vtkSmartPointer.h>
#include <vtkUnstructuredGrid.h>
#include <vtkVersion.h>
#include <vtkVertexGlyphFilter.h>
#include<vtkPropPicker.h>
#if VTK_VERSION_NUMBER >= 89000000000ULL
#define VTK890 1
#endif#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);namespace {// vtkInteractorStyleRubberBandPick: 与TrackBallCamera类似,但它可以在橡皮筋选择矩形下方拾取道具class InteractorStyle : public vtkInteractorStyleRubberBandPick{public:static InteractorStyle* New();vtkTypeMacro(InteractorStyle, vtkInteractorStyleRubberBandPick);InteractorStyle(){this->SelectedMapper = vtkSmartPointer<vtkDataSetMapper>::New();this->SelectedActor = vtkSmartPointer<vtkActor>::New();this->SelectedActor->SetMapper(SelectedMapper);}// 事件绑定virtual void OnLeftButtonUp() override{// 包含颜色及其名称的类vtkNew<vtkNamedColors> colors;// 转发事件vtkInteractorStyleRubberBandPick::OnLeftButtonUp();//获取鼠标框选矩形 frustum  vtkPlanes* frustum = static_cast<vtkAreaPicker*>(this->GetInteractor()->GetPicker())->GetFrustum();// 提取完全位于指定隐式函数内部或外部的单元格vtkNew<vtkExtractGeometry> extractGeometry;extractGeometry->SetImplicitFunction(frustum);		// 指定内部/外部检查的隐式函数。extractGeometry->SetInputData(this->Points);		// 将数据对象指定为输入extractGeometry->Update();							// 使此算法的输出保持最新状态// 创建一个vtkPolyData,每个点上都有一个顶点vtkNew<vtkVertexGlyphFilter> glyphFilter;glyphFilter->SetInputConnection(extractGeometry->GetOutputPort()); // 设置给定输入端口索引的连接glyphFilter->Update();								// 使此算法的输出保持最新状态// 获取此算法上端口的输出数据对象vtkPolyData* selected = glyphFilter->GetOutput();std::cout << "\nSelected " << selected->GetNumberOfPoints() << " points." << std::endl;std::cout << "Selected " << selected->GetNumberOfCells() << " cells." << std::endl;vtkIdTypeArray* ids = dynamic_cast<vtkIdTypeArray*>(selected->GetPointData()->GetArray("OriginalIds"));for (vtkIdType i = 0; i < ids->GetNumberOfTuples(); i++){std::cout << "Id " << i << " : " << ids->GetValue(i) << std::endl;}this->SelectedMapper->SetInputData(selected);	// 设置此映射器的输入this->SelectedMapper->ScalarVisibilityOff();	// 关闭标志以控制是否使用标量数据为对象着色this->SelectedActor->GetProperty()->SetColor(colors->GetColor3d("Red").GetData());	// 设置颜色this->SelectedActor->GetProperty()->SetPointSize(5);	// 设置点的直径this->CurrentRenderer->AddActor(SelectedActor);		// 在渲染器中添加实体this->GetInteractor()->GetRenderWindow()->Render();	// 要求此RenderWindow拥有的每个渲染器渲染其图像并同步此过程this->HighlightProp(NULL);							// 当挑选成功选择演员时,此方法会适当地突出显示选择的道具}void SetPoints(vtkSmartPointer<vtkPolyData> points){this->Points = points;}private:/*是一个数据对象,表示由顶点、直线、多边形和/或三角形条组成的几何结构。点和像元属性值(例如标量、向量等)也被表示。具体数据集表示顶点、直线、多边形和三角形条带*/vtkSmartPointer<vtkPolyData> Points;vtkSmartPointer<vtkActor> SelectedActor;			// 创建渲染场景中的实体(几何体和属性)vtkSmartPointer<vtkDataSetMapper> SelectedMapper;	// 将vtkDataSet和派生类映射到图形基元};vtkStandardNewMacro(InteractorStyle);
} // namespaceint main(int, char*[])
{// 创建VTK命名颜色vtkNew<vtkNamedColors> colors;// 创建随机点云,用于在指定中心点的指定半径内创建用户指定的点数vtkNew<vtkPointSource> pointSource;pointSource->SetNumberOfPoints(20);		// 设置要生成的点数pointSource->Update();					// 使此算法的输出保持最新状态// 从点和像元ID生成标量或字段数据。是一个过滤器,它使用单元格和点ID生成标量或字段数据vtkNew<vtkIdFilter> idFilter;idFilter->SetInputConnection(pointSource->GetOutputPort());		// 设置给定输入端口索引的连接
#if VTK890idFilter->SetCellIdsArrayName("OriginalIds");idFilter->SetPointIdsArrayName("OriginalIds");
#elseidFilter->SetIdsArrayName("OriginalIds");						// 如果已生成,则设置Ids数组的名称
#endifidFilter->Update();												// 使此算法的输出保持最新状态// 提取任何数据集的外表面。是一个通用过滤器,用于从任何类型的数据集中提取边界几何图形(和关联数据)vtkNew<vtkDataSetSurfaceFilter> surfaceFilter;surfaceFilter->SetInputConnection(idFilter->GetOutputPort());	// 设置给定输入端口索引的连接surfaceFilter->Update();										// 使此算法的输出保持最新状态/* 是一个数据对象,表示由顶点、直线、多边形和/或三角形条组成的几何结构。点和像元属性值(例如标量、向量等)也被表示。具体数据集表示顶点、直线、多边形和三角形条带surfaceFilter->GetOutput(): 获取此算法上端口的输出数据对象*/vtkPolyData* input = surfaceFilter->GetOutput();// 将vtkPolyData映射到图形基元vtkNew<vtkPolyDataMapper> mapper;mapper->SetInputData(input);			// 指定要映射的输入数据mapper->ScalarVisibilityOff();			// 关闭标志以控制是否使用标量数据为对象着色// 创建渲染场景中的实体(几何体和属性)vtkNew<vtkActor> actor;actor->SetMapper(mapper);				// 设置映射器: 将参与者连接到可视化管道末尾actor->GetProperty()->SetPointSize(3);	// 设置点的直径actor->GetProperty()->SetColor(colors->GetColor3d("Gold").GetData());	// 设置模型颜色// 创建渲染vtkNew<vtkRenderer> renderer;			// 创建渲染器vtkNew<vtkRenderWindow> renderWindow;	// 为渲染器创建绘制窗口renderWindow->AddRenderer(renderer);	// 窗口添加渲染器renderWindow->SetWindowName("HighlightSelectedPoints");	// 设置渲染窗口名称// 创建选取视口上选择矩形后面的道具vtkNew<vtkAreaPicker> areaPicker;// 与平台无关的渲染窗互,包括拾取和帧速率控制。vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;renderWindowInteractor->SetPicker(areaPicker);			// 设置用于执行拣选操作的对象renderWindowInteractor->SetRenderWindow(renderWindow);	// 设置由此对象控制的渲染窗口renderer->AddActor(actor);			// 在渲染器中添加实体renderer->SetBackground(colors->GetColor3d("DarkSlateGray").GetData());	// 设置渲染屏幕背景色// 要求此RenderWindow拥有的每个渲染器渲染其图像并同步此过程renderWindow->Render();vtkNew<InteractorStyle> style;style->SetPoints(input);//style->StartSelect();//开始选取renderWindowInteractor->SetInteractorStyle(style);	// 在操纵杆/轨迹球/新设备之间进行外部切换// 启动交互器事件循环renderWindowInteractor->Start();return EXIT_SUCCESS;
}

笔者

笔者 - jxd

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/832364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.5.6

Widget::Widget(QWidget *parent): QWidget(parent) {//窗口相关设置this->setFixedSize(540,720);//背景颜色this->setStyleSheet("background-color:white");//去掉头部this->setWindowFlag(Qt::FramelessWindowHint);//标签相关设置QLabel *lab1 new QL…

嵌入式5-6QT

1> 思维导图 2> 自由发挥应用场景&#xff0c;实现登录界面。 要求&#xff1a;尽量每行代码都有注释。 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置标题this->setWindowTitle("MYQQ");//设置图标this…

底层逻辑(5)世界法则

底层逻辑(5)世界法则 世界三大法则 人是群居动物&#xff0c;所以每个人都避免不了和其他人打交道&#xff0c;特别是在大城市里&#xff0c;我们需要经常和陌生人打交道。 打交道的次数越多&#xff0c;你可能越能遇到一些所谓的巨婴或者杠精。这类人很难打交道&#xff0c…

从ChatGPT革命性的对话系统,看人机交互模式6个阶段的演变

ChatGPT引领革命&#xff0c;看人机交互六步飞跃 ©作者|wy 来源|神州问学 引言 在科技的浪潮中&#xff0c;人机交互模式不断演进&#xff0c;从最初的简单指令输入到如今的智能对话系统&#xff0c;每一次革新都昭示着人类与机器交流方式的深刻变革。ChatGPT&#xff0…

昂科烧录器支持O2Micro凹凸科技的电池组管理IC OZ7708

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中O2Micro凹凸科技的电池组管理IC OZ7708已经被昂科的通用烧录平台AP8000所支持。 OZ7708是一款高度集成、低成本的电池组管理IC&#xff0c;适用于5~8s Li-Ion/Polymer电池组&a…

AVL树浅谈

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;本篇文章给大家介绍AVL树。 基本概念 AVL树&#xff08;Adelson-Velsky和Landis树&#xff09;是一种自平衡的二叉搜索树&#xff0c;得名于其发明者G. M. Adelson-Velsky和E. M. Landis。在AVL树中&#xff0c;任何节点的…

OpenCV 入门(七)—— 身份证识别

OpenCV 入门系列&#xff1a; OpenCV 入门&#xff08;一&#xff09;—— OpenCV 基础 OpenCV 入门&#xff08;二&#xff09;—— 车牌定位 OpenCV 入门&#xff08;三&#xff09;—— 车牌筛选 OpenCV 入门&#xff08;四&#xff09;—— 车牌号识别 OpenCV 入门&#xf…

四川景源畅信:抖音个人开通橱窗操作流程介绍详情

随着短视频平台的快速发展&#xff0c;抖音已经成为越来越多人展示自我、分享生活的舞台。而其中&#xff0c;个人橱窗功能则为内容创作者提供了一个展示和销售商品的窗口。如果你是一位想要在抖音上开通个人橱窗的创作者或商家&#xff0c;了解详细的操作流程是迈向成功的第一…

如何通过前端表格控件在10分钟内完成一张分组报表?

前言&#xff1a; 当今时代&#xff0c;报表作为信息化系统的重要组成部分&#xff0c;在日常的使用中发挥着关键作用。借助报表工具使得数据录入、分析和传递的过程被数字化和智能化&#xff0c;大大提高了数据的准确性及利用的高效性。而在此过程中&#xff0c;信息化系统能…

无经验计科应届生前端面试遇到的问题整理

js数据类型有几种&#xff0c;分别是 原始数据类型&#xff08;Primitive data types&#xff09;: 字符串&#xff08;String&#xff09;: 用于表示文本数据&#xff0c;使用单引号&#xff08;‘’&#xff09;或双引号&#xff08;“”&#xff09;括起来。 数字&#xff…

AArch64 内存管理

本文是对arm developer网站《Learn the architecture - AArch64 memory management Guide》的学习笔记&#xff08;Documentation – Arm Developer&#xff09; 一、背景概述 本文介绍了AArch64中的内存转换&#xff0c;这是内存管理的关键&#xff0c;它解释了虚拟地址如何转…

第3章 WebServer重构

3.1 重构原生Web服务框架 3.1.1 分析原生Web服务框架 在服务端代码的 ClientHandler 中&#xff0c;请求解析、处理请求、返回响应的代码混杂在一起&#xff0c;这样的设计会导致代码难以维护和理解。为了提高代码的可读性、可维护性和可扩展性&#xff0c;我们需要对这些代码…

ComfyUI搭建和注意事项for WIN[笔记]

下载ComfyUI(GitHub - comfyanonymous/ComfyUI: The most powerful and modular stable diffusion GUI, api and backend with a graph/nodes interface.) 从源码上搭建比较麻烦&#xff0c;一般不推荐&#xff0c;所以跑到release里面找一个下载。我的显卡是GeFore GTX 1050 …

飞腾E2000运行Zephyr操作系统

Phytium-Zephyr-SDK 1. 仓库介绍 1.1 本仓库特色 此项目是一个开源软件&#xff0c;专为物联网领域设计&#xff0c;基于Zephyr实时操作系统&#xff0c;针对Phytium系列CPU进行了专门的适配和应用开发。我们的目标是降低开发者的使用门槛&#xff0c;提供了部署文档和使用指…

同向双指针(滑动窗口)算法

209. 长度最小的子数组 这里的更新结果就题来定 class Solution {public int minSubArrayLen(int target, int[] nums) {int sum 0;int len 0;int f 0;for(int left 0, right 0; right < nums.length;){//求和sum nums[right];while(sum > target){//lenint t ri…

MLP实现fashion_mnist数据集分类(1)-模型构建、训练、保存与加载(tensorflow)

1、查看tensorflow版本 import tensorflow as tfprint(Tensorflow Version:{}.format(tf.__version__)) print(tf.config.list_physical_devices())2、fashion_mnist数据集下载与展示 (train_image,train_label),(test_image,test_label) tf.keras.datasets.fashion_mnist.l…

张大哥笔记:卖盗版网课,获利 100 万被抓

这几天刷视频&#xff0c;看到一个新闻&#xff0c;某大学生卖盗版网课&#xff0c;把别人2000多正版网课&#xff0c;以做活动名义售卖20元&#xff0c;获利100多万被抓。 下方图片来自&#xff1a;极目新闻 卖这种盗版网课&#xff0c;门槛低&#xff0c;成本低&#xff0c;…

解决3D模型只显示线框材质的方法---模大狮模型网

在3D建模和渲染过程中&#xff0c;正确的材质和纹理是呈现逼真效果的关键。然而&#xff0c;有时候用户可能会遇到一个常见问题&#xff0c;即3D模型在渲染或查看时只显示线框材质&#xff0c;而没有正确的表面纹理和颜色。本文将介绍解决这一问题的几种方法&#xff0c;帮助用…

7 人赚 960 亿美元,数字天才的首次独舞

巴菲特股东大会 一年一度的巴菲特股东大会如常召开&#xff0c;只不过这次坐在老爷子左手边的不再是老搭档查理芒格&#xff0c;而是钦点的未来继任者&#xff0c;格雷格阿贝尔。 随着芒格&#xff08;99岁&#xff09;的离开&#xff0c;巴菲特&#xff08;93岁&#xff09;也…

【.sh】Shell 脚本文件的基础内容

目录 &#x1f30a;1. 基础知识 &#x1f30a;2. 简单示例 &#x1f30d;2.1 示例一 输出"Hello, World!" &#x1f30d;2.2 示例二 输入输出创建 &#x1f30a;1. 基础知识 .sh文件是什么&#xff1f; .sh文件即 Shell 脚本文件&#xff0c;通常用来执行一系列…