`
cenphoenix
  • 浏览: 160539 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

游戏算法整理 算法二:碰撞

阅读更多

1.   碰撞检测和响应
碰撞在游戏中运用的是非常广泛的,运用理论实现的碰撞,再加上一些小技巧,可以让碰撞检测做得非常精确,效率也非常高。从而增加游戏的功能和可玩性。

2D碰撞检测
2D的碰撞检测已经非常稳定,可以在许多著作和论文中查询到。3D的碰撞还没有找到最好的方法,现在使用的大多数方法都是建立在2D基础上的。

碰撞检测
碰撞的检测不仅仅是运用在游戏中,事实上,一开始的时候是运用在模拟和机器人技术上的。这些工业上的碰撞检测要求非常高,而碰撞以后的响应也是需要符合现实生活的,是需要符合人类常规认识的。游戏中的碰撞有些许的不一样,况且,更重要的,我们制作的东西充其量是商业级别,还不需要接触到纷繁复杂的数学公式。



 图1

最理想的碰撞,我想莫过于上图,完全按照多边形的外形和运行路径规划一个范围,在这个范围当中寻找会产生阻挡的物体,不管是什么物体,产生阻挡以后,我们运动的物体都必须在那个位置产生一个碰撞的事件。最美好的想法总是在实现上有一些困难,事实上我们可以这么做,但是效率却是非常非常低下的,游戏中,甚至于工业中无法忍受这种速度,所以我们改用其它的方法来实现。



 图2
最简单的方法如上图,我们寻找物体的中心点,然后用这个中心点来画一个圆,如果是一个3D的物体,那么我们要画的就是一个球体。在检测物体碰撞的时候,我们只要检测两个物体的半径相加是否大于这两个物体圆心的实际距离。

 



 

图3

这个算法是最简单的一种,现在还在用,但是不是用来做精确的碰撞检测,而是用来提高效率的模糊碰撞检测查询,到了这个范围以后,再进行更加精密的碰撞检测。一种比较精密的碰撞检测查询就是继续这种画圆的思路,然后把物体细分,对于物体的每个部件继续画圆,然后再继续进行碰撞检测,直到系统规定的,可以容忍的误差范围以后才触发碰撞事件,进行碰撞的一些操作。

有没有更加简单的方法呢?2D游戏中有许多图片都是方方正正的,所以我们不必把碰撞的范围画成一个圆的,而是画成一个方的。这个正方形,或者说是一个四边形和坐标轴是对齐的,所以运用数学上的一些方法,比如距离计算等还是比较方便的。这个检测方法就叫AABBs(Axis-aligned Bounding Boxes)碰撞检测,游戏中已经运用的非常广泛了,因为其速度快,效率高,计算起来非常方便,精确度也是可以忍受的。

做到这一步,许多游戏的需求都已经满足了。但是,总是有人希望近一步优化,而且方法也是非常陈旧的:继续对物体的各个部分进行细分,对每个部件做AABB的矩形,那这个优化以后的系统就叫做OBB系统。虽然说这个优化以后的系统也不错,但是,许多它可以运用到的地方,别人却不爱使用它,这是后面会继续介绍的地方。

John Carmack不知道看的哪本书,他早在DOOM中已经使用了BSP系统(二分空间分割),再加上一些小技巧,他的碰撞做得就非常好了,再加上他发明的castray算法,DOOM已经不存在碰撞的问题,解决了这样的关键技术,我想他不再需要在什么地方分心了,只要继续研究渲染引擎就可以了。(Windows游戏编程大师技巧P392~P393介绍)(凸多边形,多边形退化,左手定律)SAT系统非常复杂,是SHT(separating hyperplane theorem,分离超平面理论)的一种特殊情况。这个理论阐述的就是两个不相关的曲面,是否能够被一个超平面所分割开来,所谓分割开来的意思就是一个曲面贴在平面的一边,而另一个曲面贴在平面的另一边。我理解的就是有点像相切的意思。SAT是SHT的特殊情况,所指的就是两个曲面都是一些多边形,而那个超平面也是一个多边形,这个超平面的多边形可以在场景中的多边形列表中找到,而超平面可能就是某个多边形的表面,很巧的就是,这个表面的法线和两个曲面的切面是相对应的。接下来的证明,我想是非常复杂的事情,希望今后能够找到源代码直接运用上去。而我们现在讲究的快速开发,我想AABB就足以满足了。

3D碰撞检测
3D的检测就没有什么很标准的理论了,都建立在2D的基础上,我们可以沿用AABB或者OBB,或者先用球体做粗略的检测,然后用AABB和OBB作精细的检测。BSP技术不流行,但是效率不错。微软提供了D3DIntersect函数让大家使用,方便了许多,但是和通常一样,当物体多了以后就不好用了,明显的就是速度慢许多。

碰撞反应
碰撞以后我们需要做一些反应,比如说产生反冲力让我们反弹出去,或者停下来,或者让阻挡我们的物体飞出去,或者穿墙,碰撞最讨厌的就是穿越,本来就不合逻辑,查阅了那么多资料以后,从来没有看到过需要穿越的碰撞,有摩擦力是另外一回事。首先看看弹性碰撞。弹性碰撞就是我们初中物理中说的动量守恒。物体在碰撞前后的动量守恒,没有任何能量损失。这样的碰撞运用于打砖块的游戏中。引入质量的话,有的物体会是有一定的质量,这些物体通常来说是需要在碰撞以后进行另外一个方向的运动的,另外一些物体是设定为质量无限大的,这些物体通常是碰撞墙壁。

当物体碰到质量非常大的物体,默认为碰到了一个弹性物体,其速度会改变,但是能量不会受到损失。一般在代码上的做法就是在速度向量上加上一个负号。

绝对的弹性碰撞是很少有的,大多数情况下我们运用的还是非弹性碰撞。我们现在玩的大多数游戏都用的是很接近现实的非弹性碰撞,例如Pain-Killer中的那把吸力枪,它弹出去的子弹吸附到NPC身上时的碰撞响应就是非弹性碰撞;那把残忍的分尸刀把墙打碎的初始算法就是一个非弹性碰撞,其后使用的刚体力学就是先建立在这个算法上的。那么,是的,如果需要非弹性碰撞,我们需要介入摩擦力这个因素,而我们也无法简单使用动量守恒这个公式。

我们可以采取比较简单的方法,假设摩擦系数μ非常大,那么只要物体接触,并且拥有一个加速度,就可以产生一个无穷大的摩擦力,造成物体停止的状态。


基于别人的引擎写出一个让自己满意的碰撞是不容易的,那么如果自己建立一个碰撞系统的话,以下内容是无法缺少的:

–     一个能够容忍的碰撞系统
–     一个从概念上可以接受的物理系统
–     质量
–     速度
–     摩擦系数
–     地心引力

http://www.gamasutra.com/features/20000330/bobic_01.htm
http://www.gamasutra.com/features/20000330/bobic_02.htm
http://www.gamasutra.com/features/20000330/bobic_03.htm

这三篇是高级碰撞检测。

 

 

 

 

 

 

 

 

 

 

  • 大小: 28.8 KB
  • 大小: 20 KB
  • 大小: 19.4 KB
分享到:
评论

相关推荐

    仿照 游戏算法整理 算法一:A*寻路初探 写了一段代码

    在本文中,我们将深入探讨游戏开发中的一个重要算法——A*寻路算法,并通过代码实现来增强理解。A*算法是一种广泛应用的路径搜索方法,尤其在游戏场景中,它能高效地找到两个点之间的最短路径,同时考虑到路径的成本...

    精华游戏算法整理.rar

    这个“精华游戏算法整理”压缩包显然包含了关于游戏算法的重要资料,主要聚焦于提高游戏性能、优化玩家体验和创新游戏机制。下面我们将深入探讨游戏算法的一些关键方面。 1. **寻路算法**:寻路算法是游戏中的核心...

    MD5碰撞验证算法

    碰撞攻击通常涉及找到两组不同的输入,通过精心设计使得它们的MD5摘要相同,这可能需要利用MD5算法的数学结构和特定的优化算法。 MD5的计算过程分为四个步骤:初始化、异或操作、循环运算和结果整理。初始化使用一...

    典型常用算法包(很全,代码详尽)

    这些算法主要用于整理数据,提升数据处理效率。例如,快速排序以其平均时间复杂度为O(n log n)而广受欢迎。 2. 搜索算法:如二分查找,适用于有序数据集,其时间复杂度为O(log n)。另外,深度优先搜索和广度优先...

    加密算法整理.docx

    MD5曾被视为安全的散列函数,但现在已知存在碰撞攻击的可能性,而SHA1尽管仍被使用,但其安全性也有所下降,更推荐使用SHA-2或SHA-3系列。HMAC(基于密钥的哈希消息认证码)结合了散列函数和密钥,提供数据完整性...

    机器人路径规划算法整理

    8. **多机器人协同路径规划**:在多机器人系统中,不仅要考虑单个机器人的路径规划,还要解决机器人之间的碰撞避免和协同问题。这需要使用到博弈论、分布式算法等多学科知识。 总的来说,机器人路径规划算法涉及...

    阿里整理的算法大全资料

    《阿里整理的算法大全资料》是一份集合了阿里巴巴集团精心整理的算法学习资源,涵盖了算法领域的广泛知识。这份资料旨在帮助学习者系统性地理解和掌握算法,提升在实际编程和面试中的算法应用能力。 首先,从提供的...

    算法导论读书笔记(整理别人的)

    搜索算法包括线性搜索和二分搜索,其中二分搜索在有序数组中的效率更高。 3. **图算法**:图是一种强大的抽象数据类型,用于表示对象之间的关系。深度优先搜索(DFS)和广度优先搜索(BFS)是图的基础算法,此外还有...

    算法导论Lecture 3:分治法

    6. 学术研究和算法开发往往需要跨学科合作和讨论,创新点和改进往往来源于不同观点的碰撞和灵感的交流。 通过以上内容,我们可以得出,分治法是一种强大的算法设计范式,适用于多种计算问题,尤其在解决复杂问题时...

    易语言算法代码

    这些算法是基础,用于整理数据集合,使其按照特定顺序排列。 2. **查找算法**:如线性查找、二分查找、哈希查找。这些算法用于在数据集中快速定位目标元素。 3. **图论算法**:如深度优先搜索(DFS)、广度优先...

    计算机自考算法设计复习资料.doc

    以下是根据提供的文件内容整理的算法设计相关知识点: 1. **算法的时间复杂度**:算法的时间复杂度是对算法执行时间与输入规模之间的关系的度量。例如,n+n*log10n2 表示的时间复杂度是 Θ(n*log n2),其中 Θ 表示...

    基于改进蚁群算法的机器人路径规划算法.pdf

    通过对上述知识点的整理和扩展,可以看出改进蚁群算法在机器人路径规划领域的应用前景非常广阔。通过理论的创新和算法的优化,可以进一步提高机器人的自主导航能力和环境适应性,使其在复杂的现实世界中更加实用和...

    算法竞赛宝典第三部资源包

    这个资源包中集成了作者精心整理的各种算法实现和测试数据,旨在帮助学习者深入理解和运用算法。 一、C++语言基础 C++是算法竞赛常用的编程语言,以其高效和灵活性著称。掌握C++的基础语法,包括变量、数据类型、...

    ACM 经典算法代码库(ACM 北大)

    这份代码库由北京大学的团队整理,具有极高的权威性和实用性。 在ACM竞赛中,参赛者需要解决一系列复杂的问题,这些问题通常涉及各种算法,包括但不限于: 1. **排序与搜索**:快速排序、归并排序、二分查找、哈希...

    js算法实现

    - 插入排序:将每个元素插入到已排序部分的正确位置,类似手动整理扑克牌。 - 选择排序:每一轮找到未排序部分的最小(或最大)元素,放到已排序部分的末尾。 - 快速排序:利用分治策略,选取一个基准值,将数组...

    收集整理的Android安卓游戏源代码游戏合集(100例).zip

    1. 动作游戏:这类游戏可能涉及物理模拟、碰撞检测和敌人AI算法。 2. 益智游戏:可能涉及到逻辑推理、路径规划或者解谜元素。 3. 模拟游戏:可能包含复杂的系统模拟,如经济模型、人物行为等。 4. 卡牌游戏:涉及...

    JAVA近百种算法大全.zip

    这些排序算法用于对数据进行有效整理,提高查询效率,例如在数据库索引、数据分析等领域。 2. 搜索算法:如二分查找、深度优先搜索(DFS)、广度优先搜索(BFS)等。在解决寻找特定元素或遍历结构问题时,这些搜索...

    ACM常用算法小组资源

    这个压缩包"ACM常用算法小组资源"显然是为了帮助参赛者准备算法竞赛而整理的一份资料,其中包含了一个名为"ACM常用算法(ACM小组内部预定函数).mht"的文件。MHT是一种单一文件格式,用于存储网页内容,包括HTML代码...

    基于改进PRM算法的多无人机协同航迹规划研究的任务书.docx

    2. **增强作业安全性**:改进后的算法能为多无人机提供更安全的航迹规划方案,减少碰撞风险。 3. **提升无人机的可靠性**:通过优化航迹规划方案,提高无人机在复杂环境下的适应性和可靠性。 #### 五、研究路径 本...

    021_《Delphi算法与数据结构》

    - **图形算法**:比如在游戏开发中,碰撞检测、图形渲染等都涉及特定的算法。 《Delphi算法与数据结构》这本书很可能详细讲解了这些数据结构和算法的原理、实现以及在Delphi编程中的具体应用。书中的文件如...

Global site tag (gtag.js) - Google Analytics