碰撞



1. 碰撞检测和响应 prefix = o />



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

2D碰撞检测

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

碰撞检测

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



prefix = v /> lineDrawn pixelLineWidth 0 \">

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





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







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

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



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



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

3D碰撞检测

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



碰撞反应

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

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

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

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

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

个能够容忍碰撞系统

个从概念上可以接受物理系统

质量

速度

摩擦系数

地心引力



Tags: 

延伸阅读

最新评论

发表评论