トップページ > 記事閲覧
3Dモデル(pmd/vmd)の表示について
名前:M 日時: 2014/10/26 21:04

MinGW g++/DirectX9でゲームを作成しております。 DXライブラリの3Dモデル(pmd/vmd)の表示を使用させていただこうと思っておりましたが、 メインループのシステムを自前で回しており、またファイルの読み込みや表示物の管理も独自に管理しているため、 DXライブラリで用意されている高レベル関数での3Dモデル表示を共存させるのが難しく、 単機能の低レベル関数かソースコードそのものを自分のプログラムに組み込みしかない状況です。 下記の部分が組み込みには必要になりますが、どのあたりを参考にすればよいかご教示いただけませんでしょうか? 1)ファイルをメモリ上に読み込みんだ直後の初期化 2)モデルのモーションやアニメの処理 3)ポリゴンデータをDirectX9に渡す処理 よろしくお願いいたします。
メンテ

Page: 1 |

Re: 3Dモデル(pmd/vmd)の表示について ( No.1 )
名前:管理人 日時:2014/10/26 21:52

> 1)ファイルをメモリ上に読み込みんだ直後の初期化 PMDファイルの読み込み関係のソースは DxModelLoader3.cpp, DxModelLoader3.h VMDファイルの読み込み関係のソースは DxModelLoaderVMD.cpp, DxModelLoaderVMD.h となります あと、モデルファイル読み込み処理共通で DxModelRead.cpp, DxModelRead.h や DxModel.cpp, DxModel.h 、 Direct3D9 関連では DxModelD3D9.cpp, DxModelD3D9.h 等も関わっています > 2)モデルのモーションやアニメの処理 モデルのモーションやアニメの処理やデータ定義は DxModel.cpp, DxModel.h にあります > 3)ポリゴンデータをDirectX9に渡す処理 モデルの描画関連の処理・データ定義は DxModel.cpp, DxModel.h, DxModelD3D9.cpp, DxModelD3D9.h, DxGraphics.cpp, DxGraphics.h, DxGraphicsWin.cpp, DxGraphicsWin.h, DxGraphicsD3D9.cpp, DxGraphicsD3D9.h が関わっています あまり綺麗に部品化されていないので、ここからモデル描画に関わる部分のみを抜き出すのは少し骨が折れるかもしれません あと、モデルの描画に使用しているシェーダーコードバイナリは DxShaderCodeBin_Model_D3D9.cpp にあります
メンテ
Re: 3Dモデル(pmd/vmd)の表示について ( No.2 )
名前:M 日時:2014/10/26 23:07

早速のご回答ありがとうございます。 参考にさせていただきます。
メンテ
Re: 3Dモデル(pmd/vmd)の表示について ( No.3 )
名前:M 日時:2015/01/04 01:33

pmxを読み込んでDrawIndexedPrimitiveでモデルを示することができました。 使用しているpmxファイルのデータは下記のとおりです。 頂点データ 座標/法線/UV値/ボーンIndex/ボーンWeight 面データ 頂点Index テクスチャ 通常テクスチャパス マテリアル カラー/通常テクスチャIndex/頂点数 ボーン ボーン名/親ボーンIndex/ポジション/ローカルX軸/ローカルZ軸 このモデルに、vmdでモーションをつけたところ、何故か右腕の回転が反転しているようになってしまいます。 モーションをつけないAポーズでは正しく表示されております。 モーションをつける際に、ボーンの名前やフラグを見て、何か特別な処理が必要ありますでしょうか? よろしくお願いいたします。
メンテ
Re: 3Dモデル(pmd/vmd)の表示について ( No.4 )
名前:管理人 日時:2015/01/06 01:47

pmx + vmd や pmd + vmd でのモーションは IK が使用されていますので、 DxModel.cpp に記述されている FK によるモーション再生処理だけでは正常な結果を得ることができません DxModel.cpp では今のところ IK を使ったモーションの再生には対応していないので、 pmx や pmd の読み込み処理を行う DxModelLoader3.cpp や DxModelLoader4.cpp の中で IK の処理を施したモーションデータを構築しています DxModelLoader3.cpp の中の _MV1LoadModelToVMD_PMD 関数が pmd 用の DxModelLoader4.cpp の中の _MV1LoadModelToVMD_PMX 関数が pmx 用の IK 適用後モーション構築処理となっていますので、 ( かなり力技で酷いプログラムですが )よろしければご覧ください m(_ _;m
メンテ
Re: 3Dモデル(pmd/vmd)の表示について ( No.5 )
名前:M 日時:2015/01/17 13:08

ご回答ありがとうございます。 Flag_IKに関連するボーンを調べてみましたが、足回りのボーンで腕には関係ありませんでした。 現状、足は揃ったまま動くので、ご指摘の通りIKを反映させれば、正しく動くと思います。 また、髪の毛や装飾品も動きませんが、これは物理計算をしていないためと思われます。 pmxのボーンデータ部にはFlag_IKを含む各種フラグがありますが、このうちボーンの計算に使用しているフラグを教えていただけませんでしょうか? よろしくお願いいたします。
メンテ
Re: 3Dモデル(pmd/vmd)の表示について ( No.6 )
名前:管理人 日時:2015/01/18 00:42

Flag_IK を含む各種フラグで、ボーンの計算に使用しているフラグは Flag_Disp と Flag_EnableControl と Flag_AfterPhysicsTransform 以外のフラグ全部です PMXを正しく処理されたいということでしたら、PMDEditor や PMXEditor のパッケージの中の Libフォルダの中にある PMX仕様.txt を読まれることをお勧めします DXライブラリではこちらに書かれていることの一部を再現しているに過ぎないので、 PMXファイルを正しく処理する場合はこちらに書かれている仕様の通りにデータを扱う必要があります
メンテ
Re: 3Dモデル(pmd/vmd)の表示について ( No.7 )
名前:M 日時:2015/01/18 10:31

ご回答ありがとうございます。 モデルをとりあえず表示するのを優先して、フラグ類の実装はしておりませんでした。 教えていただいた情報をもとに実装をしていこうと思います。 実装でまたご質問させていただくかもしれません。 よろしくお願いいたします。
メンテ
Re: 3Dモデル(pmd/vmd)の表示について ( No.8 )
名前:M 日時:2015/02/25 09:32

右腕が反転していた理由はボーンの初期行列をローカルZ/X軸の情報から作成していたためでした。 四元数(0,0,0,1)から生成した回転行列を基に行列を生成したら、正しく表示されました。 これから、物理演算でbullet、IKでCCDの適用を検討しています。 実装でまたご質問させていただくかもしれません。 よろしくお願いいたします。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存