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

分组(无碰撞),在pymunk中添加和删除多个实体和多边形?,pymunk,Pymunk,我正在使用pymunk中的代码创建一个通用函数,该函数创建多辆相互比赛的汽车,如果它们到达屏幕的右端,它们将从空间中移除,并在屏幕的左端重新生成 问题是,在示例代码中,汽车的每个部分(底盘、销接头、电机、车轮)都分别添加到空间中。我想将整个汽车视为一个单独的车身,通过将整个车身的引用存储在列表中,并轻松地将其添加或删除到空间中,我可以跟踪整个车身的坐标 此外,如果车轮离底盘太近,它们会相互碰撞。我想使用汽车可以帮助避免此类碰撞,但为此,我需要将汽车的所有部件作为一个整体 请容忍我。我对这个行话一

我正在使用pymunk中的代码创建一个通用函数,该函数创建多辆相互比赛的汽车,如果它们到达屏幕的右端,它们将从空间中移除,并在屏幕的左端重新生成

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

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

请容忍我。我对这个行话一无所知

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)
)

所以这个问题实际上是两个问题

A.如何制作由多个部分组成的“汽车对象”

这没有内置的支持,您必须自己跟踪它

一种方法是创建一个包含汽车所有部件的汽车类。类似这样的内容(代码不完整,您需要填写完整的汽车)

B.如何使汽车部件不相互碰撞


这是非常直接的,正如您已经发现ShapeFilter是一种方法。对于每个“汽车”,创建一个ShapeFilter并在其上设置一个唯一的非零组。然后将该ShapeFilter设置为构成汽车的每个形状的filter属性。无论形状是否属于同一实体,任何带有组集ShapeFilter的形状都不会与具有相同组集的其他形状发生碰撞。

非常感谢。建造了它,效果很好。在选择pymunk之前,我评估了许多2D物理库,必须说它是最好的,因为它易于安装和使用。
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