【问题标题】:Pygame float accuracy collision detectPygame浮点精度碰撞检测
【发布时间】:2020-06-07 11:36:32
【问题描述】:

我正在构建一个物理模拟,并想做一个 pygame 可视化。 对于位置和速度计算,我使用Vector2,效果很好。 使用内置的矩形碰撞检测会很有帮助。不幸的是,我必须先将矩形的当前位置四舍五入到一个像素。由于在我的模拟中将 1 个像素设置为 1 米,因此我只能确定 1 米内的物理碰撞。有谁知道我该如何解决这个问题?我唯一的想法是将比例更改为 1 米的 10 像素以获得 10 厘米的精度,但是我只能以 1000 像素显示 100m。也许有人知道一个很好的解决方案!感谢您的帮助!

【问题讨论】:

  • 保持你的变量为浮点数。只转换为像素显示。
  • 我这样做。但我要求进行浮动碰撞检测(可能直接通过 pygame)
  • @Skywalker pygame 中没有“浮动碰撞检测”。你必须自己实现它。

标签: python pygame simulation


【解决方案1】:

如果您的代码用于解决模拟问题,则应将模拟与可视化分开。因为现在您正在经历一个事实,即由于可视化问题,您必须限制模拟。不应该是这样的。

我的建议是使用 numpy 和 scipy 的组合在没有 pygame 的情况下运行您的模拟(甚至是来自 pygame 的 Vector2 或 Rect)。如果您需要在模拟中检测碰撞,您可以非常快速地自己实现矩形碰撞:

class Rectangle(object):
    def __init__(self, left, bottom, width, height):
        self.left = left
        self.bottom = bottom
        self.width = width
        self.height = height

    @property
    def right(self):
        return self.left + self.width

    @property
    def top(self):
        return self.bottom + self.height

    def collide_with_rectangle(self, other):
        if self.left > other.right or self.right < other.left or self.bottom > other.top or self.top < other.top:
            return False
        return True

这种方法的优点是,您可以将可视化与模拟逻辑分开。例如,如果您发现 pygame 不符合您的需求,您可以非常轻松地切换到 matplotlib 或任何其他框架。

分离模拟逻辑后,您可以轻松扩展可视化。因为您从模拟中获取所有点并乘以可视化/缩放因子。

【讨论】:

  • 感谢您的回答和不使用可视化模块进行计算的建议。谢谢你的例子(我发现了一个小错误,最后一个比较必须是“other.bottom”)。不过我有矩形的标题。因此,不幸的是,这个解决方案并不能解决问题,并且可以开箱即用的模块会很好。如果有人知道一个实现,我会很高兴。否则我会尝试通过向量来解决它,但我担心不完美的实现会导致性能问题
  • 似乎“分离轴定理”可能是解决方案......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多