当我调用 SPACE.step(1/FPS) 时,我所有的身体位置 Vec2D 都变为 NaN

问题描述

我正在开发一个简单的 2D 自顶向下游戏,我开始使用 Pymunk 来处理物理问题。

我创建了一个 GameObject 类,它基本上包含一个 pymunk.Body、一个 pymunk.Shape 和一个 pygame.Surface。

这是代码部分,一切都出错了

player = GameObject([-1,0],[1,1],(46,150,80))
obj = GameObject([1,(255,255,255))

SPACE.add(player.getBody(),player.getShape())
SPACE.add(obj.getBody(),obj.getShape())

while True:
    CLOCK.tick(FPS)
    SPACE.step(1/FPS)

    for event in pygame.event.get():
        eventHandler(event)
    
    player.setPosition([.2,True)
    print(player.getPosition())

好吧,使用 VSCode 调试我看到,在 while True: 的第二次迭代中,在 SPACE.step(1/FPS) 之后,我所有与主体位置相关联的 Vec2d 都变为 NaN。 所以我的 player.getPosition() 返回 Vec2d(NaN,NaN) 并且对象消失(在渲染阶段,因为没有位置渲染它:))。

有人知道为什么 SPACE.step 会破坏一切吗? 谢谢

解决方法

通常发生这种情况是因为一个或多个物体的质量或力矩为 0 或无穷大。例如,如果两个具有无限质量的物体发生碰撞,就会发生一些“奇怪”的事情,例如 NaN 位置。确保您已正确设置质量和力矩。如果需要,还要仔细检查您是否设置了 body_type。