DirectXでAssimpによるモデル読み込みでかなりつまづいた点を紹介します。
目的
3Dアニメーションの読込を行いボーンアニメーションを再生する。
最初に行ったモデル読込
const aiScene* scene = aiImportFile(fileName,
aiProcessPreset_TargetRealtime_MaxQuality | aiProcess_ConvertToLeftHanded);
aiImportFileで簡単にロードしていましたがこれはボーンアニメーションを行う際ひとつ問題が生まれます。
それは元々なかったノードが追加されるということです
追加されるノード
元々のボーン構成
FBXモデルのボーン構成だとします。
RootからHipが繋がっており、Hipには子は存在しないです。
aiImportFileされた後の構成
なにやらよくわからないものがついてます。
『元々のボーン名 + Assimp_FBX + ****』というノードが追加されました。
これらはAssimpでFBXファイルを読み込む際にAiNodeだけで保持できないFBX形式についてる情報を補間するためのノードです。
ただ私の場合追加されるノードは不必要ですし、残しておいてもいいことはあまりないのでこれを追加しないロード方法が必要です。
追加ノードを無効にするモデル読込
Assimp::Importer importer;
importer.SetPropertyBool(AI_CONFIG_IMPORT_FBX_PRESERVE_PIVOTS, false);
const aiScene* scene = importer.ReadFile(fileName
, aiProcessPreset_TargetRealtime_MaxQuality | aiProcess_ConvertToLeftHanded);
Assimp::Importerを用いてロード方式の設定を行っています。
SetPropertyBoolメソッドで特定の要素の値を設定できるので追加ノードを作らないようfalseにしました。
さて、あとはaiSceneを用いてデータ抜き出して描画すればいっか!と思っていましたがなぜかエラーがでる!
原因
Importerが破棄されるとSceneも破棄される!
すごく単純でした...orz
クラスのメンバ変数にImporter入れるとか変数の寿命を延ばせばいいだけですね。
おわり
新しく使うものはよく調べましょう
でないとこれで二時間も溶かした私みたいになります。