如何在不易分割的多边形实体中检测碰撞 P说,我们在JavaScript中编码一些东西,我们有一个身体,比如一个苹果,并且想要检测一个被扔到岩石上的碰撞:这很容易,因为我们可以简单地把苹果当作一个圆。 但是我们有一个“非常复杂”的分形呢?没有类似的多边形,我们也不能不费很大的力气就把它分成更小的多边形。在这种情况下,有没有什么方法可以检测到完美的碰撞,而不是像将分形视为多边形这样的“类型”工作(不完美,因为即使在空白处也会检测到碰撞)?

如何在不易分割的多边形实体中检测碰撞 P说,我们在JavaScript中编码一些东西,我们有一个身体,比如一个苹果,并且想要检测一个被扔到岩石上的碰撞:这很容易,因为我们可以简单地把苹果当作一个圆。 但是我们有一个“非常复杂”的分形呢?没有类似的多边形,我们也不能不费很大的力气就把它分成更小的多边形。在这种情况下,有没有什么方法可以检测到完美的碰撞,而不是像将分形视为多边形这样的“类型”工作(不完美,因为即使在空白处也会检测到碰撞)?,javascript,collision-detection,Javascript,Collision Detection,如果你有多边形的坐标,你可以使用 这个问题并没有提供太多关于碰撞对象的信息,但通常任何东西都可以精确地表示为多边形 编辑: 它应该足够快以进行实时渲染(取决于多边形的复杂性)。如果多边形很复杂(许多自相交点和/或许多点),有许多方法可以加快相交检测: 使用ClipperLib.JS.lighte()减少点数。它删除对轮廓没有影响的点(例如重复点和边上的点) 使用ClipperLib.JS.BoundsOfPath()或ClipperLib.JS.BoundsOfPath()获取多边形的第一个

如果你有多边形的坐标,你可以使用

这个问题并没有提供太多关于碰撞对象的信息,但通常任何东西都可以精确地表示为多边形

编辑:

它应该足够快以进行实时渲染(取决于多边形的复杂性)。如果多边形很复杂(许多自相交点和/或许多点),有许多方法可以加快相交检测:

  • 使用ClipperLib.JS.lighte()减少点数。它删除对轮廓没有影响的点(例如重复点和边上的点)
  • 使用ClipperLib.JS.BoundsOfPath()或ClipperLib.JS.BoundsOfPath()获取多边形的第一个边界矩形。如果边界矩形未发生碰撞,则无需进行相交操作。这个函数非常快,因为它只得到x和y的最小值/最大值
  • 如果多边形是静态的(即它们的几何体/点数据在动画过程中不会更改),则可以在动画开始之前变亮并获取路径边界,并将多边形添加到裁剪器中。然后,在每一帧中,您只需付出最小的努力即可获得实际的交点
编辑2:

如果你担心FrAGATE,你可以考虑使用一个实验浮点(双)快刀,它比iToPoT版本快4.15X,而在ItPoT版本中需要大整数时,浮点版本比iToPoT版本快了837倍。最终的速度实际上要高一点,因为IntPoint CLIPER需要先将坐标放大(到整数),然后再缩小(到浮点),并且在上述测量中不考虑此缩放时间。然而,浮动版本并没有经过全面测试,在生产环境中应谨慎使用

实验浮点数版本代码:

演示:

游乐场:

编辑3:

如果没有对象的多边形点坐标,并且对象是位图(例如png/canvas),则必须首先跟踪位图,例如使用Marching Squares算法。一项实施是在

在这里,您可以得到一个轮廓点数组,但由于该数组包含大量不需要的点(例如,直线可以很容易地表示为起点和终点),因此可以使用例如ClipperLib.JS.lighte()或减少点计数


完成这些步骤后,位图对象将具有非常轻的多边形表示,可以快速通过相交算法运行。

您可以创建位图,以像素表示对象占用的区域。如果位图之间存在交集,则存在冲突。

您可以使用物理编辑器

它将与大多数游戏引擎一起工作。你必须想办法让它在JS中工作

这里有一个使用typescript的网站教程-与JS相关

你需要这样的东西来表达谢意!你不能把它作为一个答案,这样我就可以投票了吗?但是通过这种方式我不能动态地获得碰撞数据,如果多边形在移动呢?如果有没有碰撞,我需要一帧一帧地听。我在回答中添加了一个编辑,使实时/动态检测逐帧清晰可见。