方向包围盒OBB(oriented bounding box) - CSDN博客

文章推薦指數: 80 %
投票人數:10人

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(max1GetFaceDir(i),min1,max1);                    GetInterval(box,box->GetFaceDir(i),min2,max2);                    if(max1GetEdgeDir(i))^(box->GetEdgeDir(j));//crossproduct         GetInterval(this,axis,min1,max1);                               GetInterval(box,axis,min2,max2);                               if(max1show(); 改成这样后,输出结果是1107296321 您愿意向朋友推荐“博客详情页”吗? 强烈不推荐 不推荐 一般般 推荐 强烈推荐 提交 最新文章 c++17using继承所有构造函数 【Unity】Camera.WorldToViewportPoint计算原理及实现 PixelCoordinates 2022年1篇 2021年3篇 2019年83篇 2018年270篇 2017年541篇 2016年458篇 2015年124篇 2014年267篇 2013年481篇 2012年257篇 目录 目录 分类专栏 tcc脚本 2篇 usb驱动 1篇 qtopia 14篇 openwrt 1篇 net 4篇 智能家居 1篇 zigbee 16篇 数据库 3篇 mini2440 2篇 libpcap 4篇 makfile 8篇 linux版本号 4篇 串口通信 21篇 lsp 4篇 电场电感与磁场的作用 15篇 hook 27篇 汇编 27篇 dll 3篇 单片机 12篇 winhook 16篇 找共享内存 3篇 linuxhook 34篇 gdb 29篇 内核 15篇 plt 11篇 ld.so 6篇 linuxstart 6篇 堆栈 4篇 C# 57篇 sqlite 15篇 信号 2篇 3d开源引擎 6篇 USB详细介绍 1篇 map 2篇 windows运行不起来 10篇 堆栈对齐 3篇 time 3篇 linux线程 12篇 电感 1篇 fork 2篇 振荡电路 29篇 SSE 2篇 gbk 11篇 gtest 1篇 找文件 1篇 gmock 5篇 代码覆盖率 1篇 无线通信 6篇 集成电路 4篇 __attribute__((constructor)) 3篇 微机原理 2篇 shell 8篇 管道 1篇 标准输出重定向 1篇 USB 12篇 浏览器 1篇 测试 1篇 binutils 28篇 嵌入式 1篇 plt 性能 2篇 开源软件 cocos2d-x 170篇 chown 2篇 tcp 9篇 d3d 165篇 opengl 154篇 vassix 2篇 gbk 单片机 显存 1篇 类模板 15篇 reactos 4篇 lock 4篇 zlib 4篇 php 2篇 glibc 30篇 time int 5篇 lua 88篇 安桌 4篇 BLCR 10篇 安全 6篇 RingSDK 5篇 tcp scew 2篇 碰撞 17篇 so 3篇 安卓java手机开发 40篇 sqlite windows线程 5篇 windSokcet32 3篇 unity3d 130篇 j3 4篇 mfc 2篇 googelprotocolbuffer 8篇 C# 1篇 mysql 110篇 log 3篇 linux下查找文件大小 3篇 db 2篇 3dmax 5篇 qq 3篇 云数据库 52篇 iphone 7篇 模拟 1篇 VisualStudio 10篇 python 47篇 蓝牙 9篇 kvm 12篇 django 1篇 mangodb 44篇 hadoop 13篇 tidb 21篇 go语言 7篇 日志收集系统 3篇 base64 1篇 leveldb 26篇 rust 3篇 raft 9篇 skiplist 1篇 linux系统 6篇 sync 6篇 nodejs 24篇 luajit 10篇 物理碰撞 3篇 向量 1篇 欧拉角 10篇 显卡 5篇 ogre 41篇 云代理 boost 3篇 机器学习 2篇 hash-bloomfilter c++11 36篇 完成端口 26篇 ht4w 7篇 flatbuffer 6篇 mysql数据库在线备份 31篇 uv贴图 3篇 rocksdb 7篇 字符串比较 1篇 json 5篇 SkinnedMesh骨骼动画 11篇 casfree-lock锁 11篇 linux 7篇 tokyocabinet 3篇 web 7篇 Shader 27篇 RTT 3篇 decltype,lib decltype 3篇 lib 4篇 font mysqlredolog 13篇 binglog 2篇 2PC和3PC 16篇 B+和LSM 1篇 Paxos 24篇 帧同步 1篇 DCDB 1篇 RocketMQ 5篇 open-source 1篇 3d基础 5篇 极光推送 1篇 协程 2篇 串口波特率 6篇 三极管 2篇 重载符 2篇 Lua的线程和状态及协程 1篇 粒子系统 6篇 渲染管线流程图 2篇 memory 1篇 float 2篇 屏幕分辨率 1篇 pbr 12篇 Quaternion 1篇 3D效果bloom 10篇 mrtMultipleRenderTargets 2篇 Unity动画 1篇 ugui 2篇 3d特效 1篇 mono 18篇 网格剖分 1篇 shadowmap 21篇 贝塞尔曲线 2篇 字节对齐 yacc 3篇 mq 5篇 bbr 1篇 valgrind 1篇 JsonCpp 3篇 obb 9篇 PhysX 10篇 vr 1篇 坐标系 1篇 fbx 1篇 放大缩小 3篇 CombineMeshes 1篇 uinty特性类 objfile 6篇 windowerror 4篇 lib 1篇 注册表 1篇 骨骼动画 12篇 摄像机 11篇 yaml 1篇 unitydebug 2篇 矩阵 2篇 旋转 7篇 自旋锁spinlock 7篇 垂直同步 2篇 UEFI 1篇 glib 1篇 memorybarrier 9篇 gprof 1篇 Lightmaps 4篇 DirectX11 2篇 DrawIndexedPrimitive 1篇 ebook 1篇 雾化 2篇 Console 1篇 烘焙 UTF-8 4篇 右值 4篇 透视投影 6篇 SV_POSITION 7篇 特效 1篇 ColorMask 高斯模糊 1篇 AngryBots 1篇 StencilBuffer 3篇 kafka kafkaelk 1篇 RectTransform 1篇 Cocoscreator 3篇 chrome 1篇 cocos2dx 2篇 unity 3篇 VerilogRTL 9篇 cpu 9篇 UnityEditor 7篇 VisualStudio2012Natvis 1篇 IC设计流 1篇 触发器 2篇 视锥体裁剪 5篇 目录 实付元 使用余额支付 点击重新获取 扫码支付 钱包余额 0 抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。

2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值



請為這篇文章評分?