分组(无碰撞),在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