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ライブラリと今回のアドバイスのおかげで
任意形状の物理演算が出来るようになりました。
各引数に関するアドバイスの数々、本当にありがとうございました。
|