2

我正在努力按照标题所说的去做。我有一个手持枪的角色,我试图让枪指向光标。我认为 DampedRotarySpring 会是一个不错的方法,但事实证明并不是那么简单。枪是一个具有 Segment 形状的动态体,对于光标,我创建了一个静态体,我在每一步都使用 pygame 将其位置设置为鼠标位置。

当我运行程序时,除了重力或碰撞的影响之外,枪根本不动。

以下是相关代码:

# add crosshairs at the location of the mouse
pointer_body = pymunk.Body()
pointer_shape1 = pymunk.Segment(pointer_body, (0,CROSSHAIRS_SIZE), (0,-CROSSHAIRS_SIZE), 1) # vertical segment
pointer_shape2 = pymunk.Segment(pointer_body, (-CROSSHAIRS_SIZE,0), (CROSSHAIRS_SIZE,0), 1) # horizontal segment

# add a spring that will angle the gun toward the mouse
spring = pymunk.DampedRotarySpring(me.gun.body, pointer_body, 0, 0.01, 1)

space.add(pointer_shape1, pointer_shape2, spring)

while True:
    # handle event queue
    for event in pygame.event.get():
        if event.type == pygame.MOUSEMOTION:
            from math import atan2
            # update location of pointer
            pointer_body.position = flipy(pygame.mouse.get_pos())
            pointer_body.angle = atan2( (pointer_body.position.y - me.gun.body.position.y), (pointer_body.position.x - me.gun.body.position.x) )

编辑:

这是我所有代码的 Gist 存储库:https ://gist.github.com/4470807 。主循环在 ragdoll.py 中。

4

2 回答 2

2

要点中的代码的问题在于,您使用两个关节将枪连接到手上,以使它们保持在相同的位置和相同的旋转。但是,手是胭脂体,不会转动。因此,当它被它和光标之间的弹簧拉动时,枪不会旋转,因为另一个关节更坚固。

我不确定你想要如何设置,但如果你从枪手上移除 RotaryLimitJoint,你会看到一切正常。

查看代码的固定分支以获取确切的详细信息:https ://gist.github.com/4505219

我为找到问题所做的一些未来故障排除提示:

  1. 将所有内容放大 10 倍,以便轻松查看发生了什么。我知道 pymunk 只绘制一种尺寸,但很容易在代码中所有尺寸的末尾添加一个 0。
  2. 让手不动,以便更容易看到它是如何旋转的(删除了 update_hand_position 方法中的所有内容)
  3. 禁用场景中所有形状之间的碰撞,以使旋转的枪不受身体某些部位的阻碍。(做了一个简单的 space.shapes 循环并运行 shape.group=1)
于 2013-01-08T22:06:32.443 回答
0

也许您的问题出在弹簧参数上?除非枪非常轻,否则刚度和阻尼看起来非常低。

查看我昨天添加到 pymunk 的代码示例:http ://code.google.com/p/pymunk/source/browse/trunk/examples/damped_rotary_spring_pointer.py

(当旋转在正圆周率和负圆周率之间翻转时,旋转会发生一件事,我会看看)

于 2013-01-02T09:24:40.463 回答