Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/indyadmin/web/houdinifx/blog/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524
どうも、篠島です。今回はBulletやODEでのコリジョンジオメトリを作成する時に使う事ができるBake ODE SOPを見てみます。
今回のサンプルファイルです。
Bake_ODE.zip
Bake ODEについて
Bake ODEはSOPレベルでプリミティブで作ったコリジョンジオメトリをBulletやODEソルバーで使えるようにします。Bake ODEはプリミティブ毎にポイントを一つ作り、プリミティブの情報(位置、回転、スケール)等を全てポイントアトリビュートにしています。Keep Original GeometryはONでもOFFでも構いませんが、今はOFFにしています。
Bake ODEのヘルプを見てみると下のようにプリミティブによって primType アトリビュートの値が違います。上の例だとSphereにBake ODEを繋げているので、primTypeは1となっているのが確認できると思います。
試しにBake ODEのKeep Original GeometryをONにするとどうなるか? BoxにBake ODEを繋げてみます。BoxのprimTypeは0になっているのが確認できます。そしてBake ODEで作られたポイントに対してodePointGroupというグループが作られているのも確認できます。要はDOPシミュレーションをする時に、odePointGroupのポイントだけが評価され、その他のポイントは無視されます。これがKeep Original GeometryのON、OFFがどちらでもいい理由です。
さて、毎度おなじみのテストオブジェクトのコリジョンジオメトリにBake ODEを繋げてみましょう。そして作られたポイントを元のジオメトリとMergeします。元のオブジェクトとMergeするので、Bake ODEのKeep Original GeometryはOFFの方がビューポートで元のオブジェクトが見やすいです。
ODEでのコリジョン設定
Bake ODEで作られたポイントを元のオブジェクトとMergeしている場合は、Object TypeをCompositeにするだけで自動的にコリジョンジオメトリが読み込まれます。Composite Objectには何も指定する必要はありません。しかし、この場合Display ODE PrimitiveがONでもコリジョンジオメトリはなぜかビューポート上で表示されませんが、データ自体はきちんと存在しているのできちんとシミュレーションされます。
もちろんComposite Objectでコリジョンオブジェクトを直に指定しても大丈夫です。
Bulletでのコリジョン設定
BulletのGeometry RepresentationからCompoundを選びます。すると見事に自分で作ったジオメトリ(プリミティブのみ)を元にコリジョンジオメトリが作られたのが確認できます。SOPレベルでBake ODEをバイパスすると、このコリジョンは消えますので確認してみましょう。
ODEソルバーと違い、コリジョンオブジェクトを参照するパラメーターがないので、SOPレベルでBake ODEによって作られたポイントをMergeしないと自分で作ったコリジョンジオメトリを読み込めません。
その他
ちなみに、Bake ODEで作ったコリジョン用のポイント自体をRBD Object等に読み込み、シミュレーションすることもできます。
タダのポイントだけですが、コリジョンジオメトリ自体はきちんとしているために通常通りにシミュレーションできます。