有人可以解释每像素碰撞检测吗?

时间:2008-10-06 04:24:53

标签: collision-detection

有人可以解释它的优点和缺点以及涉及它的任何数学吗?

7 个答案:

答案 0 :(得分:11)

对于2D: 你不需要任何数学解决这个问题,你只需要一个自定义的bitblit例程。通过将碰撞掩模绘制到此曲面上并检查是否要绘制的像素(像素!= 0),您可以将碰撞候选者插入隐藏曲面。那你就会发生碰撞。当然,如果发生碰撞,你应该通过边界矩形预先检查。

对于3D: 你需要数学(很多)!

基本上你会检查你的演员的每个表面对着敌人的每个表面。 这将通过计算平面光线交点来完成。这里有很多可能的优化,但它取决于你的3d表示。 这也不是Per-Pixel-Collision,而是Per-Vertex-Collision

答案 1 :(得分:6)

我将首先回答每像素碰撞检测的优缺点,然后再考虑数学方面。

每像素碰撞检测,也称为像素完美碰撞检测,可能更精确地基于图像的碰撞检测,是在表示为图像的碰撞对象之间发现碰撞。这种空间方法与更多几何方法形成对比,其中多边形和其他几何形状用于表示碰撞对象。

对于2D,通常有3种不同的选项:

  • 基于图像的
  • 简单的几何形状(轴对齐的边界框,圆圈)
  • 复杂的几何形状(凸多边形,褶皱多边形,椭圆等)

基于图像的碰撞检测精确且易于使用和理解。关于使用图像进行绘制的游戏,使用基于图像的碰撞检测意味着每当屏幕上的精灵重叠时,它们也在碰撞检测系统中重叠。它们对于需要可变形碰撞对象的游戏也很有用,例如对于可破坏地形的游戏,例如Worms 2D,因为通常很少涉及预计算。它们的主要缺点是与其他方法相比效率非常低,特别是在旋转和缩放碰撞对象时。

简单的几何形状既简单易用又高效。如果不需要高精度,或者碰撞对象与简单的几何形状很好地配合(例如,如果你的碰撞物体是球,圆圈是完美的,有时甚至比图像更好)。它们的主要缺点是精度。对于基本形状不适合的高精度,您必须将简单形状组合成更复杂的形状,或者必须使用更通用和复杂的形状。在任何一种情况下,你最终都会采用第三种方法。

复杂的几何形状可以在某种程度上精确且相对有效或低效,这取决于用于表示碰撞对象的所使用形状的复杂性。一个重要的缺点是易于使用。当碰撞对象不适合可用的几何形状时,精度将不得不受到影响,或者必须使用多个可能不同的形状来表示它,这需要时间。此外,某些形状很复杂且不易创建,除非您可以自动从图像生成它们。一个重要的优点是旋转和缩放通常是高效和简单的,特别是与基于图像的碰撞检测相比。

基于图像的碰撞检测通常被视为一种不好的解决方案,因为它经常效率低下,尤其是在使用旋转和缩放时。但是,由于它非常灵活,精确且易于使用,因此我决定实施一个旨在解决效率问题的库。结果是PoxelColl,它使用自动预先计算的凸包来加速基于图像的碰撞检测。这提供了易用性,灵活性,精确性和效率,并支持旋转和缩放。主要的缺点是,与纯几何解决方案相比,它在所有情况下都不是有效的,并且它需要使用预计算,这意味着它对于可变形碰撞对象来说效率非常低。

对于3D,选项和优势有些相似:

  • 音量基于
  • 简单的几何形状(轴对齐的边界框,圆圈)
  • 复杂的几何形状(凸多边形,褶皱多边形,椭圆等)

值得注意的是,彼得帕克对3D的回答是错误的; 2D中的像素(图像元素)对应于3D中的体素(体积元素)。

一些重要的区别是空间方法对于3D来说比在2D中要少得多。一个可能的原因是,由于3D增加了额外的维度,空间解决方案变得效率更低,而简单的几何解决方案仍然有效。在游戏中,碰撞检测通常是在线操作,需要一定程度的效率,使效率变得重要。因此,在非游戏应用程序中更常使用卷,其中不需要在线确定冲突。

有关基于音量的碰撞检测的碰撞检测示例,请参见例如Volumetric collision detection for deformable objects,其中使用体积而不是几何形状意味着它们可以处理具有任意形状的闭合曲面的可变形碰撞对象。

至于第二个问题,基于图像的碰撞所涉及的数学可以从简单到复杂。简单的情况基本上是使用轴对齐的边界框来查找图像,找到它们的交点,然后只检查交叉点中的图像。更复杂的解决方案包括我之前提到的库,其中需要凸多边形交叉。对于3D案例,解决方案从简单到非常复杂。

答案 2 :(得分:2)

它比顶点(或命中框等)更准确。我假设你在这里谈论2d(3d将是box-model vs vertex)。每个像素可以让你有更详细的精灵,小东西(比如说导弹)会更真实地碰撞。

它比传统方法更加数学和慢,这可能是画一个盒子(或其他一些容易的数学形状像圆圈)并说'这是演员,这里的任何东西都是他'。但是,它更准确。

答案 3 :(得分:2)

在谈论利弊时,你还必须考虑碰撞反应。检测到碰撞时你想做什么?如果您正在检测到一个物体撞击另一个物体,其中一个或两个物体被破坏,那么每个像素的碰撞检测就很好而且准确。如果你想让对象以某种其他方式作出反应,即滑动墙壁,弹跳等......那么你可能想要使用某种类型的边界矩形/圆形/椭圆形,这将使碰撞响应看起来更平滑更多一致,卡住的可能性较小。

答案 4 :(得分:0)

专业人士已经提到:它的像素完美和公平,没有误报,也没有漏报。主要的缺点是计算起来很昂贵,但如果你先做一个简单的边界框检查,这应该不是一个大问题。在OpenGL和DirectX时代还有一个问题:精灵数据通常是纹理,这意味着它们在VRAM中,你无法轻易地自己检查像素值。在OpenGL中您可以使用glReadPixels函数将两个精灵的相交部分返回到RAM并检查碰撞,或者您可以使用occlusion query。遮挡查询方法应该具有更好的性能,因为您不是从GPU移回数据,但是在任何地方都不支持遮挡查询(即,在OpenGL ES中不支持它们,如果我错了,有人请纠正我。)

答案 5 :(得分:0)

了解OpenGL和纹理案例:您可以预先计算图像的位矩阵,并测试两个像素是否重叠。

答案 6 :(得分:0)