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

news2024/10/6 2:31:10
代码效果

在这里插入图片描述

本代码编译运行均在如下链接文章生成的库执行成功,若无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);
} // namespace

int 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 VTK890
	idFilter->SetCellIdsArrayName("OriginalIds");
	idFilter->SetPointIdsArrayName("OriginalIds");
#else
	idFilter->SetIdsArrayName("OriginalIds");						// 如果已生成,则设置Ids数组的名称
#endif
	idFilter->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.coloradmin.cn/o/1646450.html

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

相关文章

数组练习题

1.打印X图案 if ((i j) ||( i j n - 1)) 循环打印了一个行和列相同的数组 当ij的时候 打印正斜线 ijn-1的时候打印反斜线 int main() {int n 0;while (scanf("%d", &n) ! EOF){for (int i 0; i < n; i) //外循环为行{for (int j 0; j < n; j) …

ROS机器人入门:机器人系统仿真【学习记录】——2

承接上一篇博客&#xff1a; ROS机器人入门&#xff1a;机器人系统仿真【学习记录】——1-CSDN博客 我们先前结束了&#xff08;上一篇博客中&#xff09;&#xff1a; 1. 概述 2. URDF集成Rviz基本流程 3. URDF语法详解 4. URDF优化_xacro 下面让我们继续学习ROS机器人…

Sentinel流量防卫兵

1、分布式服务遇到的问题 服务可用性问题 服务可用性场景 服务雪崩效应 因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程&#xff0c;就叫服务雪崩效应导致服务不可用的原因&#xff1a; 在服务提供者不可用的时候&#xff0c;会出现大量重试的情况&…

LeetCode 226.翻转二叉树(全网最多的解法)

LeetCode 226.翻转二叉树 1、题目 题目链接&#xff1a;226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#…

有什么好用的思维导图软件?6个软件教你快速进行思维导图的制作

有什么好用的思维导图软件&#xff1f;6个软件教你快速进行思维导图的制作 以下是六款常用且功能强大的思维导图软件&#xff0c;它们可以帮助您快速制作思维导图&#xff1a; 迅捷画图: 迅捷画图是一款在线思维导图工具&#xff0c;具有直观易用的界面和丰富的功能。用户可…

无人机反制:雷达探测+信号干扰器技术详解

固定翼无人机、旋翼无人机等&#xff0c;可折叠式无机、DIY无人机等。黑飞&#xff0c;监管困难给航空业带来了诸多隐患&#xff1b;给恐怖袭击及间谍侦察带来新的方式、引发了各国地区政府的忧虑&#xff0c;在中国存在的问题更加严峻。 反无人飞行器防御系统(AUDS)&#xff0…

ElasticSearch 与 OpenSearch:拉开性能差距

Elasticsearch 与 OpenSearch&#xff1a;扩大性能差距 对于任何依赖快速、准确搜索数据的组织来说&#xff0c;强大、快速且高效的搜索引擎是至关重要的元素。对于开发人员和架构师来说&#xff0c;选择正确的搜索平台可以极大地影响您的组织提供快速且相关结果的能力。在我们…

小红书图片文案编辑生成图文工具

在小红书上&#xff0c;种草图文的变现通常涉及以下几个步骤&#xff1a; 1. **建立影响力**&#xff1a;首先&#xff0c;你需要通过持续发布高质量的内容&#xff0c;积累粉丝和影响力。你的内容应该围绕特定的领域或主题&#xff0c;比如时尚、美妆、美食或旅行&#xff0c…

JavaScript中的事件模型

JavaScript中的事件模型分为&#xff1a;事件和事件流、原始事件、标准事件和IE事件。 事件与事件流 JavaScript中的事件&#xff0c;可以理解为HTML文档或者浏览器中发生的一种交互操作&#xff0c;让网页有互动的功能。常见的事件就是加载事件、鼠标事件和自定义事件。 因…

一键安装Halo DB

说明 这里说的一键其实分了好几步&#xff0c;是我将安装步骤分解。你可以把它们放在一个shell中或者串起来就是一键了。 易景科技的数据库 羲和 &#xff08;Halo DB&#xff09; 我之前的一位朋友&#xff08;章晨曦&#xff09;创立的数据库公司。以前看他朋友圈说他做数…

【C语言刷题系列】移除元素

目录 一、问题描述 二、解题思路 三、源代码 个人主页&#xff1a; 倔强的石头的博客 系列专栏 &#xff1a;C语言指南 C语言刷题系列 一、问题描述 二、解题思路 在C语言中&#xff0c;原地移除数组中所有等于特定值的元素并返回新长度的问题可以通过双指针法…

pytest教程-36-钩子函数-pytest_collection_start

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_unconfigure钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_collection_start钩子函数的使用方法。 pytest_collection_start(session) 是一个 pytest 钩子函数&#xff0c;…

25 JavaScript学习:var let const

JavaScript全局变量 JavaScript中全局变量存在多种情况和定义方式&#xff0c;下面详细解释并提供相应的举例&#xff1a; 使用var关键字声明的全局变量&#xff1a; var globalVar "我是全局变量";未使用var关键字声明的变量会成为全局变量&#xff08;不推荐使用&…

Celery(分布式任务队列)入门学习笔记

Celery 的简单介绍 用 Celery 官方的介绍&#xff1a;它是一个分布式任务队列; 简单&#xff0c;灵活&#xff0c;可靠的处理大量消息的分布式系统; 它专注于实时处理&#xff0c;并支持任务调度。 Celery 如果使用 RabbitMQ 作为消息系统的话&#xff0c;整个应用体系就是下…

状压dp 理论例题 详解

状压dp 四川2005年省选题&#xff1a;互不侵犯 首先我们可以分析一下&#xff0c;按照我们普通的思路&#xff0c;就是用搜索&#xff0c;枚举每一行的每一列&#xff0c;尝试放下一个国王&#xff0c;然后标记&#xff0c;继续枚举下一行 那么&#xff0c;我们的时间复杂度…

什么是X电容和Y电容?

先补充个知识&#xff1a; 一、什么是差模信号和共模信号 差模信号&#xff1a;大小相等&#xff0c;方向相反的交流信号&#xff1b;双端输入时&#xff0c;两个信号的相位相差180度 共模信号&#xff1a;大小相等。方向相同。双端输入时&#xff0c;两个信号相同。 二、安规…

嵌入式5-6QT

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

5月6号作业

申请该结构体数组&#xff0c;容量为5&#xff0c;初始化5个学生的信息 使用fprintf将数组中的5个学生信息&#xff0c;保存到文件中去 下一次程序运行的时候&#xff0c;使用fscanf&#xff0c;将文件中的5个学生信息&#xff0c;写入(加载)到数组中去&#xff0c;并直接输出学…

PyTorch机器学习实现液态神经网络

大家好&#xff0c;人工智能的发展催生了神经网络这一强大的预测工具&#xff0c;这些网络通过数据和参数优化生成预测&#xff0c;每个神经元像逻辑回归门一样工作。结合反向传播技术&#xff0c;模型能够根据损失函数来调整参数权重&#xff0c;实现自我优化。 然而&#xf…

题目:排序疑惑

问题描述&#xff1a; 解题思路&#xff1a; 做的时候没想到&#xff0c;其实这是以贪心题。我们可以每次排最大的区间&#xff08;小于n&#xff0c;即n-1大的区间&#xff09;&#xff0c;再判断是否有序 。因此只需要分别判断排&#xff08;1~n-1&#xff09;和&#xff08;…