【三维OBB包围盒算法简介】

在这里主要介绍三维的思路,黑盒模型:

obb的参数(中心点、三轴向量、三轴半长,以确定一个空间中的矩形)= f(点集)

 

步骤① 分解点集的xyz分量

即把所有点的 x、y、z 值分别放到独立的数组中

步骤② 对x、y、z这三个随机变量(一维数组)求协方差矩阵

步骤③ 对步骤②中的协方差矩阵求解特征值与特征向量,特征向量构造列向量矩阵M

步骤④ 将点集的几何中心平移至坐标系原点,并全部乘以M矩阵进行旋转变换

步骤⑤ 将旋转变换后的点的坐标,求xMax、xMin、yMax、yMin、zMax、zMin,进而求出obb中心坐标、obb半长

步骤⑥ 将obb中心坐标左乘M的逆,得到此中心坐标在原来坐标系的坐标值

步骤⑦ 将步骤⑥中得到的原坐标系下的obb中心坐标平移回原处(平移向量与步骤④的平移向量刚好是相反向量)

其中,计算难点在于步骤③,最经典的做法是使用 Jacobi 迭代计算算法,在数值分析课程中是一节基础,Jacobi 算法还是可以优化的。 还可以使用矩阵分解算法等进行优化。

OBB(Oriented Bounding Box,有向包围)是一种用于包围物体的几何形状,它既能够保持物体的形状,又能够提供方便的碰撞检测和投影。以下是使用C++实现OBB包围算法的基本步骤: 1. 进行物体的三维建模,并获得每个顶点的位置信息。 2. 找到物体的最小和最大点,以确定物体的中心点。 3. 对于每个顶点,将其与物体中心点的位置向量相减,将这个向量存储在一个数组中。 4. 计算出物体的协方差矩阵,使用数组中的向量作为输入。 5. 对协方差矩阵进行特征值分解,以获得物体的主方向和大小。 6. 构建OBB包围的八个顶点,通过将物体中心点与主方向上的最小和最大边界点分别相加和相减得到。 以下是一个简单的C++代码示例,用于计算OBB包围的8个顶点: ```cpp #include <iostream> #include <vector> #include <Eigen/Dense> using namespace Eigen; void computeOBB(const std::vector<Vector3f>& points, Matrix3f& axes, Vector3f& center, Vector3f& extents) { int numPoints = points.size(); // Compute the center point of the object center.setZero(); for (int i = 0; i < numPoints; ++i) center += points[i]; center /= numPoints; // Compute the covariance matrix of the object Matrix3f covMat; covMat.setZero(); for (int i = 0; i < numPoints; ++i) { Vector3f v = points[i] - center; covMat += v * v.transpose(); } covMat /= numPoints; // Compute the eigenvalues and eigenvectors of the covariance matrix SelfAdjointEigenSolver<Matrix3f> eig(covMat); Vector3f eigenValues = eig.eigenvalues().real(); Matrix3f eigenVectors = eig.eigenvectors().real(); // Set the axes and extents of the OBB axes = eigenVectors.transpose(); extents = eigenValues.sqrt(); // Compute the 8 corners of the OBB std::vector<Vector3f> corners(8); for (int i = 0; i < 8; ++i) { Vector3f corner; for (int j = 0; j < 3; ++j) corner(j) = (i & (1 << j)) ? extents(j) : -extents(j); corners[i] = center + axes * corner; } } ``` 这个函数的输入是一个三维点的向量数组,表示物体的顶点位置。函数输出物体的OBB包围的8个顶点,以及旋转矩阵和大小向量。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xhgen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值