スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

DXライブラリでBullet3

こんにちは。
もはやDOLの欠片も出てこなくなったペチコです。

サービス終了の5年後くらいに終わってたことに気付きそうです。
やる気は一応あるので終わらないでください。


あいかわらず物理演算で遊んでいます。

今回はモデルデータから形状を読み込んでみました。



すり鉢状の丁度杯みたいな物体にサイコロを降らせています。とてもそうは見えませんが。
形状に沿ってサイコロがたまって、あふれたものは虚空の彼方へと消えていきます。
例に漏れず適当な実装ですが、モデルデータを読み込めれば多少実用性が上がるのではないでしょうか。

コードは前回のとほとんど変わってないので読み込み部分の抜粋。

//地面モデル読み込み
Model_Handle_Ground = MV1LoadModel( "dish.mv1" );
//地面の位置は原点
MV1SetPosition( Model_Handle_Ground, VGet( 0.0f, 0.0f, 0.0f ) ) ;
// 参照用メッシュの構築
MV1SetupReferenceMesh( Model_Handle_Ground, -1, TRUE );
// 参照用メッシュの取得
MV1_REF_POLYGONLIST RefMesh = MV1GetReferenceMesh( Model_Handle_Ground, -1, TRUE ) ;
//地面のメッシュからトライアングルリスト作成
btTriangleMesh* VartexGround = new btTriangleMesh();
// ポリゴンの数だけ繰り返し
for( int i = 0 ; i < RefMesh.PolygonNum ; i ++ )
{
float a0 = RefMesh.Vertexs[ RefMesh.Polygons[ i ].VIndex[ 0 ] ].Position.x;
float a1 = RefMesh.Vertexs[ RefMesh.Polygons[ i ].VIndex[ 0 ] ].Position.y;
float a2 = RefMesh.Vertexs[ RefMesh.Polygons[ i ].VIndex[ 0 ] ].Position.z;
float b0 = RefMesh.Vertexs[ RefMesh.Polygons[ i ].VIndex[ 1 ] ].Position.x;
float b1 = RefMesh.Vertexs[ RefMesh.Polygons[ i ].VIndex[ 1 ] ].Position.y;
float b2 = RefMesh.Vertexs[ RefMesh.Polygons[ i ].VIndex[ 1 ] ].Position.z;
float c0 = RefMesh.Vertexs[ RefMesh.Polygons[ i ].VIndex[ 2 ] ].Position.x;
float c1 = RefMesh.Vertexs[ RefMesh.Polygons[ i ].VIndex[ 2 ] ].Position.y;
float c2 = RefMesh.Vertexs[ RefMesh.Polygons[ i ].VIndex[ 2 ] ].Position.z;
btVector3 A(a0,a1,a2);
btVector3 B(b0,b1,b2);
btVector3 C(c0,c1,c2);
VartexGround->addTriangle(A,B,C,false);
}
// 地面の衝突形状の作成
btBvhTriangleMeshShape* groundShape = new btBvhTriangleMeshShape(VartexGround,true,true);

前回の"// 地面の衝突形状の作成"部分をこれで置き換えました。
なんかもう無理矢理過ぎますが動けばいいということで。
もっと上手い方法があると思います。わかったらペチコにも教えてください。

やっていることは地面用のメッシュから参照メッシュを作成して、頂点データをBulletのトライアングルメッシュに読み込んで、静的な凹型三角メッシュに適用しているだけです。
地面等の動かないものにはbtBvhTriangleMeshShape、動的な物体にはbtConvexHullShapeを使うと良いそうです。
btConvexHullShapeの場合は頂点100を超えるとダメ!絶対!だそうですが、btBvhTriangleMeshShapeの場合は良いのかな?

今回は形状メッシュをそのまま表示していますが、高精度の表示用メッシュを別に用意するとか、高精度メッシュからプログラム側で頂点数を減らすとか、色々やんないといけないですね。

後は特に変更はありません。
モデル表示部分に地面表示を加えたくらいです。
ただなぜか地面の当たり判定と表示がずれるので、強引に表示を合わせてます。
こういう時のためにデバッグドローがありますが、それすらめんどくさいペチコでございました。

そういえば落ちて見えなくなったサイコロを消す処理はいれてないけど、演算範囲外で浮いてるのかしら?


btBvhTriangleMeshShapeは、頂点を消すなということなので、最後にdelete VartexGroundしてます。
使うシェイプによっては頂点を追加できたり削除できたりするようです。

一応地面として使った皿(mv1ファイル)置いときます。


物理演算はおもしろいけど、少しめんどくさくなってきた飽き性のペチコで御座候。



コメントの投稿

非公開コメント

プロフィール

ペチコートさん

Author:ペチコートさん
大航海時代オンライン
Zephyros、Eurosサーバーに潜伏中

偽ペチコ1号・2号
ペチコの手下達
Zephyrosサーバーに潜伏中

最新記事
月別アーカイブ
カテゴリ
リンク
最新コメント
検索フォーム
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。