2

画面上にいくつかの円があり、さまざまな場所に配置されています(すべて動的なbox2dボディ)。

別の円を追加したいと思います。初期速度はx, yです。この体を無重力のように自由に動かしたい。すべての衝突を 100% 弾性にします。

伸縮性を1にしてみましたが、上から落とすとまた天井に当たりません。衝突によって方向が変わらない限り、設定された方向に動き続けたいと思います。

これをさらに説明すると、私が望むものの単純な実装は、円形の本体を持つ正方形のコンテナー内にあるこれになります。

when collides ->
  set body.velocityX to -body.velocityX
  set body.velocityY to -body.velocityY

もちろん、間に体がある場合、これは機能しません。

box2d フレームワークまたは疑似コードを使用する任意の言語での提案をいただければ幸いです。

4

2 に答える 2

3

弾力性の設定に加えて、ボディのダンピングを 0 に設定して、現在見ている速度低下効果をなくす必要があります。

Box2d マニュアルから:

ダンピングは、ボディのワールド速度を下げるために使用されます。摩擦は接触によってのみ発生するため、ダンピングは摩擦とは異なります。ダンピングは摩擦に代わるものではなく、2 つの効果を一緒に使用する必要があります。

ダンピング パラメータは 0 から無限大の間である必要があります。0 はダンピングなしを意味し、無限大は完全なダンピングを意味します。

...

bodyDef.linearDamping = 0.0f;

bodyDef.angularDamping = 0.01f;

ダンピングは、安定性とパフォーマンスのために概算されます。ダンピング値が小さい場合、ダンピング効果は時間ステップにほとんど依存しません。減衰値が大きいほど、減衰効果は時間ステップによって異なります。固定時間ステップを使用する場合、これは問題になりません (推奨)。

さらに、マニュアルに記載されているように、ダンピングは摩擦と同じではありません...そのため、おそらくボディの摩擦も 0 に設定する必要があります。

于 2012-07-25T20:01:39.827 に答える
0

b2BodyDef::type = b2_kinematicBody を設定します。

Box2D のマニュアルには次のように書かれています。

キネマティック ボディは、その速度に従ってシミュレーションで移動します。キネマティック ボディは力に反応しません。これらはユーザーが手動で動かすことができますが、通常、キネマティック ボディはその速度を設定することによって動かされます。キネマティック ボディは無限の質量を持っているかのように動作しますが、Box2D は質量と逆質量に対してゼロを格納します。キネマティック ボディは、他の静的またはキネマティック ボディと衝突しません。

于 2012-07-29T09:46:17.577 に答える