2D碰撞检测


11

假设我正在使用此字符。

鸟
(来源:iconbug.com

您将如何实现碰撞检测?使用边界框似乎不是一个很好的近似值,因为这只鸟的形状远不及正方形。

我正在考虑在对象内部具有一种表示图像部分的四叉树数据结构。每片叶子要么是false(如果它覆盖了鸟类外部的白色/透明空间),要么是true(如果它代表了鸟类的某个区域,例如喙,眼睛等)。然后以某种方式测试场景中与鸟类碰撞的唯一障碍

但是我遇到的问题是:

  1. 我不知道如何初始化四叉树。
  2. 一旦四叉树被初始化,一旦障碍物在图像坐标内,我就不确定如何遍历和使用它。

如何处理非方形字符的冲突检测?

LE:我见过的另一种方法是使用多个边界框。例如,我将为喙提供一个或几个边界框,然后为头发或尾巴添加一些边界框。但这会很乏味。如果对我而言这是一种有效的方法,我将如何生成这些边界框?我怀疑我是否必须在程序中对它们进行硬编码。

LE2:我关心的是相当精确的碰撞。我无法想象单个边界框或圆形如何至少可以像样地近似该形状,因此这种方法行不通。


2
一般说明:我将同时使用边界框和更细化的检查:细化检查将带来更高的性能损失,因此您希望它尽可能少地运行。因此,首先检查边界框,只有在边界框被击中时,再进行更深入的测试,并测试您更细化的方法(无论如何)。
菲利普·阿尔盖尔2014年

谢谢,无论如何我都打算这样做,但是我不完全确定“粒度检查”应该是什么。:)
异步

1
唯一重要的细节丢失了:您想用它做什么?您是否关心确切的碰撞?您乐于用一个圆来近似角色吗?您是否希望尘粒与角色的眼睛分开撞击?
Anko 2014年

@Anko如何用一个圆形近似该形状?我关心的是相当精确的碰撞-并不是真正的像素精确,而是看起来不错/自然的碰撞。
2014年

1
这样。“好”和“自然”甚至意味着什么?这是一个哲学问题吗?
Anko 2014年

Answers:


12

圆对撞机。我要说的足够好,除非您喜欢某些部分受到物理影响或看起来不自然的碰撞影响,并且即使您需要将其拆分成几个部分,我也要对您说一句话:

不要过于复杂。

为此,您不需要完整的四叉树结构。只需将几个盒子或圆形排列成一个直线,然后将它们全部相交即可。这可能对性能没有足够的要求,使用四叉树不会带来太多好处。


3
是的,如果不能覆盖单个形状,则只需将多个形状组成一小阵列。例如:i.imgur.com/Dd4yyGN.png
MichaelHouse

感谢Jonkel和@ Byte56。在我的情况下,使用一些形状似乎是正确的解决方案。实施简单,准确,快速。不敢相信我不考虑这个就直接跳到四叉树!嗯
2014年

一个用于身体的圆形碰撞器,一个用于喙的矩形碰撞器,以提高准确性。
Kroltan 2014年

14

两步检查过程

第一步,选中边界框,如果那里没有碰撞,则测试结束。如果发生碰撞,则移至第二遍

在第二遍中,如果您想要更高的精度,并且想要一个真正的像素完美解决方案,那么您可以做到这一点,即像素完美检查遍

由于您的图片是PNG(或其他任何包含Alpha通道的文件格式),因此这非常容易

  1. 计算场景中该对象与鸟类之间的相交区域,在两个图像上生成一个简单的相交矩形
  2. 在该交点内,检查两个图像中每个像素的alpha值均> 0
  3. 如果存在任何此类像素,就会发生碰撞。否则没有

如果您查看图像的Alpha通道,则可以看到它已经具有像素完美碰撞所需的所有信息

图片中的Alpha通道

像素完美的碰撞通常很昂贵,因此首先使用边界框或更详细的碰撞图(如Anko建议的那样)进行粗略估算可能会节省一些宝贵时间

“更详细的”碰撞边界框Anko建议:

更详细的边界框

PS:如果您的图像周围有光晕,效果或其他非0 alpha通道且您不想与之碰撞,则可以轻松调整算法阈值以适应


1
谢谢!但我根本不需要像素完美的精度。不过,出色的答案将在以后有用。
2014年

当然,队友,是的,像素完美碰撞几乎总是过大的杀伤力,除非在真正需要它的游戏中(例如2D战斗机)
Codemonkey 2014年

3

我会在身体上使用一个圆圈,在喙上使用一个矩形,但这只是我的意见。不过,使碰撞几何图形过于复杂可能会使您的应用程序变慢,实际上,您正在使屏幕上的字符数增加一倍(或更多)。


0

也许您可以使用某种不稳定的多边形/边缘对撞机。

不确定确切如何工作,但是:

两个对象:对象1:鸟(o1),对象2:可能碰到鸟的东西(o2)

1)定义一个边界形状,该边界形状是非常适合所讨论的第一个对象(o1)的多边形。

2)获得o1,o2的边缘,它们可能会发生碰撞而不会发生碰撞,而o2不会穿过 o1,反之亦然。

使用形状(o2)的位置和大小,您可能可以隔离(o1的)难以想象的边缘,无论是因为它们位于(o1)的另一个靠近o2的边缘之后。如果您有一个直角三角形,其斜边朝上且朝右,并且有一个直向靠近该矩形的矩形(其长边沿x轴),则您可以确定要忽略哪些边,因为它们的开始和结束y值均为在矩形上方或下方。

3)确定o2的边缘上的点之一是否与您在步骤2中选择的o1的任何边缘上的点相同。

这个概念可能最适合碰撞多边形(即具有清晰边缘的物体),但是也许您可以将一个圆视为一个长边缘(例如,如果o2是一个圆)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.