0

我正在使用 pymunk 来模拟身体移动。因为我希望身体以某种方式移动,所以我在每个时间点都设置它们的位置(我知道这不推荐用于 Chipmunk/Pymunk)。这样做可以为单个物体移动提供良好的结果,但问题是当我这样做时,物体似乎不再能够检测到碰撞,它们只是相互穿过而不是碰撞。我曾尝试使时间步长更小,但这似乎没有帮助。有没有人对我如何解决这个问题有任何提示,或者考虑到我在每个时间点都设置位置,这是不可避免的吗?

谢谢。

编辑显示示例代码:

所以我在每个时间步都设置位置和角度:

body.position = (body.position[0] + speed*cos(body.angle)*dt + (random term), \
                body.position[1] + speed*sin(body.angle)*dt + (random term))
body.angle = body.angle + body.angular_velocity*dt + (random term)

我希望能够做到这一点,因为我有矩形主体,并且此代码允许矩形沿它们的长轴移动,并且它仅适用于一个主体,但是当我有多个主体时,我也希望碰撞起作用,这似乎让他们根本不工作(或者如果他们在工作,他们工作得非常糟糕)。

4

2 回答 2

0

在您的问题中,您已经暗示了您的精灵没有对彼此做出反应的原因(碰撞并在碰撞时相互传递运动)。

这是因为您在每个时间点都设置了它们的位置。

当您设置精灵的位置时,您会立即将其传送到该位置,即使这意味着您的精灵将与另一个精灵重叠或穿过另一个精灵。即使精灵会受到碰撞的影响,它们仍然会在下一个时间点被传送到您预定义的位置。

如果你想让你的精灵在移动时相互反应,你必须使用 pymunk 引擎通过改变对象的速度来移动它们。对象的速度将是一个包含水平和垂直速度的元组。

于 2021-12-22T13:52:00.053 回答
0

所以,如果你设置一个身体的位置,这个身体会立即移动到那个位置,就像你把它传送到那里一样。如果那里已经有其他对象,那么该对象应该在接下来的几个时间步骤中被推开。您还可以获取碰撞数据,例如通过使用碰撞回调,例如在本例中

import pymunk

s = p.Space()
b1 = p.Body(1, 1)
c1 = p.Circle(b1, 10)
b2 = p.Body(1, 1)
c2 = p.Circle(b2, 10)
s.add(b1, c1, b2, c2)

self.hits = 0
def begin(space, arb, data):
    self.hits += h.data["test"]
    return True

h = s.add_collision_handler(0, 0)
h.data["test"] = 1
h.begin = begin

for x in range(10):
    s.step(0.1)

print(self.hits)
于 2018-10-26T11:31:22.043 回答