8

C++ で 2D 物理エンジンを実験しようとしています。これまでのところ、最も人気があるのは Box2D のようです。残念ながら、Box2D は剛体物理エンジンであり、私が試したいことにはあまり役に立ちません。

この形状が剛体または他の非剛体の形状と衝突したときにその形状が柔軟になるように、バネで結合された多数の頂点を持つ形状を定義できるようにしたいと考えています。

今、剛体のみを使用して Box2D でこれを行う方法を考えようとしましたが、常に欠陥があるようです:

  1. 柔軟な形状の外縁には、長方形または線分を使用します。これらは他の形状と衝突します。残念ながら、それらは弾力性がないため、望ましい効果は見られません。
  2. シェイプの各頂点は、独自の小さな円形のボディである可能性があります。これらのボディは、スプリングで結合できます。これは形状の変形に関してはうまく機能しますが、形状が硬いスパイクに着地し、スパイクが頂点間をちょうど通過した場合を想像してみてください。そうすると、形状がスパイクに引っかかってしまいます。

では、C++ でこの種の物理演算を実行する最善の方法は何でしょうか? できれば、物理エンジン全体を作成する必要はありません。Box2D の機能が不足しているだけかもしれません。多分それは正しい選択ではありません。では、正しい選択とは?

4

4 に答える 4

3

変形可能/ソフト ボディをサポートするパッケージ/エンジンがいくつかあります。無料のものが必要な場合は、たとえば、 PhyzSOFA、またはBulletをチェックできます。

ウィキペディアに詳細なリストがあります。これらのほとんどは 3D ベースですが、シーンを平面として設定することで 2D モデルに適応させることができます。

ハッピーコーディング!

于 2010-07-26T14:57:00.947 に答える
1

Dax Phyzは 2D ボディとソフト ボディの両方を備えていると思います。

于 2011-02-24T22:52:47.830 に答える
1

変形のみを探している場合は、その形状を表すリジッドボディへの衝突コールバックをキャッチするポリゴン モデル (trimesh) を使用することをお勧めします。衝突点で、1 つまたは複数の頂点に生じる変形の量を決定します。

非変形の場合、タイムステップごとに、変形したポイントを反復処理し、それらを外側に押し出すことをお勧めします。クエリは、衝突の世界で非常に小さな球体クエリを介して実行できると思います。それには、「最大」の変形していない位置を維持することも必要です。

このメソッドの実装はかなり簡単ですが、探している「ソフト ボディ」にはなりません。http://chriscavanagh.wordpress.com/2008/06/24/silverlight-soft-body-physics/は、調べたいソース コードを提供する実装のようです。

于 2010-07-22T00:07:05.710 に答える
0

何が最善の方法なのかはよくわかりませんが、ここでは、ページの終わり近くに「スプリング」のコードがあります。

于 2010-07-20T05:28:47.290 に答える