Sphere and AABB 包围盒碰撞检测应用
2015-12-29 14:36
337 查看
感谢博主的分享,如需要该博主更多文章,请参考http://blog.csdn.net/i_dovelemon/article/category/2337629
引言
在游戏开发中,经常会用到碰撞检测的技术。而在其中,关于Sphere(球体)和AABB(轴向包围盒)的碰撞尤为常见。今天就来记录下,如何进行这两个基本几何体的碰撞检测。算法概要
进行Sphere和AABB包围体的碰撞,实际上就是以下的两个步骤:1.在AABB盒上,找到距离Sphere的圆心距离最近的点 P(closetPtToAABB)
2.计算出这个点P与Sphere的圆心Q之间的距离,为了节省开销,可保留平方,即距离的平方值(d2)
3.比较距离的平方值d2与Sphere的半径平方值r2,如果d2 <= r2,则说明,这个点在Sphere中,即发生了碰撞,反之则没有发生碰撞。
思路十分的简单,剩下的问题就是如何求AABB盒上距离Sphere的圆心最近的点是哪一个?
我们在表示AABB盒的时候,一般使用的都是MIN-MAX这样的表示方法。而AABB又是轴向平行的,所以,讨论一个2D平面上的情况,就可以推广到3D空间中去。
来看下,下面的图:
对于空间中的任何一个点P,要求在AABB盒B上距离P点最近的点,实际上就是将P点的坐标改裁剪到在AABB盒上去。比如上图左边的图,P点坐标裁剪完成之后,就是AABB盒上的Q点,也就是说,如果P点的x坐标小于AABB盒的MIN坐标的x坐标,那么就对应的Q点坐标就是MIN的X坐标。
所以,求最近点的代码如下:
[cpp] view
plaincopy
<span style="font-family:Microsoft YaHei;">void clostPtToAABB(AABB a, POINT p, POINT&q)
{
if(p.x < a.min.x) q.x = a.min.x ;
else if(p.x > a.max.x) q.x = a.max.x ;
if(p.y < a.min.y) q.y = a.min.y ;
else if(p.y > a.max.y) q.y = a.max.y ;
}</span>
再有了最近点之后,只要求Sphere的圆心和q点的距离,然后与Sphere的半径进行比较即可。
好了,代码很简单,为此我给出了一个Demo实例,下面是Demo的截图:
相关文章推荐
- CP30,DBCP数据源配置
- 并发抢购
- WordPress中用于创建以及获取侧边栏的PHP函数讲解
- STM32 串口3使用代码
- 关于SpyDroid
- jQuery源码分析6--jQuery对象的构建
- 【bzoj2329】[HNOI2011]括号修复 splay
- 浅析正则表达式
- SQL 性能调优日常积累【转】
- Linux内核线程kthread
- 文档显示部件类似套打显示构建效果
- 100行代码精通C语言-目录
- 花钱大师
- Shell break和continue命令
- LeetCode 078 Subsets
- [HDU 2200]
- viewDidUnload 和 dealloc 的区别
- 【ubuntu】首选项和应用程序命令(preference & application)
- zk常见问题汇总
- Visual Sutdio2015 C++嵌入Lua脚本环境配置