トップページ > 過去ログ > 記事閲覧
三角メッシュデータの読込みと衝突形状のインスタンスの作成
名前:PSI-KI-DO 日時: 2012/10/21 00:27

 DXライブラリと山田 巧 様の講座、リブロワークス社のブログや本のおかげで ほとんど無いC言語の知識でも3ヶ月程度で自作の3Dモデルと ライブラリを使用したC++のプログラムで3Dシューティングの雛形が出来ました。 ありがとうございます。 ・質問の主旨  今回お聞きしたいことは.xや.pmdファイル形式のモデルを静的な剛体として呼出し、 3DのMAPを表示、そのMAP上でキャラクターを動作させるため、 各々のファイルからBulletの形状データとして三角メッシュデータを読込みたいのですが DXライブラリの関数で読み込めるのでしょうか。 ・試してみたこと  リブロワークス社の本ではなくて恐縮なのですが オーム社のBulletPhysicsで始めよう3Dシュミレーションに  1.三角メッシュデータの読込み(ここではOBJファイルの読込み)  2.衝突形状のインスタンスの作成(btTriangleIndexVertexArrayによる)  3.位置の設定、導体のインスタンス作成、BPワールドへ追加(他の形状と同様) の三段階で複雑形状の静的な剛体作成が出来、また本の名前のサイトからDLできるファイル の中のScene12_AnyShapeYouLike\TriMeshを一部書き換えて、 OBJファイルを静的な剛体として読込んでプログラムを動作させ、希望の動作が確認出来ました。 ・具体的な質問  これをDXライブラリで再現したいのですが T.三角メッシュデータの読込みはMV1LoadModelでよいのでしょうか。 U.btTriangleIndexVertexArrayに必要な  6つの引数のうち   1. 三角形の数 2. 三角形を表す3組の頂点インデックスの配列の先頭へのポインタ 3. 3組の頂点インデックスのサイズ   4. 頂点の個数 5. 頂点データの配列の先頭へのポインタ             6. 頂点データ1個分のサイズ 最初の引数1.はMV1GetFrameTriangleNum、引数4.はMV1GetTriangleListVertexNumで取得できそうなのですが 残りの引数が分かりません。  以上について、ご教授いただければ幸いです。 ・環境 64bit版Win7でDXライブラリ VisualC++用(Ver3.08e)とBulletPhysicsのVer2.78を使用してVC++2010にてプログラムを作成中です。 リブロワークスさんの【DXライブラリ3D入門第2部】物理エンジンBulletとDXライブラリを組み合わせて使う その3 ttp://i-libro.net/wpmu/blog/archives/1094 にて公開されているプログラム ttp://i-libro.net/game/download.php?fname=DXBullet_3DTest_bin02.zip の座標変換などをほぼそのまま流用し、 キャラクタの動作を追加してアクションゲームのプログラムを組んでおります。

Page: 1 |

Re: 三角メッシュデータの読込みと衝突形状のインスタンスの作成 ( No.1 )
名前:管理人 日時:2012/10/21 14:04

参照用メッシュの機能を使用すれば必要なデータが取得できます ( リファレンスの3D関係関数の「参照用メッシュ関係」の辺りをご覧ください ) 参照用メッシュ機能の基本的な使い方はリファレンスを参照してください リファレンスを読んでいただいた前提でお話しますと まず MV1SetupReferenceMesh と MV1GetReferenceMesh の第二引数には -1 を指定して モデル全体の参照用メッシュを作成するようにします そして MV1GetReferenceMesh で取得できる MV1_REF_POLYGONLIST 構造体からご所望の 情報を取得できます 1.三角形の数  メンバー変数 PolygonNum 2.三角形を表す3組の頂点インデックスの配列の先頭へのポインタ  メンバー変数 Polygons の0番目の要素内の VIndex 配列の0番目の要素のアドレス  &構造体.Polygons[ 0 ].VIndex[ 0 ] 3. 3組の頂点インデックスのサイズ  ヘッダファイルを見てみましたが、頂点インデックスのサイズではなく次の頂点インデックスへの相対アドレスのようです  なので sizeof( MV1_REF_POLYGON ) になると思います 4. 頂点の個数  メンバー変数 VertexNum 5. 頂点データの配列の先頭へのポインタ  メンバー変数 Vertexs の0番目の要素内の Position のメンバー変数 x のアドレス  &構造体.Vertexs[ 0 ].Position.x 6. 頂点データ1個分のサイズ  3と同じく頂点データのサイズではなく次の頂点データへの相対アドレスのようです  なので sizeof( MV1_REF_VERTEX ) になると思います 実際に試したわけではないので上手くいくか心配ですが、 よろしければお試しください
Re: 三角メッシュデータの読込みと衝突形状のインスタンスの作成 ( No.2 )
名前:PSI-KI-DO 日時:2012/10/21 18:05

 丁寧なご回答ありがとうございます。 時間がかかるかと思いますが早速試してみたいと思います。
Re: 三角メッシュデータの読込みと衝突形状のインスタンスの作成 ( No.3 )
名前:PSI-KI-DO 日時:2012/10/22 00:18

早速試してみました。 前述のttp://i-libro.net/game/download.php?fname=DXBullet_3DTest_bin02.zipのmain.ccpをDL、 ディレクトリなど設定したのち関数リファレンスに倣って 変数を  int ModelHandle ;  MV1_REF_POLYGONLIST RefPoly ; と定義し、地形データ"ColTestStage.mqo"を 3Dアクションのプログラムからお借りして以下のように読み込みました。  // モデルを読込み  ModelHandle = MV1LoadModel("ColTestStage.mqo");  // モデル全体の参照用メッシュを構築  MV1SetupReferenceMesh( ModelHandle , -1, TRUE ) ;  // 参照用メッシュ情報の取得  RefPoly = MV1GetReferenceMesh( ModelHandle , -1, TRUE ) ; その後、6つの引数を上から  RefPoly.PolygonNum,  RefPoly.Polygons[ 0 ].VIndex[ 0 ] ,  3*sizeof( MV1_REF_POLYGON ),  RefPoly.VertexNum,  RefPoly.Vertexs[ 0 ].Position.x,  3*sizeof( MV1_REF_VERTEX )); と入力しました。 各々の引数にはエラーがでないのですが、 二番目の引数  RefPoly.Polygons[ 0 ].VIndex[ 0 ] , が間違っているようで  >コンストラクタ"btTriangleIndexVertexArray::btTriangleIndexVertexArray"のインスタンスが引数リストと一致しません。 と出てしまいます。そのままデバッグしてみると、 1>c:\users\psi-ki-do=now\desktop\dxbullet_3dtest02\main.cpp(106): error C2664: 'btTriangleIndexVertexArray::btTriangleIndexVertexArray(int,int *,int,int,btScalar *,int)' : 2 番目の引数を 'int' から 'int *' に変換できません。(新しい機能 ; ヘルプを参照) というエラーがでてしまいました。  >メンバー変数 Polygons の0番目の要素内の VIndex 配列の0番目の要素のアドレス なので一個のデータだとは思うのですが他に何と書いたらいいのか分からないので 第二引数をどのように設定したらよいのかご教授ください、たびたびすみません。
Re: 三角メッシュデータの読込みと衝突形状のインスタンスの作成 ( No.4 )
名前:管理人 日時:2012/10/22 00:36

 RefPoly.PolygonNum,  RefPoly.Polygons[ 0 ].VIndex[ 0 ] ,  3*sizeof( MV1_REF_POLYGON ),  RefPoly.VertexNum,  RefPoly.Vertexs[ 0 ].Position.x,  3*sizeof( MV1_REF_VERTEX )); こちらは  RefPoly.PolygonNum,  &RefPoly.Polygons[ 0 ].VIndex[ 0 ] ,  sizeof( MV1_REF_POLYGON ),  RefPoly.VertexNum,  &RefPoly.Vertexs[ 0 ].Position.x,  sizeof( MV1_REF_VERTEX )); となります &RefPoly.Polygons[ 0 ].VIndex[ 0 ] , &RefPoly.Vertexs[ 0 ].Position.x, こちらは説明で「&構造体」と、日本語の前に&を書いたので分かりにくかったですね、すみません m(_ _;m  sizeof( MV1_REF_POLYGON ),  sizeof( MV1_REF_VERTEX )); こちらは構造体一つのサイズでOKです
Re: 三角メッシュデータの読込みと衝突形状のインスタンスの作成 ( No.5 )
名前:PSI-KI-DO 日時:2012/10/22 09:17

 ご返答ありがとうございます。 こちらこそ不勉強でせっかくの情報を読み飛ばしてしまいすみません。 早速ご指摘の部分を変更し試したところ次のアドレスのSSに示すとおり、 後述の理由でちょっと無茶なのですが、問題なく動作できました。 ttp://twitpic.com/b69rop  MAPが大きすぎて認識できなかったりしたのですが、 横着せずにメタセコイヤで皿状のモデルを作っで読込んだところ、希望の動作が確認できました。 その後、より複雑な形状を試してみようと思い、 ここが無茶なのですが kelorin joさん の かもめ町1.02というテクスチャ含めて40MB程の.xファイル ttp://bowlroll.net/up/dl5986 を読込んだところ冒頭のSSのような当初目指していた動作が出来ました。  ただ、このプログラムを動作させたパソコンの主なスペックが CPU:AMDのPhenomUX6 1090T 3.2GHz、VGA:Radeon HD7770、メモリ:DDR3、8GB この性能で2.1FPSと、かなりギリギリな結果となってしまいました。  そこで質問を追加させていただきたいのですが、 以下のSimplestar様のサイトにて、 btConvexHullShapeという関数ならより簡素な形状で高速に動作すると知りました。 データを削るかメッシュを分割して読込む前に先ずこの関数を試してみたいのですが、 こちらの引数もbtTriangleIndexVertexArray同様に参照用メッシュから参照できるのでしょうか。 ttp://simplestar.syuriken.jp/lesson/039_BulletPhysics3.html btConvexHullShapeの三つの引数は下記の公式サイトの説明と Simplestar様のサイトの例を見ると引数は1.頂点の座標、2.頂点の数 3.三角形?のサイズで それぞれの引数は、  2.RefPoly.VertexNum,  3.sizeof( MV1_REF_VERTEX ) だと思うのですが、 ttp://bulletphysics.com/Bullet/BulletFull/classbtConvexHullShape.html#a069cf26ba277f9f5f141128fee345eaf 第一引数が分からないのでどのように設定したらよいのかご教授ください。
Re: 三角メッシュデータの読込みと衝突形状のインスタンスの作成 ( No.6 )
名前:管理人 日時:2012/10/22 10:29

btConvexHullShape では頂点インデックスが使用できないようですので、 MV1_REF_POLYGONLIST の ままでは引数を渡すことはできません #include <malloc.h> // malloc を使用するので、どこかで malloc.h をインクルードして下さい VECTOR *Points ; Points = ( VECTOR * )malloc( sizeof( VECTOR ) * 構造体.PolygonNum * 3 ) ; for( int i = 0 ; i < 構造体.PolygonNum ; i ++ ) { Points[ i * 3 ] = 構造体.Vertexs[ 構造体.Polygons[ i ].VIndex[ 0 ] ].Position ; Points[ i * 3 + 1 ] = 構造体.Vertexs[ 構造体.Polygons[ i ].VIndex[ 1 ] ].Position ; Points[ i * 3 + 2 ] = 構造体.Vertexs[ 構造体.Polygons[ i ].VIndex[ 2 ] ].Position ; } 上記のコードで座標配列を準備をした上で 1.頂点の座標  関数の定義を見てみましたが、こちらは頂点配列の先頭アドレスのようです、なので  ( btScalar * )Points 2.頂点の数  こちらは全三角形ポリゴンの頂点の数なので、ポリゴンの数×3となります  ( btTriangleIndexVertexArra では頂点インデックスで参照する頂点座標の数だったので RefPoly.VertexNum でした )  RefPoly.PolygonNum * 3 3.三角形?のサイズ  こちらは頂点座標情報一つ辺りのサイズなので VECTOR 構造体一つ辺りのサイズとなります  sizeof( VECTOR ) 因みに今回は malloc でメモリを確保していますので、頂点データが不要になったら free( Points ) ; でメモリを解放して下さい
Re: 三角メッシュデータの読込みと衝突形状のインスタンスの作成 ( No.7 )
名前:PSI-KI-DO(解決) 日時:2012/10/22 18:30

 おかげさまでbtConvexHullShape関数にてプログラムを組むことが出来ました。 先日のbtTriangleIndexVertexArray関数と同様にkelorin jo様のカモメ町1.02を読込み 前回場合と比較してFPSは2.9と前回と平均して大体2,30%ほど高速になりました。 以下にSSのアドレスを示します。  ttp://twitpic.com/b6e189  今後は自分でより簡素なモデルを作り、キャラクタの周りや、 移動可能な部分のみメッシュを読込むなどして実用レベルまで高速化していきたいと思います。  DXライブラリと今回のアドバイスのおかげで 任意形状の物理演算が出来るようになりました。 各引数に関するアドバイスの数々、本当にありがとうございました。

Page: 1 |