2

タイトル通りのことをやってみました。手に拘束された銃を持つキャラクターがいて、銃をカーソルに向けようとしています。DampedRotarySpring が良い方法だと思いましたが、それほど単純ではないことがわかりました。銃はセグメント形状の動的ボディであり、カーソル用に、各ステップで 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

要旨のコードの問題は、銃を 2 つのジョイントで手に取り付けて、同じ場所と同じ回転を維持していることです。ただ、手はルージュボディで回転しません。そのため、銃とカーソルの間のスプリングに引っ張られても、銃は回転しません。これは、他の関節の方が強いためです。

どのように設定したいか正確にはわかりませんが、ガンハンドから RotaryLimitJoint を取り外すと、すべてが機能することがわかります。

正確な詳細については、コードの固定フォークをご覧ください: https://gist.github.com/4505219

問題を見つけるために私が行った将来のトラブルシューティングのためのいくつかのヒント:

  1. すべてを 10 倍大きくして、何が起こるかを簡単に確認できるようにします。pymunk が 1 つのサイズしか描画しないことは知っていますが、コード内のすべてのサイズの末尾に 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

(私が見る正と負の円周率の間で反転するときに、回転で起こっていることが1つあります)

于 2013-01-02T09:24:40.463 に答える