问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

从切割线定理到游戏开发:几何学在碰撞检测中的应用

创作时间:
作者:
@小白创作中心

从切割线定理到游戏开发:几何学在碰撞检测中的应用

引用
CSDN
9
来源
1.
https://blog.csdn.net/weixin_42186870/article/details/136147295
2.
https://blog.csdn.net/gghhb12/article/details/136270389
3.
https://blog.csdn.net/gitblog_09734/article/details/143295673
4.
https://cloud.baidu.com/article/3370006
5.
https://blog.csdn.net/weixin_44462760/article/details/139260416
6.
https://developer.mozilla.org/zh-CN/docs/Games/Techniques/3D_collision_detection
7.
http://www.lubanyouke.com/39082.html
8.
https://www.cnblogs.com/apachecn/p/18448038
9.
https://see.fandom.com/zh/wiki/%E3%80%90%E5%88%9D%E4%B8%AD%E6%95%B0%E5%AD%A6%E3%80%91%E9%AB%98%E5%88%86%E6%94%BB%E7%95%A5%EF%BC%9A%E8%A7%A3%E9%A2%98%E6%8A%80%E5%B7%A7%E5%A4%A7%E6%8F%AD%E7%A7%98?variant=zh

在现代游戏中,物理效果是游戏必不可少的表现效果和玩法逻辑之一。其主要由游戏引擎的物理系统提供逻辑实现。比如仿真物理行为、碰撞检测、刚体动力学、软体动力学、破坏效果、物理效果渲染等。作为一个割草游戏,主要的玩法就是,主要的逻辑就是发射子弹攻击敌人。那么最关键的逻辑就是如何判断子弹能攻击到敌人,即碰撞检测

现如今的游戏引擎都提供了非常便捷使用的物理系统,我们拿Cocos来举例。我们可以使用Cocos提供的物理碰撞系统,即使用Collider来做子弹和敌人的碰撞判断。的确可以实现怪物和子弹直接的碰撞检测。但是有个非常严重的问题:当场景出现大量碰撞体的时候,很卡!

下面是2022.11.30号测试的数据记录,Cocos版本3.6.3,微信小游戏环境,测试机型:iPhoneX。只保留怪物的碰撞检测逻辑(既判定两个obj相撞),不做任何碰撞后的逻辑处理,测试结果如下:

300个怪物的FPS
600个怪物的FPS
Box2D(BoxCollider)(有刚体系统)
真机1FPS
真机1FPS
Builtin2D(BoxCollider)(无刚体系统)
真机19-21FPS
真机1-4FPS
Builtin2D(CircleCollider)(无刚体系统)
真机17-23FPS
真机7-5FPS

可以看到,在场景中出现大量怪物的情况下,帧率非常低,几乎没法流畅地体验游戏。这可以说是游戏引擎物理系统的通病。虽然物理系统使用很方便快捷,模拟的物理效果也非常精准,但是它非常耗。游戏引擎物理系统完全hold不住大量的碰撞体计算。

那如何做优化呢?既然引擎现成的碰撞检测不太行,那就得我们自己造轮子了。轮子怎么造,且让我们一步一步分析。

碰撞检测

我们先引入一个场景:
如果现在屏幕中有1个敌人和1个子弹,敌人和子弹行动轨迹随机,已知敌人和子弹的大小、坐标,如何判断在某一刻子弹是否击中敌人呢?
换种形式表述,即如何判断子弹的形状和敌人的形状是否相交?
要计算相交,首先要知道两个物体的形状。
对于游戏开发来说,碰撞形状一般分为三种:

  1. 长方形(Box)
  2. 多边形(Polygon)
  3. 圆形(Circle)

那么我们如何计算这些形状是否相交呢?这里我们分别来讨论一下:

长方形碰撞:

AABB(Axis Aligned Bounding Box)和OBB(Oriented Bounding Box)
AABB碰撞盒使用与坐标轴平行的外接矩形来分析两个物体之间的碰撞关系,只需要比较两个矩形的上下、左右边的大小即可,计算量小。但是忽略了物体的旋转,这样会导致碰撞区域不太准确,适合进行粗略的碰撞检测。
与AABB碰撞盒相比OBB碰撞盒将旋转考虑进来,碰撞区域更加精准,适合精细的碰撞检测,但是也因此涉及到大量的三角函数运算,增加了计算复杂度。

多边形碰撞:

SAT(Separating Axis Theorem 分离轴定理)
如果两个物体不发生碰撞,则一定存在一条直线,能将两个物体分离。这条能够隔开两个物体的线称为分离轴
可以假想有一束平行光从不同的角度照射待检测的两个多边形,当有一个合适的角度使得两者的影子没有重叠,那么分离轴就找到了。
对于计算来说,我们只需要依次在多边形的每个边做投影即可。
本质上OBB碰撞盒就是这个算法的四边形情况。

圆形碰撞:

计算外接圆
多边形外接圆圆心距离与两者的半径和作比较即可。
通过上面的三种计算方式对比可以看出,圆形和圆形判断相交是计算量最小的,只需要做一次**(R1+R2)^2 >= (X1-X2)^2 + (Y1-Y2)^2**的运算即可。
对于性能吃紧的微信小游戏来说,圆形的碰撞就已经足够用了。于是上面问题的答案可以简化为:

// 是否发生碰撞
public checkCollision(obj1, obj2): boolean
{
    return (obj1.r + obj2.r) * (obj1.r + obj2.r) >= (obj1.x - obj2.x) * (obj1.x - obj2.x) + (obj1.y - obj2.y) * (obj1.y - obj2.y);
}

场景管理(空间加速技术)

现在我们再进一步,如果现在屏幕中有10个敌人,和1个子弹在,如何判断哪些敌人被子弹击中了呢?
那让子弹对每个敌人做一次碰撞检测不就完事了吗?
最简单最容易想到的做法就是用一个数组缓存起来然后遍历:

// 数组遍历
for(let i = 0; i < enemys.length; i++)
{
    checkCollision(bullet, enemys[i]); // 碰撞检测
}

ok,这个没问题。
那我们再进一步,如果现在屏幕中有300个敌人和300个子弹,如何判断哪些敌人被子弹击中了呢?
还是让每个子弹对每个敌人做一次碰撞检测吗?
如果仍然使用数组存储,并且遍历,那么开销会非常大:

// 数组遍历
for(let i = 0; i < bullets.length; i++)
{
    for(let j = 0; j < enemys.length; j++)    
    {
         checkCollision(bullets[i], enemys[j]); // 碰撞检测
    }
}

如何减少遍历的次数呢?
试想一下,对于屏幕边上的子弹,可以明显看出不可能与中间的敌人发生碰撞。
如果我们能提前知道这个信息,那么屏幕边上的子弹遍历的时候是不是就可以不与中间的敌人做碰撞检测了?

01

几何学在游戏开发中的应用

从上面的分析可以看出,几何学在游戏开发中扮演着至关重要的角色。无论是简单的碰撞检测,还是复杂的物理模拟,都离不开几何学原理的支持。游戏开发者需要熟练掌握各种几何算法,才能开发出高性能、高精度的游戏。

02

切割线定理与游戏开发

虽然切割线定理在游戏开发中可能没有直接的应用,但它所蕴含的几何思维对游戏开发者来说是非常有价值的。切割线定理揭示了圆的切割线和弦之间存在的比例关系,为我们理解圆的几何性质提供了重要的理论基础。

切割线定理的证明过程如下:

  1. 连接 BE 和 CD:在圆内形成两个三角形:△ABE 和 △ACD。
  2. 证明相似性:由于∠ABE 和 ∠ACD 都是圆周角,且它们所对的弧相等,因此∠ABE = ∠ACD。同样地,∠AEB 和 ∠ADC 都是圆周角,且它们所对的弧相等,因此∠AEB = ∠ADC。因此,根据 AA 判定定理,△ABE ∽ △ACD。
  3. 利用相似三角形的比例关系:由于△ABE ∽ △ACD,因此有 AB/AC = AE/AD,即 AB · AD = AC · AE。
  4. 结论:我们证明了 AB · AC = AD · AE,即切割线定理成立。

切割线定理在几何学和实际应用中有着广泛的应用。例如,在工程设计中,切割线定理可以用来计算圆形结构的尺寸,例如桥梁的圆形拱顶等。在实际测量中,切割线定理可以用来测量无法直接测量长度的线段,例如测量河流的宽度等。此外,切割线定理还可以用来解决一些几何问题,例如求解圆的半径或求解圆周角等。

与切割线定理密切相关的另一个定理是割线定理。割线定理指出:从圆外一点引出的割线,其长度与它在圆上所截出的线段的长度之间也存在特定比例关系。更具体地说,如果割线与圆交于 A 和 B 两点,则有:
OA · OB = OC · OD
其中,O 为圆心,C、D 为割线与圆的交点。割线定理的证明过程与切割线定理类似,同样利用相似三角形和圆周角的性质。

割线定理与切割线定理共同构成了圆的几何学的重要组成部分,为我们理解和解决与圆相关的各种问题提供了基础。它们在几何学、工程设计、实际测量等各个领域都有着广泛的应用。

通过学习切割线定理,游戏开发者可以更好地理解圆的几何性质,从而在开发中做出更优的算法选择。例如,在处理圆形碰撞检测时,可以利用圆的几何性质来优化计算效率;在设计游戏关卡时,可以运用几何原理来创建更合理的场景布局。

总之,虽然切割线定理在游戏开发中可能没有直接的应用,但它所蕴含的几何思维对游戏开发者来说是非常有价值的。通过深入理解几何学原理,开发者可以更好地解决游戏开发中遇到的各种问题,创造出更优秀的作品。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号