AABB与OOB包围盒子

包围盒也叫外接最小矩形,是一种求解离散点集最优包围空间的算法,基本思想是用体积稍大且特性简单的几何体(称为包围盒)来近似地代替复杂的几何对象。
在这里插入图片描述
常见的包围盒算法有AABB包围盒、包围球、方向包围盒OBB以及固定方向凸包FDH。碰撞检测问题在虚拟现实、计算机辅助设计与制造、游戏及机器人等领域有着广泛的应用,甚至成为关键技术。而包围盒算法是进行碰撞干涉初步检测的重要方法之一。
AABB盒子: 首先 aabb包围盒由一个max坐标和一个min坐标组成, 一个3D的AABB就是一个简单的六面体,每一边都平行于一个坐标平面,矩形边界框不一定都是立方体,它的长、宽、高可以彼此不同。 一个3D的AABB就是一个简单的六面体,每一边都平行于一个坐标平面,矩形边界框不一定都是立方体,它的长、宽、高可以彼此不同。 因为AABB总是与坐标轴平行,不能在旋转物体时简单地旋转AABB,而是应该在每一帧都重新计算。
AABB的重要性质:
Xmin<= X <= Xmax
Ymin <= Y <= Ymax
Zmin <= Z <= Zmax
特别重要的两个顶点为:Pmin = [Xmin Ymin Zmin],Pmax = [ Xmax Ymax Zmax].
因此只需要知道两个特别重要的顶点(xmin,ymin,zmin)、(xmax,ymax,zmax),记作:

 float[] min = new float []{0.0f,0.0f,0.0f};
 float[] max = new float []{0.0f,0.0f,0.0f};

中心点是两个顶点的中点,代表了包装盒的质点。

  float[] center = new float []{0.0f,0.0f,0.0f};

中心点的计算方法如下:

 float [] center(){   center[0] = (min[0] + max[0])*0.5f;  center[1] = (min[1] + max[1])*0.5f;  center[2] = (min[2] + max[2])*0.5f;  return center;}`

通过这两个顶点可以知道以下属性。

  float xSize() { return (max[0]-min[0]); }
  float ySize() { return (max[1]-min[1]); }
  float zSize() { return (max[2]-min[2]); }
  float size(){ return (max[0]-min[0])*(max[1]-min[1])*(max[2]-min[2]);}

当添加一个顶点到包装盒时,需要先与这两个顶点进行比较。

void add(float []p) {    
if (p[0] < min[0]) min[0] = p[0];   
if (p[0] > max[0]) max[0] = p[0];  
if (p[1] < min[1]) min[1] = p[1];  
if (p[1] > max[1]) max[1] = p[1];   
if (p[2] < min[2]) min[2] = p[2];   
if (p[2] > max[2]) max[2] = p[2];}

检测包装盒是否为空,可以将这两个顶点进行比较。

boolean isEmpty() {   return (min[0] > max[0]) || (min[1] > max[1]) || (min[2] > max[2]);}

检测某个点是否属于AABB范围之内的代码如下:

boolean contains(float []p){    return    (p[0] >= min[0]) && (p[0] <= max[0]) &&    (p[1] >= min[1]) && (p[1] <= max[1]) &&    (p[2] >= min[2]) && (p[2] <= max[2]);}

OBB盒子:基于OBB即定向包容盒子(Oriented Bounding Box,OBB)的技术,它已经广泛用于光线追踪和碰撞检测中, OBB这种方法是根据物体本身的几何形状来决定盒子的大小和方向,盒子无须和坐标轴垂直。这样就可以选择最合适的最紧凑的包容盒子。OBB盒子的生成比较复杂。一般是考虑物体所有的顶点在空间的分布,通过一定的算法找到最好的方向(OBB盒子的几个轴)。
正交:正交矩阵是方块矩阵,行向量和列向量皆为正交的单位向量。行向量皆为正交的单位向量,任意两行正交就是两行点乘结果为0,而因为是单位向量,所以任意行点乘自己结果为1。对于3x3正交矩阵,每行是一个3维向量,两个3维向量正交的几何意义就是这两个向量相互垂直。所以3x3正交矩阵的三行可以理解为一个3D坐标系里的三个坐标轴,下面是3*3正交矩阵M,
x1, x2, x3, // x轴
y1, y2, y3, // y轴
z1, z2, z3,// z轴
单位矩阵表示的三个坐标轴就是笛卡尔坐标系里的x,y,z轴:1, 0, 0, // x轴0, 1, 0, // y轴0, 0, 1, // z轴向量的意义: 一个向量(1, 2, 3)右乘这个矩阵M1得到新的向量(2, 1, 3),就是把原向量从原坐标系变换到一个新的坐标系。 正交矩阵的定义“行向量和列向量皆为正交的单位向量”带来了另一个好处:正交矩阵的转置就是正交矩阵的逆,比普通矩阵求逆矩阵简单多了。逆矩阵的定义就是逆矩阵乘以原矩阵等于单位矩阵,所以,正交矩阵的转置就是正交矩阵的逆。
方差: 在统计学中,方差是用来度量单个随机变量的离散程度,而协方差则一般用来刻画两个随机变量的相似程度,
在这里插入图片描述
协方差: 理解:两个变量在变化过程中是同方向变化?还是反方向变化?同向或反向程度如何? 你变大,同时我也变大,说明两个变量是同向变化的,这时协方差就是正的。 你变大,同时我变小,说明两个变量是反向变化的,这时协方差就是负的。 从数值来看,协方差的数值越大,两个变量同向程度也就越大。反之亦然。
在这里插入图片描述在这里插入图片描述
公式简单翻译一下是:如果有X,Y两个变量,每个时刻的“X值与其均值之差”乘以“Y值与其均值 之差”得到一个乘积,再对这每时刻的乘积求和并求出均值(其实是求“期望”,但就不引申太多 新概念了,简单认为就是求均值了)。因此,协方差矩阵为
在这里插入图片描述
其中,对角线上的元素为各个随机变量的方差,非对角线上的元素为两两随机变量之间的协方差,根据协方差的定义,我们可以认定:矩阵
在这里插入图片描述
协方差矩阵

  1. 协方差矩阵能处理多维问题;

  2. 协方差矩阵是一个对称的矩阵,而且对角线是各个维度上的方差。

  3. 协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。

  4. 样本矩阵中若每行是一个样本,则每列为一个维度,所以计算协方差时要按列计算均值。

OBB算法求解概括:

  • 按坐标类型对数据进行组合:x = {x1, x2, …, xn},y = {y1, y2, …, yn}
  • 分别求出集合x和集合y的平均值averX和averY,并构建协方差矩阵:cov(x,x)cov(y,x)cov(x,y)cov(y,y)
  • 再根据协方差矩阵求解其特征值和特征向量,其中特征值较大者为OBB包围盒的方向。
  • 得到的特征向量即为新的坐标系,将原始数据回落到该坐标系下,即可求得OBB包围盒的长,宽以及中心点。
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值