3D包容盒子
原理简述
包围体(包容盒)是一个简单的几何空间,里面包含着复杂形状的物体。为物体添加包围体的目的是快速的进行碰撞检测或者进行精确的碰撞检测之前进行过滤(即当包围体碰撞,才进行精确碰撞检测和处理)。包围体类型包括球体、轴对齐包围盒(AABB)、有向包围盒(OBB)、8-DOP以及凸壳(CONVEX HULL)。
常见包容盒( Bounding Volumes)分类:
- 包容球:SPHERE 用球体包围整个几何体,用于相交测试很方便,但是其紧密型差,周围空隙较大,当物体变形后,包围球需要重新计算。当对象进行旋转运动时,包围球不需要做任何更新,这是包围球的优势,即当几何对象频繁进行旋转运动时,使用包围球效率较高。
- AABB包容盒:Axially Aligned Bounding Box,3D环境下的AABB盒即一个六面体,每个边都平行于一个坐标平面,较简单,但紧密性较差,当物体旋转、形变之后需要对AABB进行更新。本身的长宽高根据物体大小而定。
- OBB包容盒:Oriented Bounding Box,此方法紧密型较好,可以降低参与相交测试的包容盒数目,因此性能要优于AABB和包容球。当物体发生旋转,仅需对OBB进行相同的旋转即可,但是当物体形变后,更新OBB的代价较大,故不适用那些软体的对象。
- 8-DOP:8-DOP是由八个平面构成的。每个平面都与其他七个平面相交,形成一个闭合的多边形。这些平面可以通过基于物体的最小和最大坐标值来计算。也就是说,对于给定的物体,可以找到其最小和最大的X、Y和Z坐标值,并使用这些值来计算八个平面。8-DOP可以用于快速估计物体的包围盒,以便进行碰撞检测等操作。由于它是使用八个面来近似包围物体的,因此可能不够精确,但通常能提供一个较好的近似结果。它在某些情况下比其他简单的包围体(如轴对齐AABB包围盒)更有效,因为它可以更好地适应物体的形状。
- 凸壳(CONVEX HULL):凸壳(Convex Hull)是指包含一组点集的最小凸多边形或凸体。在三维空间中,凸壳是一个封闭的、由凸面构成的立体结构。给定一组三维点,凸壳可以用来估计点云的整体形状,并提供一种紧凑的表示形式。计算凸壳的算法有很多种,其中著名的算法包括:Graham扫描算法:基于极角排序的凸壳计算算法。Jarvis march算法(也称为Gift Wrapping算法):通过不断选择点集中的最外层点来计算凸壳。QuickHull算法:利用分治法的思想,递归地划分空间以计算凸壳。3D Incremental算法:从一个简单的初始凸壳开始,逐步添加点以构建凸壳。

如上图所示,越靠右,包容效果好、越紧密。但是检测速度更慢,也更消耗内存资源。
代码实现
#include <vector>
#include <thread>
#include <pcl/features/moment_of_inertia_estimation.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>using namespace std::chrono_literals;int main(int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);// 从文件读取点云图pcl::PCDReader reader;reader.read("G:/vsdata/PCLlearn/PCDdata/bun0.pcd", *cloud);// 创建惯性矩估算对象,设置输入点云,并进行计算pcl::MomentOfInertiaEstimation <pcl::PointXYZ> feature_extractor;feature_extractor.setInputCloud(cloud);feature_extractor.compute();std::vector <float> moment_of_inertia;std::vector <float> eccentricity;pcl::PointXYZ min_point_AABB;pcl::PointXYZ max_point_AABB;pcl::PointXYZ min_point_OBB;pcl::PointXYZ max_point_OBB;pcl::PointXYZ position_OBB;Eigen::Matrix3f rotational_matrix_OBB;float major_value, middle_value, minor_value;Eigen::Vector3f major_vector, middle_vector, minor_vector;Eigen::Vector3f mass_center;// 获取惯性矩feature_extractor.getMomentOfInertia(moment_of_inertia);// 获取离心率feature_extractor.getEccentricity(eccentricity);// 获取AABB盒子feature_extractor.getAABB(min_point_AABB, max_point_AABB);// 获取OBB盒子feature_extractor.getOBB(min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);feature_extractor.getEigenValues(major_value, middle_value, minor_value);// 获取主轴major_vector,中轴middle_vector,辅助轴minor_vectorfeature_extractor.getEigenVectors(major_vector, middle_vector, minor_vector);// 获取质心feature_extractor.getMassCenter(mass_center);pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud");// 添加AABB包容盒viewer->addCube(min_point_AABB.x, max_point_AABB.x, min_point_AABB.y, max_point_AABB.y, min_point_AABB.z, max_point_AABB.z, 1.0, 1.0, 0.0, "AABB");viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, "AABB");// 添加OBB包容盒Eigen::Vector3f position(position_OBB.x, position_OBB.y, position_OBB.z);Eigen::Quaternionf quat(rotational_matrix_OBB);// position:中心位置// quat:旋转矩阵// max_point_OBB.x - min_point_OBB.x 宽度// max_point_OBB.y - min_point_OBB.y 高度// max_point_OBB.z - min_point_OBB.z 深度viewer->addCube(position, quat, max_point_OBB.x - min_point_OBB.x, max_point_OBB.y - min_point_OBB.y, max_point_OBB.z - min_point_OBB.z, "OBB");viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, "OBB");pcl::PointXYZ center(mass_center(0), mass_center(1), mass_center(2));pcl::PointXYZ x_axis(major_vector(0) + mass_center(0), major_vector(1) + mass_center(1), major_vector(2) + mass_center(2));pcl::PointXYZ y_axis(middle_vector(0) + mass_center(0), middle_vector(1) + mass_center(1), middle_vector(2) + mass_center(2));pcl::PointXYZ z_axis(minor_vector(0) + mass_center(0), minor_vector(1) + mass_center(1), minor_vector(2) + mass_center(2));viewer->addLine(center, x_axis, 1.0f, 0.0f, 0.0f, "major eigen vector");viewer->addLine(center, y_axis, 0.0f, 1.0f, 0.0f, "middle eigen vector");viewer->addLine(center, z_axis, 0.0f, 0.0f, 1.0f, "minor eigen vector");while (!viewer->wasStopped()){viewer->spinOnce(10);std::this_thread::sleep_for(10ms);}return (0);
}
实现效果
黄色立方体为AABB包容盒,白色立方体为OBB包容盒。 
相关文章:
3D包容盒子
原理简述 包围体(包容盒)是一个简单的几何空间,里面包含着复杂形状的物体。为物体添加包围体的目的是快速的进行碰撞检测或者进行精确的碰撞检测之前进行过滤(即当包围体碰撞,才进行精确碰撞检测和处理)。包…...
用 Three.js 创建一个酷炫且真实的地球
接下来我会分步骤讲解,在线示例在数字孪生平台。 先添加一个球体 我们用threejs中的SphereGeometry来创建球体,给他贴一张地球纹理。 let earthGeo new THREE.SphereGeometry(10, 64, 64) let earthMat new THREE.MeshStandardMaterial({map: albed…...
【数据结构】线性表与顺序表
⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈Java 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 线性表与顺序表 1. 线性表2. 顺序表2.1 …...
ChatGPT
chatgpt使用地址 https://mycaht.top/#/chat 申请内测免费key https://github.com/chatanywhere/GPT_API_free 设置 接口地址设置改成 https://api.chatanywhere.com.cnAPI Key设置成申请出来的免费key 开始聊天...
矿区井下智慧用电安全监测解决方案
一、背景 矿区井下作业具有复杂的环境和较高的危险性,对于用电安全的要求尤为严格。传统的管理模式和监测方法往往无法实时、准确地掌握井下用电情况,对安全隐患的排查与预防存在一定局限性。因此,引入智慧用电安全监测解决方案ÿ…...
网站列表页加密:三次请求后返回内容多\r
一、抓包第一次请求 url aHR0cDovL2N5eHcuY24vQ29sdW1uLmFzcHg/Y29saWQ9MTA抓包,需要清理浏览器cookie,或者无痕模式打开网址,否则返回的包不全,依照下图中的第一个包进行requests请求 第一次请求后返回 <!DOCTYPE html>…...
12.JVM
一.JVM类加载机制:把类从硬盘文件加载到内存中 1.java文件,编写时是一个.java文件,编译后现成一个.class的字节码文件,运行的时候,JVM就会读取.class文件,放到内存中,并且构造类对象. 2.类加载流程: a.加载:找到.class文件,打开文件,读取内容,尝试解析文件内容. b.验证:检查…...
关于网络协议的若干问题(四)
1、QUIC 是一个精巧的协议,它有哪些特性? 答:QUIC 还有其他特性,一个是快速建立连接。另一个是拥塞控制,QUIC 协议当前默认使用了 TCP 协议的 CUBIC(拥塞控制算法)。 CUBIC 进行了不同的设计&…...
opencv图像卷积操作和常用的图像滤波函数
文章目录 opencv图像卷积操作原理,opencv中常用的图像滤波函数一、图像卷积操作原理:1、卷积操作原理图: 二、opencv常用的图像滤波函数:这些函数的主要作用是对图像进行平滑处理或去除噪声(核心目的是减少图像中的噪声࿰…...
习题1. 31
话不多说 先上代码 (defn product [ term a nxt b](defn iter [a result](if (> a b)1 (* (term a) (iter (nxt a) result))))(iter a 1)) 跟习题1.30比较起来,就是两个地方不同 乘法不能乘0 必须是1。难度来讲,跟1.30难度是一样的。增加了迭代过…...
见微知著:从企业售后技术支持看云计算发展
作者:余凯 售后业务中的细微变化 作为阿里云企业容器技术支持的一员,每天会面对全球各地企业级客户提出的关于容器的各种问题,通过这几年的技术支持的经历,逐步发现容器问题客户的一些惯性,哪些是重度用户࿰…...
C++笔记之如何给 `const char*` 类型变量赋值
C笔记之如何给 const char* 类型变量赋值 code review! 文章目录 C笔记之如何给 const char* 类型变量赋值1.在C中,如果你要给一个 const char* 变量赋值,你通常有几种方法来做这件事,具体取决于你的需求。下面是一些常见的方法:…...
9.Linear Maps
线性映射 线性映射是将向量作为输入并产生一些新向量作为输出的转换。 从坐标定义开始(数组),再到2,3,并展示它们是如何关联的 线性映射的坐标表示最终是矩阵, 1.坐标定义(数组) 列向量是向量的坐标表示…...
大数据Doris(十):添加BE步骤
文章目录 添加BE步骤 一、使用mysql连接 二、添加be...
Vue2 +Element UI 表格行合并
如果相邻数据是一致的,则单元格的行合并,指定需要合并的列,下面我是指定合并了分类和类型这两列。 先看效果 Element UI为我们的<el-table>提供了一个属性span-method:合并行或列的计算方法 下面是一个示例: html部分 - 主要是在表上指…...
SuperEdge易学易用系列-一键搭建SuperEdge集群
条件说明: 系统 公网IP 内网IP 服务器所在地 K8S版本 Centos7.9 114.116.101.254 192.168.0.245 北京 v1.22.6 Centos7.9 119.8.1.96 192.168.0.83 香港 v1.22.6 Ubuntu22 94.74.108.152 192.168.0.154 纽约 v1.22.6 1. 开始部署 1.1 两条指令从零搭建一个边缘集…...
农场养殖农产品商城小程序搭建
鸡鸭羊牛鱼养殖用户不少,其规模也有大有小,尤其对一些生态养殖企业,其产品需求度更高,同时他们也有实际的销售需求。 由于具备较为稳定的货源,因此大规模多规格销售属性很足。 通过【雨科】平台搭建农场养殖商城&…...
大语言模型之十七-QA-LoRA
由于基座模型通常需要海量的数据和算力内存,这一巨大的成本往往只有巨头公司会投入,所以一些优秀的大语言模型要么是大公司开源的,要么是背后有大公司身影公司开源的,如何从优秀的开源基座模型针对特定场景fine-tune模型具有广大的…...
UML组件图综合指南:设计清晰、可维护的软件系统
介绍: UML(Unified Modeling Language)组件图是软件系统设计中的重要工具,用于描绘系统的物理结构和组件之间的关系。在软件工程中,通过创建清晰的组件图,团队能够更好地理解系统的模块化结构和组织关系&a…...
深入浅出ThreadPoolExecutor(一)
文章目录 线程池简诉ThreadPoolExecutor详解ThreadPoolExecutor参数详解创建线程池的工具类Executors 线程池简诉 针对各种池子,比如 连接池:用于管理和重复使用数据库连接,避免频繁创建和销毁数据库连接带来的性能开销。对象池:用于管理和重复使用对象…...
4个维度解析YetAnotherKeyDisplayer:开源实时按键可视化工具全指南
4个维度解析YetAnotherKeyDisplayer:开源实时按键可视化工具全指南 【免费下载链接】YetAnotherKeyDisplayer The application for displaying pressed keys of the keyboard 项目地址: https://gitcode.com/gh_mirrors/ye/YetAnotherKeyDisplayer YetAnothe…...
2026软考高项论文题目预测!十大管理+绩效域双押题(附答题思路)
备考软考高项的同学都知道,论文是决定成败的关键一科。随着2025年绩效域全面上位,论文考核方式已从“单一知识点”升级为“绩效域协同五大过程组联动可量化测量指标”的实战型命题。2026年考什么?如何准备?本文基于近3年命题规律&…...
计算机毕业设计springboot职业中介信息管理系统 基于SpringBoot的人力资源招聘与求职匹配平台 SpringBoot驱动的在线人才招聘与就业服务系统
计算机毕业设计springboot职业中介信息管理系统 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着经济的发展和社会的进步,就业市场变得越来越复杂。求职者需要面对…...
告别迷茫!Quartus II 13.1 从新建工程到烧录FPGA的保姆级避坑指南
Quartus II 13.1实战指南:从零开始玩转FPGA开发 第一次打开Quartus II 13.1时,那个灰蒙蒙的界面和密密麻麻的菜单栏确实容易让人望而生畏。作为Altera(现已被Intel收购)旗下经典的FPGA开发工具,它在高校实验室和企业研…...
从MATLAB到C++:手把手教你将鱼眼相机标定结果(Scaramuzza模型)部署到OpenCV项目
从MATLAB到C:手把手教你将鱼眼相机标定结果(Scaramuzza模型)部署到OpenCV项目 鱼眼相机因其超广视角在机器人导航、虚拟现实等领域应用广泛。但MATLAB标定结果如何无缝迁移到C工程环境?本文将彻底解决这个痛点,带您完成…...
支付宝秘钥模式说明
1 python服务器需要使用 PKCS1格式2 秘钥格式是不带头尾的,中间的纯字符串...
DevExpress 2020.1中文汉化保姆级教程:从注册到配置全流程详解
DevExpress 2020.1中文汉化全流程实战指南:从零开始打造本地化开发环境 在软件开发领域,DevExpress作为一套功能强大的.NET控件库,因其丰富的UI组件和高效的数据可视化能力而广受开发者青睐。然而对于非英语母语的开发者而言,面对…...
Youtu-VL-4B-Instruct效果展示:高清OCR+精准Box定位+多轮图文对话作品集
Youtu-VL-4B-Instruct效果展示:高清OCR精准Box定位多轮图文对话作品集 1. 引言:当“看图说话”进化成“看图办事” 你有没有遇到过这种情况?看到一张复杂的图表,想快速提取里面的数据,却要手动一个个去数;…...
像素剧本圣殿惊艳效果:深紫+荧光绿UI中生成的古装剧场景描述高清截图
像素剧本圣殿惊艳效果:深紫荧光绿UI中生成的古装剧场景描述高清截图 1. 视觉震撼:当复古像素美学遇上AI剧本创作 在数字创作工具同质化严重的今天,像素剧本圣殿以其独特的视觉风格脱颖而出。这款基于Qwen2.5-14B-Instruct深度微调的专业剧本…...
磁流变半主动悬架Simulink模型创建与策略设计详解
磁流变半主动悬架simulink模型,包含模型创建,模型策略设计磁流变悬架的Simulink建模就像搭积木——你得先搞清楚每块积木该放哪儿。咱们从最基础的四分之一车模型开始,车身质量、悬架刚度这些参数直接在Simulink里拖几个Mass和Spring模块就能…...
