如何在 pymunk 中制作 L-shaped body?

How to make a L-shaped body in pymunk?

我是 pymunk 的新手,我想制作一个 L-shaped body like this.

我读到可以将两个形状附加到同一个 body 但 the best I got is this.

我使用的代码是这样的:

import pymunk
import pygame
import pymunk.pygame_util


pygame.init()
size = 640, 240
screen = pygame.display.set_mode(size)
draw_options = pymunk.pygame_util.DrawOptions(screen)
space = pymunk.Space()
space.gravity = 0, 90

b0 = space.static_body
segment = pymunk.Segment(b0, (0, 200), (640, 200), 4)
segment.elasticity = 1

body = pymunk.Body(mass=1, moment=10)
body.position = 300, 50

box = pymunk.Poly.create_box(body, (100, 50))
box.elasticity = 0.9
box.friction = 0.8

box2 = pymunk.Poly.create_box(body, (50, 100))

space.add(body, box, box2, segment)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    screen.fill(color="GRAY")
    space.debug_draw(draw_options)
    pygame.display.update()
    space.step(0.01)


pygame.quit()

有什么方法可以制作 L-shaped body 吗?

提前致谢!

问题在于,使用 shorthand create_box 方法创建的两个多边形形状的中心位于它们所附加的 body 的位置。所以这两个盒子放在彼此的顶部。

要解决此问题,您需要使用更通用的 Poly 构造函数。这样你就可以随意选择位置了。

如果我只拍你的照片然后把坐标乘以 10,它会是这样的:

box = pymunk.Poly(body, [(0, 0), (60, 0), (60, 30), (0, 30)])
box.elasticity = 0.9
box.friction = 0.8

box2 = pymunk.Poly(body, [(0, 30), (30, 30), (30, 60), (0, 60)])
box2.elasticity = 0.9
box2.friction = 0.8

但是请注意,坐标是相对于它们所依附的 body 而言的,重心是 body 所在的位置。这意味着由此产生的 L 形将表现得好像它是一个空心形状,在一个角上有一块超重的石头。

如果这不是你想要的可以调整坐标,例如像这样(我只是从每个坐标中减去 30。这可能会根据你的目标进行更多调整):

box = pymunk.Poly(body, [(-30, -30), (30, -30), (30, 0), (-30, 0)])
box.elasticity = 0.9
box.friction = 0.8

box2 = pymunk.Poly(body, [(-30, 0), (0, 0), (0, 30), (-30, 30)])
box2.elasticity = 0.9
box2.friction = 0.8

这是最容易理解的方式(至少我是这么认为的),但还有其他两种选择。您可以改为将 translate pymunk.Transform 作为 Poly 构造函数的选项,其缺点是结果不太明显。或者你可以用 center_of_gravity 属性 移动 body 上的重心,缺点是当你看 body 的位置时它仍然会在形状的“角”。