3.ボーンアニメーションの実装とオリジナルフォーマットへの書き出し

今回はBlenderで作ったモデルにアニメーションをつけてModelViewerで動かせるようにします。

Blenderで作成したCollada(.dae)ファイルは1つしかアニメーションを付けられないようなのでモデルとアニメーションをそれぞれ別ファイルとして分割し、オリジナルフォーマットで管理するようにします。

とりあえず前回作ったココのBlenderのモデルにボーンを実装しました。




3つのアニメーションを付けました。




次に、それぞれのアニメーションを設定したColladaファイルを3つ作ります。Blenderでアニメーションを設定し、Export→Colladaで.daeファイルが作成できます。エクスポートの際にサンプリングレートは3~5(適当)に指定するとよいと思います。




それぞれ、coco1.43a.dae、coco1.43b.dae、coco1.43c.daeというファイル名にしました。Blenderのオリジナルファイルおよび書き出したCollada(.dae)ファイルは以下からダウンロードできます。


coco1.43 Blender2.8 file zip2020/06/09download
coco1.43 Collada file zip2020/06/09download





さて・・メインのCha3DCoreLib(茶エンジン)ですが、今回はボーンアニメーションを実装したのでかなりコードが加わっています。ゲーム制作に興味のある方で、エンジンの仕組みを勉強したいとかUnityやUnrealに頼らず全部自作でやるぜ!という奇特な方は参考にしてみてください。


Cha3DCoreLib1.8 zip [windows]2020/06/09download
Cha3DCoreLib1.8 Source zip [windows]2020/06/09download


茶エンジンでは今後オリジナルフォーマットとして、モデル(.mdl)ファイルとアニメーション(.ani)ファイルを使用します。Collada(.dae)ファイルからモデルのみ取り出してmdlファイルとして保存し、同じモデルの別のアニメーションを設定したColladaファイルからそれぞれ別のaniファイルを書き出し、1つのmdlファイルに複数のaniファイルが適用できるようにします。

現在のエンジンのAPIは以下のようになります。色の違う部分が今回追加(修正)したAPIです。

Cha3DCoreLib API一覧 (class CChaDataObject )
CChaDataObject()-3Dデータ格納用オブジェクトを作成します。
bool LoadDAE( wchar_t *path, wchar_t *ext) path: ロードするcolladaファイルのパスを指定します。
ext: ファイル拡張子を指定します。通常はL".dae"で良いと思います。
Colladaファイルをロードします。
bool LoadModel( wchar_t *path ) path: ロードするmdlファイルのパスを指定します。mdlファイルをロードします。
bool LoadAnimation( wchar_t *path ) path: ロードするaniファイルのパスを指定します。.aniファイルをロードします。mdlファイルを先にロードしておかないと失敗します。
bool WriteModel( wchar_t *model_id, wchar_t *path ) model_id:モデルを識別するためのIDを指定します。名前は適当に決めてください。
path: 書き出すmdlファイルのパスを指定します。
現在のモデルをmdlファイルに書き出します。
bool WriteAnimation( wchar_t *target_model_id, wchar_t *animation_id, wchar_t *path ) target_model_id:モデルを識別するためのIDを指定します。WriteModelで指定したmodel_idを指定してください。
animation_id:アニメーションのIDを指定します。適当に決めてください。
path: 書き出すaniファイルのパスを指定します。
ロードしたCollada(.dae)ファイルのアニメーションをaniファイルに書き出します。


Cha3DCoreLib API一覧 (class CChaResourceObject )
CChaResourceObject()-3D表示用のリソースオブジェクトを作成します。
bool CreateResource( ID3D11Device m_pDevice, CChaDataObject *object )m_pDevice: DirectX11デバイスを指定します。デバイスの作成方法が分からない人はModelViewerのソースを参考にしてください。
object: LoadDAE, LoadModelでデータをロードしたCChaDataObjectを指定してください。
CChaDataObjectから画面に表示するための3Dリソースオブジェクトを作成します。
bool Draw( ID3D11DeviceContext m_pDeviceContext )m_pDeviceContext: DirectX11デバイスコンテクストを指定します。デバイスの作成方法が分からない人はModelViewerのソースを参考にしてください。
モデルを描画します。
bool CopyAnimation( CChaDataObject *object ) object: CChaDataObjectを指定します。objectに設定されたアニメーションを一括して読み込みます。
bool CopyAnimation( CChaDataObject *object, int num ) object: CChaDataObjectを指定します。
num: アニメーション要素の番号を指定します。
objectの指定した要素番号のアニメーションを読み込みます。
bool SetCurrentAnimation( int num ) num: アニメーション要素の番号を指定します。指定した要素番号のアニメーションに切り替えます。







次に、実際に動くアプリとしてModelViewerの使い方を説明します。アプリを起動するとデフォルトのココが表示されると思います。これはデフォルトでcoco1.43a.daeファイルを読み込んでいます。

オリジナルフォーマットのmdlファイルおよびaniファイルの作り方は次のようにします。

まず”モデルを読み込む”ボタンで.daeファイルを読み込んでください。今回はサンプルとしてcoco1.43a.daeファイルを読み込みます。colladaファイルにはアニメーションを1つ指定できるので動くファイルもあるかと思います。次に”モデル書き出し”ボタンを押すとmdlファイルが書き出されます。

書き出されたmdlファイルをテキストエディタで開いてみてください。開いたファイル名でMODEL_IDの名前が書き込まれていると思います。coco1.43a.daeファイルを読み込んだ場合coco1.43aと書き込まれていると思います。このIDを一意のID名に書き換えます。とりあえずサンプルではcoco1.43にしました。このMODEL_IDを覚えておいてください。

次に”アニメーション書き出し”ボタンを押すとaniファイルを書き出します。作成されたaniファイルのTARGET_MODEL_IDを確認してください。このIDは現在のモデルのMODEL_IDが記入されます。サンプルではcoco1.43aとなっていると思います。これを先ほど決めたMODEL_IDであるcoco1.43に書き換えます。

新しいaniファイルを作成するためにcoco1.43b.dae、coco1.43c.daeファイルを読み込んでaniファイルを書き出してください。作成されたファイルを開くとTARGET_MODEL_IDがそれぞれcoco1.43b、coco1.43cになっていると思います。このTARGET_MODEL_IDを先ほど決めたcoco1.43で統一します。aniファイルはTARGET_MODEL_IDがモデルのMODEL_IDと一致しないと反映されません。

問題なければ以下のように1つのmdlファイルを使って複数のアニメーションを切り替えられると思います。








以下、今回のModelViewer1.5の実行ファイルおよびソースです。


MovelViewer1.5(exe) zip [windows]2020/06/09download
ModelViewer1.5 Source zip [windows]2020/06/09download
MovelViewer1.51(exe) zip [windows](バグ修正版)2020/07/22download
ModelViewer1.51 Source zip [windows](バグ修正版)2020/07/22download






© 2018 Chafumi Touji