包围盒顾名思义就是类似一个盒子把物体包围起来。

以下内容来自百科:

包围盒是一种求解离散点集最优包围空间的算法,基本思想是用体积稍大且特性简单的几何体(称为包围盒)来近似地代替复杂的几何对象。

常见的包围盒算法有AABB包围盒、包围球、方向包围盒OBB以及固定方向凸包FDH。碰撞检测问题在虚拟现实、计算机辅助设计与制造、游戏及机器人等领域有着广泛的应用,甚至成为关键技术。而包围盒算法是进行碰撞干涉初步检测的重要方法之一。

分类:

最常见的包围盒算法有AABB包围盒(Axis-aligned bounding box轴对齐包围盒),包围球(Sphere), 方向包围盒OBB(Oriented bounding box)以及固定方向凸包FDH(Fixed directions hulls或k-DOP)。

AABB是应用最早的包围盒。它被定义为包含该对象,且边平行于坐标轴的最小六面体(坐标轴平行不仅指盒体与世界坐标轴平行,同时也指盒体的每个面都和一条坐标轴垂直。同一物体的不同方向,AABB也可能不同。如果物体在场景中移动变换,它的AABB也需要随之移动,当物体发生旋转时,有两种选择,用变换后的物体来重新计算AABB,或者对AABB做和物体同样的变换)。故描述一个AABB,仅需六个标量。AABB构造比较简单,存储空间小,但紧密性差,尤其对不规则几何形体,冗余空间很大,当对象旋转时,无法对其进行相应的旋转。处理对象是刚性并且是凸的,不适合包含软体变形的复杂的虚拟环境情况。

AABB内的点需要满足xyz分别满足分别大于最小的小于最大的。因此需要知道两个顶点最小点,最大点;中心点是两个顶点的中点代表了包围盒的质心。

对象的包围球被定义为包含该对象的最小的球体。确定包围球,首先需分别计算组成对象的基本几何元素集合中所有元素的顶点的x,y,z坐标的均值以确定包围球的球心,再由球心与三个最大值坐标所确定的点间的距离确定半径r。包围球的碰撞检测主要是比较两球间半径和与球心距离的大小。(由于球体只有一个自由度,所以检测球对物体方向不敏感。)

OBB是较为常用的包围盒类型。它是包含该对象且相对于坐标轴方向任意的最小的长方体(OBB是根据物体本身的几何形状来决定盒子的大小和方向,盒子不需要和坐标轴垂直)。OBB最大特点是它的方向的任意性,这使得它可以根据被包围对象的形状特点尽可能紧密的包围对象,但同时也使得它的相交测试变得复杂。OBB包围盒比AABB包围盒和包围球更加紧密地逼近物体,能比较显著地减少包围体的个数,从而避免了大量包围体之间的相交检测。但OBB之间的相交检测比AABB或包围球体之间的相交检测更费时。

FDH(k-DOP)是一种特殊的凸包,继承了AABB简单性的特点,但其要具备良好的空间紧密度,必须使用足够多的固定方向。被定义为包含该对象且它的所有面的法向量都取自一个固定的方向(k个向量)集合的凸包。FDH比其他包围体更紧密地包围原物体,创建的层次树也就有更少的节点,求交检测时就会减少更多的冗余计算,但相互间的求交运算较为复杂。

优缺点:

AABB也是比较简单的一类包围盒。但对于沿斜对角方向放置的瘦长形对象,其紧密性较差。由于AABB相交测试的简单性及较好的紧密性,因此得到了广泛的应用,还可以用于软体对象的碰撞检测。

包围球是比较简单的包围盒,而且当对象发生旋转运动时,包围球不需做任何更新,当几何对象进行频繁的旋转运动时,使用包围球可能会得到很好的结果;当对象变形时,需要重新计算其包围球。但它的紧密性是比较差的,因此较少使用。

OBB的简单性要比上面两种包围盒差,但它的紧密性是比较好的,可以大大减少参与相交测试的包围盒的数目,因此总体性能要优于AABB和包围球。当几何对象发生旋转运动后,只要对OBB进行同样的旋转即可。因此,对于刚体间的碰撞检测,OBB不失为一种较好的选择,但迄今为止,还没有一种有效的方法能够较好地解决对象变形后OBB树的更新问题,而重新计算每个结点的OBB的代价又太大,所以OBB不适用于包含软体对象的复杂环境中。

FDH相对于上面三种包围盒其紧密性是最好的,同时其相交测试算法比OBB要简单的多。可以用于软体对象的碰撞检测。

基于PCA的包围盒实现:原理如下:

OBB的生成思路简单来说就是根据物体表面的顶点,通过PCA(主成分分析)获得特征向量,即OBB的主轴。

最小包围盒的计算过程大致如下:
1.利用PCA主元分析法获得点云的三个主方向,获取质心,计算协方差,获得协方差矩阵,求取协方差矩阵的特征值和特长向量,特征向量即为主方向。
2.利用1中获得的主方向和质心,将输入点云转换至原点,且主方向与坐标系方向重回,建立变换到原点的点云的包围盒。
3.给输入点云设置主方向和包围盒,通过输入点云到原点点云变换的逆变换实现。

1.1、计算出来的协方差

主对角线的元素表示变量的方差。主对角线的元素较大则表示强信号。非主对角线的元素表示变量之间的协方差。较大的非对角线元素表示数据的畸变。

为了减小畸变,可以重新定义变量间的线性组合,将协方差矩阵对角化。协方差矩阵的的元素是实数并且对称。

协方差矩阵的特征向量表示OBB包围盒的方向。大的特征值对应大的方差,所以应该让OBB包围盒沿着最大特征值对应的特征向量的方向。

求均值

协方差矩阵

协方差矩阵

对协方差矩阵特征分解

单位向量是指模等于1的向量。由于是非零向量,单位向量具有确定的方向。单位向量有无数个。

一个非零向量除以它的模,可得所需单位向量。一个单位向量的平面直角坐标系上的坐标表示可以是:(n,k) ,则有n²+k²=1。

计算出来的特征向量进行正交标准化。(单位向量)

2.1、将各点的(x,y,z)坐标投影到计算出的坐标轴上,求出中心和半长度。小(x,y,z表示点)大(XYZ表示标准化后找到的主方向)

做投影要用到与单位向量的内积(点乘),b向量在a向量方向上的投影:内积的几何意义:做投影和两向量之间的夹角。

为了确定最大和最小的范围,可以通过计算每个顶点位置坐标与单位向量(XYZ)的内积来完成。(可以分别求出XYZ的最大最小值)

边界盒的尺寸就是X,Y,Z三个方向上(XYZ表示找到的三个主方向即单位向量)相应内积的最大值与最小值之差,边界盒的中心O就是三对反向平面中三个平面的交点。令a,b,c分别为X,Y,Z上最大值与最小值的平均值:

那么中心点坐标就是O=aX+bY+cZ(两向量做投影/点乘/内积)。

最小包围盒顶点计算的过程大致如下:
1.输入点云转换至远点后,求得变换后点云的最大最小x,y,z轴的坐标,此时(max.x,max.y,max.z),(max.x,min.y,max.z),(max.x,max.y,min.z),(min.x,max.y,max.z),(min.x,max.y,min.z),(min.x,min.y,max.z),(min.x,min.y,max.z),(min.x,min.y,min.z)
即为变换后点云的包围盒,也是原始输入点云包围盒顶点坐标经过变化后的坐标.
2.将上述求得的6个包围盒坐标逆变换回输入点云的坐标系,即得到原始输入点云的包围盒顶点坐标.

PS:说明一下

PCA在很多地方还可以用到,笔者觉得了协方差矩阵、特征值、特征向量的几何意义是理解PCA的关键。上述代码中还用到四元数,四元数主要用于旋转变化

参照博客:https://blog.csdn.net/qq_16775293/article/details/82801240

PCL:基于PCL绘制包围盒基础介绍(1)相关推荐

  1. PCL:基于PCL绘制包围盒代码实现(2)

    本博客基于pcl::MomentOflnertiaEstimation类获取基于惯性矩(moment of inertia)与偏心率(eccentricity)的描述子,而该类的另一个功能就是提取有向 ...

  2. PCL 基于惯性矩与偏心率的描述子进行包围盒提取

    1.概述 本例程利用pcl::MomentOfInertiaEstimation类获取基于惯性矩(moment of inertia)与偏心率(eccentricity)的描述子,该类的另一功能是提取 ...

  3. PCL——基于惯性矩与偏心率的描述子进行包围盒提取

    基于惯性矩与偏心率的描述子提取包围盒 文章目录 基于惯性矩与偏心率的描述子提取包围盒 1.概述 2.OBB的实现原理 3.代码 4.效果展示 1.概述 pcl::MomentOfInertiaEsti ...

  4. 【PCL自学:Segmentation1】基于PCL的点云分割:平面模型分割

    基于PCL的点云平面模型分割 1.什么是点云分割 2.如何使用PCL库对将点云中平面模型分割出来 1.什么是点云分割   顾名思义,点云分割就是将一团点云按照不同需求进行分割处理,一般是用在识别或测量 ...

  5. PCL - 3D点云配准(registration)介绍

    前面多篇博客都提到过,要善于从官网去熟悉一样东西.API部分详细介绍见 Point Cloud Library (PCL): Module registration 这里博主主要借鉴Tutorial里 ...

  6. 29 基于PCL的点云平面分割拟合算法技术路线(针对有噪声的点云数据)

    0 引言 最近项目中用到了基于PCL开发的基于平面的点云和CAD模型的配准算法,点云平面提取采用的算法如下. 1 基于PCL的点云平面分割拟合算法 2 参数及其意义介绍 (1)点云下采样 1. 参数: ...

  7. 基于PCL实现欧式聚类提取

    Lidar系列文章 传感器融合是将多个传感器采集的数据进行融合处理,以更好感知周围环境:这里首先介绍激光雷达的相关内容,包括激光雷达基本介绍(本节内容),激光点云数据处理方法(点云数据显示,点云分割, ...

  8. PCL 基于对应点分类的对象识别

    2019.11.18更新 #include <pcl/io/pcd_io.h> #include <pcl/point_cloud.h> //点云类型头文件 #include ...

  9. 学习笔记:点云库PCL(Point Cloud Library )介绍

    本文简要介绍点云库(PCL),一个用于处理2D和3D数据的开源库,如激光雷达点云. 通过熟悉使用PCL的一些基础知识,以便后续使用PCL进行定位.主要涵盖以下内容: 点云数据Point Cloud D ...

最新文章

  1. QRadioButton 使用方法
  2. MultiResUNet笔记
  3. MacBook开机自动连接iPad好评
  4. PolicyGradientMethods-强化学习
  5. 网络开发必备的HTTP协议知识
  6. 这或许才是产品人真实的工资情况
  7. 计算机游戏高少手电影,支持switch,还有电影特技!上手简评骨伽IMMERSA Ti游戏耳机...
  8. 关于Autorun.inf文件
  9. NASNET-【论文理解】
  10. 下载MDK5 Software Packs导入Keil5
  11. 【技术贴】解决vss中提交pdf下载打开空白乱码
  12. JS处理支付宝H5支付
  13. java工作流activity_activity 工作流学习(一)
  14. 基于Swing与JavaFx的音乐播放器——轻音
  15. 7-6 统计大写辅音字母
  16. 光标快速移动到文档尾部_在Word文档中,把光标移动到文件尾部的快捷键是__________。...
  17. jmeter请求返回报文中带有转义字符可加/转义处理后做其他操作
  18. 题解 | Birthday Reminders-2019牛客暑期多校训练营第九场F题
  19. DRM框架梳理-- dumb-buffer的分配和绑定到crtc
  20. 推荐《我是谁 – 没有绝对安全的系统》CLAY——Clown Laughing At You「小丑的嘲笑」

热门文章

  1. [C] [最短路] 只有5行的算法:Floyd-Warshall
  2. java读取文本单词_使用Java计算文本文件中的单词数
  3. Manifest merger failed : uses-sdk:minSdkVersion 15 cannot be smaller than version 16 declared in lib
  4. 51NOD 1287 加农炮(不水的线段树)
  5. shellinabox安装
  6. IOSUIcontrol事件
  7. ubuntu设置不同的eigen版本
  8. java创建对象_java 创建对象的五种方式
  9. usaco Number Triangles
  10. Linux数组计算平均值,从数组中读取并计算平均值