9

プレイヤーが指でボートをドラッグするゲームを作っています。ゲームの物理的な側面には Box2D を使用しています。特に、b2MouseJointタッチ イベントをボートにアタッチして、タッチ イベントでボートをドラッグできるようにしています。

しかし、1 つ問題があります。それは、引きずられている間のボートの動き方が現実的ではないということです。現実の世界では、ボートはその長さに沿ってしか移動できず、ボートの動きの方向を変えるのを困難にする水の抵抗がありますが、任意の方向にドラッグするだけです。したがって、ボートの動きをリアルにするには、水の抵抗をシミュレートする方法が必要です。

Box2Dでシミュレートできますか? 線形減衰と角度減衰は単にボートを動かしにくくしますが、ボートを一方向に簡単に動かしたいだけで、方向の変化にのみ抵抗する必要があります。

PSこの質問に自分のコードを投稿する必要はないと思いますが、コードの抜粋を見たい場合はお知らせください。

4

2 に答える 2

2

これは実際には簡単なことではないため、「完全な」答えは少し期待できません。これは、box2d の車の例へのリンクですその紳士のデモリール (リールの 3 番目のデモが最も関連性が高い) を表示し、彼のソース コードをざっと見てください。彼のシミュレーションは、あなたが達成する必要があるものよりも少し高度なので、その仕組みを理解できれば、簡単なバージョンを作成するのに問題はありません.

dougk16 の box2d 拡張機能には (当然のことながら) 多くのコードが含まれているため、彼の車がどのように機能するかを正確に理解するのは難しいかもしれません。簡単な出発点は次のとおりです。前後に移動し、回転できるボディをシミュレートします。つまり、ボート ボディの現在の向きから前方または後方に伸びる 1 つの力と、ボディを左右に回転させる 1 つのトルクです。かなりクールなものを手に入れるために必要なのはこれだけです。始めるのに妥当な場所となるいくつかの疑似コードを次に示します。

if( needs_to_turn )
{
   // turn_direction will either be -1 (left) or 1 (right), boat_torque can be a constant to start with, but should probably be controlled by the user
   body.ApplyTorque(turn_direction * boat_torque);
}

if( needs_to_move )
{
   // facing_vector should be a vector pointing in the direction the boat is facing, the boat_force could be a constant, but again should be controlled by the user
   body.ApplyForce(facing_vector * boat_force);
}

今回は関連するチュートリアルへの別のリンクで回答を終了します。これは dougk16 のアクション スクリプトほどクールではありませんが、チュートリアル形式なので、より役に立つかもしれません。

于 2012-02-19T04:21:39.427 に答える
1

些細なことかもしれませんが、多くの粒子が必要であり、おそらく追加の処理能力が必要な提案があります。衝突を伴う多数の小さな円を作成することはできますが、それらは描画されません。したがって、水のシミュレートされた効果は得られますが、水ではありません。円のサイズによって、画面を埋めるために必要な円の数が決まり、パフォーマンスも決まります。ちょっとしたハックソリューションであることは知っていますが、試してみる価値があるかもしれません。良好なパフォーマンスと流体のようなダイナミクスの両方を可能にする、円のサイズの適切な媒体を見つけることができます。

おっと、誰かがすでにこれを提案しているようです...申し訳ありません。

于 2012-02-16T22:36:29.413 に答える