特定のターゲット位置に移動したいb2Bodyがあります。 SetPosition関数を使用したくありません。どうすればこれを達成できますか?
Box2DAS3 2.1aを使用しています。他の言語でのヘルプもいただければ幸いです。
最も簡単な方法は、実際にはSetPosition
/SetTransform(position,angle)
を使用することです。例えば:
body->SetTransform(b2Vec2(0,0),body->GetAngle())
言うまでもなく、瞬間的なジャンプは、物理シミュレーションを覆すことを意味しますが、それはボディの位置を設定する最も簡単で最も直接的な方法です。
SetPosition
(上記のコードに相当)を使用したくない場合、ApplyLinearImpulse
を適切な力で(ボディの質量と現在の速度に基づいて)トリックすると、シミュレーションからより正確になります視点、しかし潜在的な副作用などを考えると、より問題が多い可能性があります。
とにかく、iforce2dはSetLinearVelocity
...をカバーしており、 "マウス"が関与していない場合でも、マウスジョイントが非常に役立つことを付け加えておきます。
最も簡単な方法は、ボディの線速度を設定して、1つのタイムステップで必要な距離をカバーできるようにすることです。例えば。ボディが目的の場所に到達するために(2,3)単位を移動する必要があり、タイムステップが60Hzの場合、1つのタイムステップでSetLinearVelocity(120,180)を使用できます。次の時間ステップでは、もちろん速度をゼロに戻して、遠くに飛ぶのを停止する必要があります。この結果は、SetTransformを使用した場合とほとんど変わりません。ただし、CCDが機能し、何かが邪魔になり、壊れる場合があります。
ボディが1つのタイムステップで到達しないようにするには、ボディの最大速度を制限します。
ApplyForce/ApplyLinearImpulseを使用する場合は、同様のことを実行できますが、ボディの現在の速度も考慮する必要があります。このページは役立つかもしれませんが、これは回転バージョンについて説明していますが、原則は同じです http://www.iforce2d.net/b2dtut/rotate-to-angle