手机网站打开微信支付功能,怎么做网站超市,搜狐综合小时报2022113011,做网站公司流程原理简述 包围体#xff08;包容盒#xff09;是一个简单的几何空间#xff0c;里面包含着复杂形状的物体。为物体添加包围体的目的是快速的进行碰撞检测或者进行精确的碰撞检测之前进行过滤#xff08;即当包围体碰撞#xff0c;才进行精确碰撞检测和处理#xff09;。包…原理简述 包围体包容盒是一个简单的几何空间里面包含着复杂形状的物体。为物体添加包围体的目的是快速的进行碰撞检测或者进行精确的碰撞检测之前进行过滤即当包围体碰撞才进行精确碰撞检测和处理。包围体类型包括球体、轴对齐包围盒AABB、有向包围盒OBB、8-DOP以及凸壳CONVEX HULL。
常见包容盒 Bounding Volumes分类
包容球SPHERE 用球体包围整个几何体用于相交测试很方便但是其紧密型差周围空隙较大当物体变形后包围球需要重新计算。当对象进行旋转运动时包围球不需要做任何更新这是包围球的优势即当几何对象频繁进行旋转运动时使用包围球效率较高。AABB包容盒Axially Aligned Bounding Box3D环境下的AABB盒即一个六面体每个边都平行于一个坐标平面较简单但紧密性较差当物体旋转、形变之后需要对AABB进行更新。本身的长宽高根据物体大小而定。OBB包容盒Oriented Bounding Box此方法紧密型较好可以降低参与相交测试的包容盒数目因此性能要优于AABB和包容球。当物体发生旋转仅需对OBB进行相同的旋转即可但是当物体形变后更新OBB的代价较大故不适用那些软体的对象。8-DOP8-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.husing namespace std::chrono_literals;int main(int argc, char** argv)
{pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::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-addPointCloudpcl::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包容盒。