2012-01-15 3 views
9

私は、プレーヤーが指で船をドラッグするゲームを作っています。私は、ゲームの物理的側面にBox2Dを使用しています。特に、私はb2MouseJointを使ってタッチイベントをボートに付けて、タッチイベントがボートをドラッグさせるようにしています。Box2Dでの耐水性のシミュレーション

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

Box2Dでシミュレーションすることはできますか?リニアダンピングと角度ダンピングは単にボートを動きにくくするだけですが、私はボートを一方向に移動しやすく、方向の変更に抵抗する必要があります。

P.S.私はこの質問のために自分のコードを投稿する必要はないと思いますが、コードの抜粋を見たいかどうかを教えてください。

+2

[ドラッグ式](http://en.wikipedia.org/wiki/Drag_equation)を試したことがありますか?横断面積項* A *は、ボートの速度に対する相対的な向きに応じて変わります。そして、あなたはいつも安いヒューリスティックで* A *を見積もることができます。 – Rahul

+0

@Rahul、ヒントのおかげで。私はいくつかの近似技術を使ってコードに抗力方程式を追加しました。(速度と艇の角度を参考にしてください)、最新のコードでシミュレートされた耐水性がいくつか見えますが、いくつかの狂った動きがあります。ボートは世界の国境に衝突します。私はここでさらに助けを求める前に、何が間違っているのかを理解しようとしています。再び、ヒントのおかげで。 – Lukman

+0

クイックな回避策は、ボートの周りのスペースを埋めるために小さな質量の非常に小さな円形のボディをたくさん作成することです。私は、これが物理的または処理能力(まだ)の面でこれの実行可能性をテストしていないため、私はそれを適切な答えとして提出していません。 – Andrey

答えて

1

私は些細かもしれないが、多くの粒子を必要とする1つの提案があり、そのために多少の処理能力があるかもしれません。あなたはおそらく多くの多くの小さな円を衝突で作ることができますが、描かれないようにしてください。だから、あなたは水の模倣効果を得るが、水は得られないだろう。サークルのサイズによって、あなたの数が決まります;画面を埋める必要があり、したがってあなたのパフォーマンスも満たす必要があります。私はそのハック解決策のビットを知っているが、それはショットの価値があるかもしれません。サークルの大きさには、パフォーマンスとダイナミクスのような流体の両方が可能な幸せな媒体があります。

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

+0

残念ながら、IMOは、これらの粒子が世界中に存在する他の物理的な物体と干渉するので、私はむしろこのハッキリしたテクニックを使用しません。しかし、提案をありがとう。 – Lukman

+0

@Fred私はそれで周りに遊びに行きました、そして、バランスがうまくいく大きな問題でした - サークルが大きすぎて*すべての動きを妨げたか、全体が自分のプロセッサーに負担をかけすぎていました。私はJSポートで試していましたが、通常は少し遅いと思います。 – Andrey

2

これは実際には簡単なことではないため、「完全な」回答がほんとうに希望です。 Hereは、ボックス2dの車の例へのリンクです。その紳士のdemoreel(リールの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); 
} 

私は、別のlinkに関連するチュートリアルのこの時間は私の答えを終了します。これはdougk16のアクションスクリプトのようなクールではありませんが、チュートリアル形式であるため、もっと便利です。

関連する問題