web-dev-qa-db-ja.com

ボディを特定の位置に移動-Box2D

特定のターゲット位置に移動したいb2Bodyがあります。 SetPosition関数を使用したくありません。どうすればこれを達成できますか?

  1. 線速度の変更。
  2. MouseJointを使用します。 (目標位置は固定です。マウスは関与しません。)

Box2DAS3 2.1aを使用しています。他の言語でのヘルプもいただければ幸いです。

23
Anubhav Sharma

最も簡単な方法は、実際にはSetPosition/SetTransform(position,angle)を使用することです。例えば:

body->SetTransform(b2Vec2(0,0),body->GetAngle())

言うまでもなく、瞬間的なジャンプは、物理シミュレーションを覆すことを意味しますが、それはボディの位置を設定する最も簡単で最も直接的な方法です。

SetPosition(上記のコードに相当)を使用したくない場合、ApplyLinearImpulseを適切な力で(ボディの質量と現在の速度に基づいて)トリックすると、シミュレーションからより正確になります視点、しかし潜在的な副作用などを考えると、より問題が多い可能性があります。

とにかく、iforce2dはSetLinearVelocity...をカバーしており、 "マウス"が関与していない場合でも、マウスジョイントが非常に役立つことを付け加えておきます。

48
Tom Guinther

最も簡単な方法は、ボディの線速度を設定して、1つのタイムステップで必要な距離をカバーできるようにすることです。例えば。ボディが目的の場所に到達するために(2,3)単位を移動する必要があり、タイムステップが60Hzの場合、1つのタイムステップでSetLinearVelocity(120,180)を使用できます。次の時間ステップでは、もちろん速度をゼロに戻して、遠くに飛ぶのを停止する必要があります。この結果は、SetTransformを使用した場合とほとんど変わりません。ただし、CCDが機能し、何かが邪魔になり、壊れる場合があります。

ボディが1つのタイムステップで到達しないようにするには、ボディの最大速度を制限します。

ApplyForce/ApplyLinearImpulseを使用する場合は、同様のことを実行できますが、ボディの現在の速度も考慮する必要があります。このページは役立つかもしれませんが、これは回転バージョンについて説明していますが、原則は同じです http://www.iforce2d.net/b2dtut/rotate-to-angle

20
iforce2d