最近在用opengl写一个小游戏,动画和人机交互都很简单,逻辑控制,边界问题都是目前的一个难题,正好找了几篇碰撞检测的资料,看着挺不错的

http://www.cppblog.com/mybios/archive/2006/11/19/15408.html(高级碰撞检测)

http://www.cnblogs.com/tinfish/archive/2012/03/21/2410474.html(分离轴理论)

http://blog.csdn.net/haochao/article/details/3917993

http://blog.csdn.net/shenlan282/article/details/7179575(三维)

三维:在求解碰撞法线、接触集合之前,得先确定长方体之间是否碰撞。一个相对简单的判断凸多面体相交性的方法是分离轴定理(SAT,Separating Axis Theorem)。直观来看,如果两个凸多面体不相交,那么必定存在一个空间平面,使得这两个多面体分别位于平面两侧。如果找不到这样的平面,那么可以判定其相交。这个情况等价于:如果能找到垂直于某个平面的直线,使得多面体在这条直线上的投影不相交,那么就可以判定多面体不相交;否则就相交。这条直线,就是分离轴。一般而言,检验多面体在直线上的投影,会比检验多面体是否位于平面两侧更加方便。

SAT是一种检测凸多边形相交的算法,他的内容是,如果能找到一条轴,使得两个无题在该轴上的投影互不重叠,那么着两个物体就是不相交的。

强荐:转载http://hi.baidu.com/jrsnail/blog/item/19f9b4b30e11ecacd9335a8d.html

简介
本文是阐述如何在2D动作游戏中进行精确而高效的碰撞检测。这里的碰撞是基于多边形而不是基于精灵的。这两者之间在设计上会有不同。
基于精灵的碰撞检测是通过精灵之间的重叠的像素来完成的。而多边形使用向量数学来精确计算交点,时间和碰撞方向。虽然多边形仅仅是精灵的一个近似,但是它比精灵系统要高级。
  • 可以精确模拟逼真的简单物理学,例如反弹,摩擦,斜面的滑行
  • 碰撞检测可以更精确的用于高速精灵系统。在基于精灵的系统中,如果物体移动过快就会在跳过另一个物体。
  • 基于向量数学因此可以扩展到3D,然而精灵碰撞系统被严格限制在2D的情况下。

特性
本文使用的算法只适用于凸多边形,例如三角形,四边形,六边形,圆形。对于非凸多边形,你可以将其分解为多个凸多边形,例如三角形。
算法可以用于快速移动或慢速移动的多边形。不管物体移动多快,碰撞都不会丢失。它也可以处理重叠的问题,并促使交叠物体分离。
演示也支持分割多边形交叉。这可以用于子弹的建模。
同时提供了简单的物体系统,弹力,一些基本的摩擦和静摩擦力。用于确保物体不会从斜面上滑落。

有一个刚体系统的例子,使用了Chrsi Hecker的物理教程。


限制
有序碰撞。就是说并不是有序的进行碰撞。这对于快速移动的物体会出现一定的问题。一旦碰撞被检测到,它就被直接处理了。理想状态下你可能需要找到一个碰撞点并处理它,然后寻找更多的碰撞。但是对于2D动作游戏,这通常是不必要的。
一、分离坐标轴方法
这个方法是碰撞检测的核心。它的规则非常简单并且非常易于实现。这个方法也非常快并且非常可靠,因为计算中没有使用除法操作,下面给出一个简单的基于两个BOX的碰撞检测的例子。

算法试图在两个物体之间找到一个合适平面,如果这个平面存在,那么物体就没有相交。
为了测试物体是否是分开的,简单的方法是投影这个物体到平面的法线上,并比较两者之间的间距看二者是否重叠。

显然有无数的平面可以用来分割两个物体。但是已经经过证明的是:你只需要使用一部分平面来进行测试,对于BOX从上图中可以看出平面的法线为BOX B的长轴。

对于BOX来说需要测试的分割平面是那些法线等于两个BOX的轴向的平面。因此对于两个BOX来说,你只需要测试4个分割平面即可。在这四个平面里,一旦发现一个分割平面可以分割BOX那么你就可以断定这两个BOX是不相交的。
如果四个平面都不能分割BOX,那么这两个BOX一定是相交的,也就是出现了碰撞。
可以扩展这个算法到普通的多边形,算法是相同的,只用需要测试的平面的数量改变了。并且分割平面在每个多边形边的垂直方向上又有一个法线。在下 图中,你可以看到两个分割平面用于测试。在红色的平面上你可以看到两个间隔是重叠的。然而,在蓝色的平面上间隔是不重叠的,因此,蓝色的平面的是分割平 面,因此物体是不相交的。

现在,我们有一个算法来检测两个多边形是否是相交的。代码可以分为三个部分:

a)         生成需要测试的分离轴

b)        计算每一个多边形在分离轴法线上的投影

c)        检测这些投影是否相交

bool Intersect(Polygon A, Polygon B)
{
for(I = 0; I < A.num_edges; I ++)
{
Vector N = Vector(-A.EdgeDir[I].y, A.EdgeDir[I].x);
if (AxisSeparatePolygons(N, A, B))
return false;
}
for(I = 0; I < B.num_edges; I ++)
{
Vector N = Vector(-B.EdgeDir[i].y, B.EdgeDir[I].x);
if (AxisSeparatePolygons (N, A, B))
return false;
}
return true;
}

void CalculateInterval(Vector Axis, Polygon P, float& min, float& max)
{
float d = Axis dot P.vertex[0]; //从坐标原点开始计算向量
min = max = d;
for(I = 0; I < P.num_vertices; I ++)
{
float d = P.vertex[I] dot Axis;
if (d < min)
min = d;
else
if(d > max)
max = d;
}
}

算法检测2D多边形之间的碰撞,这个算法非常的快速和适用。边的方向不需要单位化,因此你可以避免存贮边的方向,并通过多边形的顶点直接得到边的方向。

for(J = A.num_vertices-1, I = 0; I < A.num_vertices; J = I, I ++)
{
Vector E = A.vertex[I] – A.vertex[J];
Vector N = Vector(-E.y, E.x);

if (AxisSeparatePolygons(N, A, B))
return false;
}

碰撞检测—分离轴理论相关推荐

  1. 第6-8课:分离轴算法(SAT)与碰撞检测(图文篇)

    物体的碰撞检测是游戏软件中的关键算法之一,两个角色是否能够对话.子弹是否击中了物体,以及是否出现人物穿墙的 bug,都依赖于一套可靠的碰撞检测算法.有很多算法可以实现碰撞检测,基于算法几何的方法有轴对 ...

  2. egret判断两个多边形是否相交(分离轴定律)

    参考原文:原文 预备知识:向量的点积:  关于向量的知识这里不再赘述 分离轴定理(Separating Axis Theorem) 概念:通过判断任意两个 凸多边形 在任意角度下的投影是否均存在重叠, ...

  3. 分离轴定理SAT及碰撞检测

    1.简介 分离轴理论,简称SAT(SeparatingAxisTheorem),通过判断任意两个凸多边形在任意角度下的投影是否均存在重叠,来判断是否发生碰撞.即两个不相交的多边形一定能找到一条轴,它们 ...

  4. 分离轴定理SAT凸多边形精确碰撞检测

    分离轴定理SAT凸多边形精确碰撞检测 定理 Separating Axis Theorem,缩写SAT,中文为分离轴理论或分离轴定理,通过判断凸多边形在分离轴上的投影是否重叠来判断是否发生碰撞. 所谓 ...

  5. 包围盒----碰撞检测

    制造几何仿真中的碰撞检测通常视为针对刚体对象间的碰撞检测,这样的话可以把非刚体即软体的建模和变形算法对碰撞检测的影响减少到最小.常见成熟的基于包围盒的碰撞检测(box intersection tes ...

  6. 布料模拟碰撞检测的实施总结

    1.      多面体之间有两类"基本接触",即一个多面体的面与另一个多面体的顶点相接触(A类接触)和一个多面体的边和另一个多面体的边相接触(B类接触). 2.    对于线段和多 ...

  7. 方向包围盒OBB(oriented bounding box)

    制造几何仿真中的碰撞检测通常视为针对刚体对象间的碰撞检测,这样的话可以把非刚体即软体的建模和变形算法对碰撞检测的影响减少到最小.常见成熟的基于包围盒的碰撞检测(box intersection tes ...

  8. 包围盒算法基本知识(一)

    碰撞检测 定义:基于物体的空间位姿,确定两个或多个物体是否在一个或多个点发生接触 包围盒 定义 一种求解离散点集最优包围空间的方法. 基本思想 利用体积稍大的多边形近似代替研究对象 常见算法: 轴对齐 ...

  9. Unity 5.5正式版发布,新功能预览!

    Unity 5.5新功能主要包含以下几个关键点: 新平台,新机会 首先,我们不断扩大内容创作者接触新用户和新市场的机会. Unity 5.5已正式支持Microsoft Holographic (Ho ...

最新文章

  1. ida 中segment中的extern是什么
  2. dev编译器:c++如何让其输出小数16.84,浮点数类型数据!
  3. 笨办法学C 练习22:栈、作用域和全局
  4. 你真的了解软件测试行业吗?
  5. html自适应pc窗口大小_自适应技术很难吗?为什么Shopyy平台将网站分为PC端和移动端...
  6. w3wp.exe内存占用过高(网站打不开,应用程序池回收就正常)
  7. jvm性能调优实战 - 31从测试到上线_如何分析JVM运行状况及合理优化
  8. python简单的爬虫教程中召唤小海龟_Python练习,网络小爬虫(初级)
  9. boost::property_map用法的测试程序
  10. CodeForces - 1284B New Year and Ascent Sequence(乱搞)
  11. linux tar cvf_Linux中的Tar命令:Tar CVF和Tar XVF通过示例命令进行了解释
  12. 鹿邑2021高考成绩查询,鹿邑中考成绩查询2021
  13. Josh Frank:XRP是有史以来第三大倒闭事件
  14. NXP ZigBee JN5169 DimmerLight编译过程梳理
  15. linux怎么运行cu,Linux cu 命令
  16. 旭元数艺:只争朝夕 不负韶华
  17. EasyBoot常用的命令
  18. 系统集成方式:数据集成、控制集成
  19. 利用Python实现FGO自动战斗脚本,再也不用爆肝啦~
  20. C++ vector函数

热门文章

  1. 白平衡是什么?怎么理解白平衡?
  2. bifurcation diagram 分岔图 如何理解分岔图
  3. Windows程序设计学习笔记——线程(二)同步
  4. ValueError: Found input variables with inconsistent numbers of samples
  5. 一文教你用java实现即时通讯软件的设计(附下载源码)
  6. Excel表格数据导入mysql数据库中
  7. java计算机毕业设计BS架构考研交流学习平台设计与实现源码+数据库+系统+lw文档
  8. win电脑被安装垃圾软件后在注册表哪里卸载?
  9. 新宝综述指数回调行情与昨日相反
  10. 在js中,为什么{}不等于{},[]不等于[]?