方向包围盒OBB(oriented bounding box) - CSDN博客
文章推薦指數: 80 %
3)方向包围盒OBB(oriented bounding box)是比较著名的一个包围盒类型。
一个给定对象的OBB被定义为包含该对象且相对于坐标轴方向任意的最小的长方体。
方向包围盒OBB(orientedboundingbox)
linuxheik
于 2018-05-1209:37:54 发布
8045
收藏
13
分类专栏:
obb
文章标签:
obb
obb
专栏收录该内容
9篇文章
0订阅
订阅专栏
制造几何仿真中的碰撞检测通常视为针对刚体对象间的碰撞检测,这样的话可以把非刚体即软体的建模和变形算法对碰撞检测的影响减少到最小。
常见成熟的基于包围盒的碰撞检测(boxintersectiontest)算法如:1)沿坐标轴的包围盒AABB(axis-alignedboundingboxes)在碰撞检测的研究历史中使用得最久最广,一个给定对象的AABB被定义为包含该对象且各边平行于坐标轴的最小的六面体。
AABB间的相交测试也比较简单,两个AABB相交当且仅当它们在三个坐标轴上的投影区间均重叠。
定义AABB的六个最大最小值分别确定了它在三个坐标轴上的投影区间,因此AABB间的相交测试最多只需要六次比较运算。
2)包围球类似于AABB,也是简单性好紧密性差的一类包围盒,包围球被定义为包含该对象的最小的球体,计算给定对象E的包围球,首先需确定包围球的球心c,再由球心与三个最大值坐标所确定的点间的距离计算半径r。
包围球的计算时间略多于AABB,但存储一个包围球只需两个浮点数。
3)方向包围盒OBB(orientedboundingbox)是比较著名的一个包围盒类型。
一个给定对象的OBB被定义为包含该对象且相对于坐标轴方向任意的最小的长方体。
OBB最大特点是它的方向的任意性,这使得它可以根据被包围对象的形状特点尽可能紧密地包围对象,但同时也使得它的相交测试变得复杂。
OBB间的相交测试基于分离轴理论(separatingaxistest)。
若两个OBB在一条轴线上(不一定是坐标轴)上的投影不重叠,则这条轴称为分离轴。
若一对OBB间存在一条分离轴,则可以判定这两个OBB不相交。
对任何两个不相交的凸三维多面体,其分离轴要么垂直于任何一个多面体的某一个面,要么同时垂直于每个多面体的某一条边。
因此,对一对OBB,只需测试15条可能是分离轴的轴(每个OBB的3个面方向再加上每个OBB的3个边方面的两两组合),只要找到一条这样的分离轴,就可以判定这两个OBB是不相交的,如果这15条轴都不能将这两个OBB分离,则它们是相交的。
可以在运动过程中使用OBB进行初次碰撞检测,如果没有碰撞,则忽略进行下一个检测,如果发生碰撞,则调用更精细的碰撞检测。
作者定义的包围盒(boundingbox)和实现如下: classPoint3D {public: doublex; doubley; doublez;public: Point3D(); Point3D(doubleX,doubleY,doubleZ); virtual~Point3D();public: //两个向量的交叉乘积(矩阵形式)用于就法向量 Point3Doperator^(Point3Dpt);叉乘crossproduct Point3Doperator-(Point3Dpt); Point3Doperator+(Point3Dpt); doubleoperator*(Point3Dpt);//点乘dotproduct Point3Doperator*(doublek); voidNormalize(); floatVecMod();};classCboundingBox{public: CBoundingBox(); virtual~CBoundingBox(); voidSetBendRelation(doublebendDim,doubledim,doublecen[3]); voidGetBoxCenter(doublecen[3]); voidGetMinMax(double*min_x,double*min_y,double*min_z,double*max_x,double*max_y,double*max_z); voidTranslatedBox(doublexOffset,doubleyOffset,doublezOffset); voidRotateBox(doubleangle,doublex,doubley,doublez); voidInitBoundingBox(Point3DVertex[8]); voidUpdateBoundingBox(Point3DVertex[8]);//更新包围盒public: //定义8个顶点, Point3Dm_Vertex[8];public: //Jorbinedited[2/8/2008] intBoxIntersectTest(CBoundingBox*box); voidGetInterval(CBoundingBox*box,Point3Daxis,float&min,float&max); floatDot(Point3Daxis,Point3Dpt); Point3DGetFaceDir(intindexID); //取面方向 Point3DGetEdgeDir(intindexID);//取边方向};//点在该轴上投影值floatCBoundingBox:ot(Point3Daxis,Point3Dpt){ return(float)((axis*pt)/axis.VecMod());}voidCBoundingBox::GetInterval(CBoundingBox*box,Point3Daxis,float&min,float&max) { floatvalue; min=max=Dot(axis,box->m_Vertex[0]); for(inti=1;i<8;i++) { value=Dot(axis,box->m_Vertex); min=Min(min,value); max=Max(max,value); }}Point3DCBoundingBox::GetEdgeDir(intindexID){ Point3Dpt; Line3DtmpLine; switch(indexID) { case0://edgeinparallelwithxaxis pt=tmpLine.Normalize(m_Vertex[0]),m_Vertex[1]); break; case1://edgeinparallelwithyaxis pt=tmpLine.Normalize(m_Vertex[0],m_Vertex[4]); break; case2://edgeinparallelwithzaxis pt=tmpLine.Normalize(m_Vertex[0],m_Vertex[3]); break; } returnpt;}\ Point3DCBoundingBox::GetFaceDir(intindexID){ Point3DvFace; Plane3DtmpPlane; switch(indexID) { case0://frontandback vFace=tmpPlane.NormLine((m_Vertex[2],m_Vertex[3],m_Vertex[6]); break; case1://leftandright vFace=tmpPlane.NormLine((m_Vertex[1],m_Vertex[2],m_Vertex[5]); break; case2://topandbottom vFace=tmpPlane.NormLine((m_Vertex[0],m_Vertex[1],m_Vertex[2]); break; } returnvFace;} intCBoundingBox::BoxIntersectTest(CBoundingBox*box){ intflag=20; inti,j; floatmin1,max1,min2,max2; for(i=0;i<3;i++) { GetInterval(this,this->GetFaceDir(i),min1,max1); GetInterval(box,this->GetFaceDir(i),min2,max2); if(max1
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值
延伸文章資訊
- 1Oriented Bounding Box Functions - CGAL
The function oriented_bounding_box() computes an approximation of the optimal bounding box, which...
- 2Oriented Bounding Box - an overview | ScienceDirect Topics
An oriented bounding box (OBB) tree [2] is a rectangular bounding box at an arbitrary orientation...
- 3Oriented Bounding Boxes for Small and Freely Rotated Objects
- 4Oriented Bounding Boxes for Small and Freely Rotated ... - arXiv
Index Terms—Object detection, oriented bounding box, remote sensing, rotation-invariant, tiny obj...
- 5- Oriented Bounding Box - COMPAS
_images/oriented-bounding-box.png. from math import radians from compas.geometry import Pointclou...