分组(无碰撞),在 pymunk 中添加和删除多个物体和多边形?

Grouping (without collision), adding and removing multiple bodies and polygons in pymunk?

我正在使用 pymunk index_video 中的代码来创建一个通用函数,该函数创建多辆相互比赛的汽车,如果它们到达屏幕的最右边,它们就会从 Space 并在屏幕的左端重新生成。

问题是,在示例代码中,汽车的每个部分(底盘、销接头、电机、车轮)分别添加到 Space。我想将整辆车视为一个整体,我可以通过将整个车身的引用存储在列表中来跟踪其坐标,并轻松地将其添加或删除到 Space。

此外,如果车轮离底盘太近,它们会相互碰撞。我认为使用 ShapeFilter 可以帮助避免此类碰撞,但为此我需要将汽车的所有部分作为一个整体。

请多多包涵。我对这个行话完全陌生。

def car(space):
    pos = Vec2d(100,200)

    wheel_color = 52,219,119
    shovel_color = 219,119,52
    mass = 100
    radius = 25
    moment = pymunk.moment_for_circle(mass, 20, radius)
    wheel1_b = pymunk.Body(mass, moment)
    wheel1_s = pymunk.Circle(wheel1_b, radius)
    wheel1_s.friction = 1.5
    wheel1_s.color = wheel_color
    space.add(wheel1_b, wheel1_s)

    mass = 100
    radius = 25
    moment = pymunk.moment_for_circle(mass, 20, radius)
    wheel2_b = pymunk.Body(mass, moment)
    wheel2_s = pymunk.Circle(wheel2_b, radius)
    wheel2_s.friction = 1.5
    wheel2_s.color = wheel_color
    space.add(wheel2_b, wheel2_s)

    mass = 100
    size = (50,30)
    moment = pymunk.moment_for_box(mass, size)
    chassi_b = pymunk.Body(mass, moment)
    chassi_s = pymunk.Poly.create_box(chassi_b, size)
    space.add(chassi_b, chassi_s)

    vs = [(0,0),(25,45),(0,45)]
    shovel_s = pymunk.Poly(chassi_b, vs, transform = pymunk.Transform(tx=85))
    shovel_s.friction = 0.5
    shovel_s.color = shovel_color
    space.add(shovel_s)

    wheel1_b.position = pos - (55,0)
    wheel2_b.position = pos + (55,0)
    chassi_b.position = pos + (0,-25)

    space.add(
        pymunk.PinJoint(wheel1_b, chassi_b, (0,0), (-25,-15)),
        pymunk.PinJoint(wheel1_b, chassi_b, (0,0), (-25, 15)),
        pymunk.PinJoint(wheel2_b, chassi_b, (0,0), (25,-15)),
        pymunk.PinJoint(wheel2_b, chassi_b, (0,0), (25, 15))
        )

    speed = 4
    space.add(
        pymunk.SimpleMotor(wheel1_b, chassi_b, speed),
        pymunk.SimpleMotor(wheel2_b, chassi_b, speed)
)

所以这道题其实是两道题

一个。如何制作一个由多个部分组成的"car object"

没有对此的内置支持,您自己跟踪它。

一种方法是创建一辆包含汽车所有零件的汽车 class。大概是这样的(不是完整代码,需要填写全车)

class Car():
    def __init__(self, pos):
        self.wheel_body = pymunk.Body()
        self.wheel_shape = pymunk.Circle()
        self.chassi_body = pymunk.Body()
        self.chassi_shape = pymunk.Poly()
        self.motor = pymunk.SimpleMotor(wheel_body, chassi_body, 0)

    def add_to_space(self, space)
        space.add(self.wheel_body, self.wheel_shape, self.chassi_body, self.chassi_shape, self.motor)

    def set_speed(self, speed)
        self.motor.rate = speed

    def car_position(self)
        return self.chassi_body.position

乙。如何让汽车的零件不相互碰撞

这非常简单,正如您已经发现 ShapeFilter 是必经之路。对于每个 "car",创建一个 ShapeFilter 并在其上设置一个唯一的非零组。然后在构成汽车的每个形状上将该 ShapeFilter 设置为过滤器 属性。形状是否属于同一个物体并不重要,任何带有组集的 ShapeFilter 的形状都不会与具有相同组集的其他形状发生碰撞。