【问题标题】:How to apply pixel perfect collision to rotated sprites?如何将像素完美碰撞应用于旋转的精灵?
【发布时间】:2015-07-23 17:41:11
【问题描述】:

我不知道如何处理或解决这个问题。我看过一些教程,但它们适用于已经知道自己在做什么的程序员。我观看了一段关于如何执行适用于常规边界框的像素碰撞形式的视频,如果边界框发生碰撞,它会检查两个相交框中的任何非透明像素是否重叠。如果他们这样做,那么布尔值将返回一个真值。我在哪里以及如何开始在旋转对象中实现边界框轴的更改以补充纹理的外观?我不喜欢被指向外部教程,因为我读过的大多数教程都假设程序员知道作者所说的一切。

我还查看了一些完美地展示了我正在寻找的源代码,但似乎我还需要一个非常深入的解释才能使用阅读代码。

【问题讨论】:

  • 您确定您真的需要像素完美碰撞检测吗?您玩过的几乎所有游戏都使用简单的边界形状。它更易于实施并提供更好的性能。
  • 我不需要像素完美碰撞,但我的理解是它是最准确的?我还没有详细了解如何进行其他类型的 2d 碰撞,但我观看的视频中像素碰撞背后的概念似乎很简单,我直接将其放入我的游戏中。我主要关心的是让碰撞看起来很真实并且不会碰到任何透明像素,在这种情况下它可以解决任何不旋转的精灵。
  • 通常放置紧密的边界形状就足够了。大多数玩家甚至不会注意到差异。您可以使用圆形、矩形或多边形,甚至可以将它们组合成其他更复杂的形状。查看代码和网络物理编辑器,了解其工作原理
  • 这在 XNA 论坛中出现了很多。 pixel perfect collisionper-pixel collision 这个名字似乎向新开发人员暗示了他们必须做的事情是有一个半-体面的游戏,实际上边界框绰绰有余,正如其他人在上面提到的那样。 BB 速度要快得多,如果您确实需要更高的精度,请使用嵌套边界框。

标签: c# xna collision-detection


【解决方案1】:

首先,我真的不建议这样做,因为这将是计算密集型或资源密集型(或两者兼而有之)。

也就是说,一个想法是仍然使用您前面提到的AABB 逐像素直升方法。这要求您在内存中维护您自己的像素数据,仅用于碰撞,而不是严格依赖纹理数据。

更具体地说,使用此方法,您必须生成本质上是“图像”或某种二维矩阵,它表示/跟随旋转图像的像素。但是您不会像使用普通图像那样在其中存储颜色信息。相反,结构中的每个“像素”或条目都应是碰撞数据:“块”或“非块”。您可以轻松地使用bitmask 来表示这一点,其中 1 表示“块”,0 表示“不块”,并且每个像素需要一位。 (注意:通常你不需要的不仅仅是一个布尔值“on”和“off”,但你可能希望每个像素有不同类型的碰撞;如果是这样,位掩码将不起作用,而是编码任何你需要每个像素,不管整体思路保持不变)

为您的精灵生成一个位掩码(或其他类似结构)将使您能够只使用 AABB 方法;您所要做的就是直接使用生成的位掩码而不是纹理数据,其他一切都与以前相同。但是我们如何生成这个?这就是这种方法的真正困难,因为您生成自己的图像基本上是在复制图形卡的工作,当您告诉它进行旋转时。

您基本上可以自己“绘制”出旋转后的图像。这可以通过逐个像素地遍历您的基础纹理图像数据,并对每个像素应用旋转transformation matrix 以使其到达位掩码/缓冲区中的正确目标来完成。一旦你有了正确的目的地,你就可以测试图像数据的“块”或“不块”(使用你提到的透明度)并相应地在那里写一个 1 或 0。

在生成时,您还应该跟踪局部最小值和最大值;也就是说,旋转图像向左、向右、向上和向下移动多远,只是为了给它一个真正真正的 AABB 以供快速检查(即“我什至需要检查每个像素的碰撞吗?”)

为了完全准确,您可能需要知道您正在使用哪种插值/舍入算法(双线性、最近邻等),这可能会变得很难看。图形系统经常做非常复杂的事情,所以仅仅为了碰撞就考虑到所有这些是非常极端的。归根结底,即使应用这种方法,它也可能不是真正的“像素完美”,就“与渲染图像输出完美同步”而言,除非你真的在复制完全什么方面做得很远XNA / DirectX 正在做。

最后,这一代何时发生?答案是每次旋转!否则,您将检查过时的数据。显然,您可以只为每个精灵保留一个缓冲区并不断更改它,以免占用太多内存。但这确实意味着如果您一直在旋转,则可能每帧一次。如果多个精灵都旋转很多,这意味着每帧多次。可能不是对计算最友好的。

【讨论】:

    猜你喜欢
    • 2013-03-29
    • 1970-01-01
    • 2014-04-02
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多