2007年03月28日 16時44分15秒

スキンメッシュ用OBBの作成にて2

テーマ:ブログ

何とか解決しました。

ConvertToBlendedMeshメソッドを呼んだ後に、Remapメソッドを呼ぶ必要があったようです。


LPD3DXBUFFER bf;

if(FAILED(hr=pMeshContainer->pSkinInfo->ConvertToBlendedMesh(
pMesh, // 入力メッシュ
NULL,
pMeshContainer->pAdjacency, // 入力メッシュの隣接性情報
NULL, NULL, &bf,
&pMeshContainer->weight, // ボーンの重み
&pMeshContainer->cntBone, // ボーンの組み合わせテーブルに含まれるボーンの数へのポインタ
&pMeshContainer->pBoneBuffer, // ボーンの組み合わせテーブルへのポインタ
&pMeshContainer->MeshData.pMesh))) // 新しいメッシュへのポインタ
{
return hr;
}
DWORD *d=(DWORD *)bf->GetBufferPointer();
pMeshContainer->pSkinInfo->Remap(pMeshContainer->MeshData.pMesh->GetNumVertices(),d);
bf->Release();


こんな感じにして、OBBを作成してみると上手く行きました。

Remapのヘルプを見ると

「ターゲットの頂点バッファが外部的に順番変更された場合は、このメソッドを呼び出す必要があります。」

とあります。

ConvertToBlendedMeshメソッドはスキンインフォのメソッドなのに外部とは・・・。勝手にやってくれても良いと思いますけどね。

でもRemapメソッド使わなくても描写に何の影響もなかったのは謎です。

「Remap SkinInfo」でグーグルで検索しても日本語サイトでないですし、良く分からないメソッドです。


で。

やっとスキンメッシュOBBが完成しました。

DirectXサンプルの彼を使ってもちゃんとOBBできてます。(画像参照)

深さ3なのでちょっと荒いですけれども。

一応複数のメッシュコンテナが有る場合でもちゃんとOBB作れるようにしてあります。

これで大概のモデリングデータに対してはOBBが生成できるはずですが、余り自信なし(笑)

基本はサンプルの理論を参考にかなり無茶な方法で生成してるんで、生成に時間が掛かります。

やはりあらかじめ作成しておいて外部に保存しておき、公開するときはファイルから読み込むのがよさそうですね。
スキンOBB

SkinMeshOBBという独立のクラスにして、渡すデータは何の拡張もしていないLPD3DXFRAMEだけなんで、組み込みやすく作ったつもりです。
スキンメッシュ用OBBのサンプルのサイト少ないので、公開したいところですが相変わらず付属テキスト作るの面倒なのでどうするか決めていません。まあ、

http://www.nomuraz.com/denpa/

こちらのサイトのOBBTreeのサンプルをコピペしまくって作っているので流石に公開はマズイかも。


あとはHLSLでスキンメッシュできれば趣味の範囲としてはもう十分かな?

PR

コメント

[コメントをする]

コメント投稿

[PR]気になるキーワード