java - 如何插入多个高速多边形碰撞(2D)?

标签 java collision-detection interpolation

上下文

我需要在物理模拟中检测高速物体的碰撞。由于从网格中截断数字和对象的数字表示,快速移动的对象很可能会相互穿过或错过。我试图通过模拟“模拟”或现实生活中物体穿过每个点的运动的属性来执行插值碰撞。 (现实世界中的物体通常不会在宏观层面传送到下一个点)

研究和前瞻性
我们能够找到投影对象的最终点和初始点,以及时间和速度的位移。我正在使用每像素碰撞来获取像素图,因此我们有一个像素簇。目前我解决这个问题的方法是使用牛顿法来计算线性交点。

问题 :如何像计算“单个像素”或“正常”线那样计算像素簇的交集。

奖励 :非线性运动(带有加速度的速度)或计算插值内的多次碰撞(其中弹性碰撞会使碰撞对象中的一个与另一个本来会靠近但丢失的其他对象发生碰撞)呢? ,初始碰撞。这一切都最好在插值计算中。)

最佳答案

好吧,一年后没有答案,所以我想我会尽量用我自己的知识来回答我自己的问题。

似乎很多游戏并不关心这种特殊情况,不幸的是,这种情况可以经常观察到。游戏中的许多高速物体有时会因为缺乏捕捉它的机制而进入墙壁或穿过墙壁。实现一些东西来捕获高速对象需要 插值 演算, 这将不可避免地导致游戏 更高的开销。

增加开销的概念在这里很清楚,如果你真的想要最准确的物理模拟,你将引入越来越多的计算,这对于游戏来说会有效地使保持流畅播放变得越来越困难模拟 ,尤其是当需要检查的对象数量较多时。例如,比较完美的 Per Pixel Intersection 和不太完美的 Axis Aligned Bounding Box Intersection 的性能开销。如果你有一场乒乓球或雅达利风格的突破,AABB 将是可以接受的,唯一的问题是球正好在角落里击中另一个矩形。同时,没有足够多的对象让每像素交集也很糟糕(特别是如果你只考虑球与其他对象的交集)。

当处理游戏中的复杂交叉点时,作弊和使用近似值来掩盖乏味的物理计算是关键。以我们之前的每像素交集为例,这次使用类似马里奥游戏的东西。我们不能仅仅针对 mario 找出交叉点,因为他还可以 throw 需要碰撞检测的火球,或者与其他敌人互动的敌人。在这种情况下,您可以使用类似 Quad Tree 的东西,它不断将更多的碰撞细化到包含预定对象碰撞密度的碰撞区域中。现在重新考虑我们的乒乓球示例,例如在混合中再添加 4 个球。一个真正狡猾的程序员可以首先使用四叉树将交叉点放入区域,然后在确定与每像素交叉点的确切碰撞(如果形状被标记为复杂)之前与 AABB 执行初步交叉。

Minkowski Portal Refinement 或者它的表亲 GJK distance algorithm 这样的算法,它给你凸集之间的最短距离,可能是我能给出的最接近的答案作为解决方案。我个人对这些算法没有太多经验,但这是我能推荐的最好的答案。这些算法非常先进,绝对超出了初级到中级程序员的范围。

关于子弹碰撞的附加说明

现在,如果你来这里是因为你想玩射击游戏,我还有一颗 gem 要送给你。我不建议实际制作子弹“可碰撞”的物体(可能是移动速度较慢的导弹)。相反,您可以保持 Guzzle 闪光,但将视觉子弹变成效果。现在要计算子弹是否击中,您可以使用从 Guzzle 延伸的对齐锥体进行计算。锥体半径从尖端到无限底部的变化可以根据精度统计确定为常数,也可以根据连续射击进行扩展。然后你考虑到有多少所需对象被圆锥体相交并乘以关于子弹是否被击中的 RNG 概率的百分比。因此,我们将子弹交互简化为锥体与物体的碰撞,并将其余部分留给随机数生成。因此,获得精确物理模拟的错觉。 想象一下现在实现一个迷你枪是多么容易,在我们基于非 RNG 的示例中,它必须吐出的所有子弹都会造成大量延迟。

关于java - 如何插入多个高速多边形碰撞(2D)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28265431/

相关文章:

java - 处理语言、java程序中识别字符串的堆栈

java - 如何将这些类注入(inject)到我的 Spring Controller 类中?

java - java中如何查找数组中某个对象的类型

python - 图像拟合和插值

java - 如何在Java中理解有界通配符?

unity-game-engine - 2D 项目中的对象不发生碰撞

iphone - 检测是否在 Cocos2d-iphone 上触摸了特定的 Sprite

java - Slick2D 矩形碰撞检测

python - 正确使用 numpy 插值

angular - 是否可以在 InnerHTML 中进行插值