FBXのアニメーションクリップを連結
目次
はじめに
FBXファイルは、複数のアニメーションクリップを含んでいる場合があります。 複数のクリップを含むFBXファイルをGPBファイルに変換すると、どれか1つのクリップしか含まないGPBファイルしか作ることができません。 もちろんこうして作成したGPBファイルをhgimg4で読み込んでも、1つのクリップしか再生できません。
このような問題に対応するため、ここでは複数のクリップを含むFBXファイルから、 全てのアニメーションデータを含んだGPBファイルを作成する手順について解説します。
ここでの解説には、Unityを使用します。未導入の方は導入するか、作業要領だけを真似して他のツールで試行錯誤してみてください。
準備
HSPインストールフォルダの \sample\hgimg4\fbx フォルダにある high_school_girl.fbx ファイルを使用します。
このFBXファイルも複数のアニメーションクリップを含んでいます。
Windows10付属の「3Dビューアー」で表示すると、ウィンドウ右下で3種類のアニメーションを切り替え表示出来るようになっていることで確認できます。
このようにFBXは正常ですが、このファイルからGBPファイルを作成してもhgimg4では走るアニメーションクリップ(run)しか利用できません。 そこで次に説明する作業手順では、このサンプルを使って複数のアニメーションクリップを再生できるGPBファイルを作っていきます。
作業手順 FBXとアニメ読み込み
まずはFBXファイルを読み込んで、読み込んだオブジェクトにアニメーションクリップを適用するところまで説明します。
- Unityを起動して適当なプロジェクトを作成する。
- 作業用の適当なプロジェクトを準備します。
- プロジェクトタブのAssetsに作業用フォルダを作ります。
作らなくても大丈夫ですが、ファイルを整理するために作ります。ここでは tamane フォルダを作成しました。
- HSPインストールフォルダの \sample\hgimg4\fbx から、作成したファイルにファイルをドラッグ&ドロップして登録します。
登録するファイルは次のものです。
high_school_girl.fbx
body.tga
head.tga
- high_school_girl.fbx を掴んでヒエラルキーにドラッグ&ドロップて登録します。
シーンに珠音が表示されました。アニメーションしそうなポーズですが、まだ動きません。キャラクターも白いですが気にしなくて大丈夫です。
- ウィンドウ>アニメーション>アニメーター
アニメータータブが開きます。アニメーションクリップの登録作業を確認するために使用します。
- ヒエラルキーに登録したモデル(high_school_girl)を選択します。
選択ができると、インスペクターに選択したモデルのTransformなどが表示されます。 - Assetsのfbxファイルの▲をクリックして展開する。
- アニメーションのアイコンを1つだけ掴んでインスペクターにドラッグ&ドロップする。
Animatorコンポーネントが追加されます。
Assetsにcontrollerファイル(high_school_girl.controller)が追加されます。
- アニメーションのアイコンが複数あるので、残りのアイコンも1個ずつインスペクターにドラッグ&ドロップする。
余計な場所をクリックすると、ヒエラルキーでのオブジェクト選択が解除されます。解除された場合は、ヒエラルキーで再度オブジェクト(high_school_girl)を選択してください。 - アニメータータブに登録したアニメーションが四角で表示されます。
表示されない場合は、アニメータータブのグリッドの領域をクリックして「A」ボタンを押してください。
ここに表示された四角は、マウスで掴んで移動できます。
ヒエラルキーに登録した high_school_girl にアニメーションが設定されたので、再生ボタンを押すと走るアニメーションだけが確認することができます。 この時点ではまだアニメーションが3つそれぞれ独立した状態です。 この状態でhgimg4に持っていっても走るアニメーションしか使うことができません。
作業手順 アニメーションクリプを連結
読み込んだアニメーションクリップを連結する作業を行います。 方針としては、空のアニメーションクリップに既存のアニメーションクリップのキーフレームを貼り付けてつなげます。 特別なテクニックなどなく、ただ新しいキーフレームを作っているだけです。
- ウィンドウ>アニメーション>アニメーション
アニメーション編集ウィンドウを開く。
- 再生ボタンを押すと、アニメーションが再生されます。
アニメーションを切り替えて再生ボタンを押すと、選択したアニメーションが再生されます。
- 「新しいクリップを作成...」を選択。
適当なファイル名で新しいアニメーションクリップのファイルを作成します。(例:New Animation.anim)
Assetsにファイルが追加されます。
- 既存のアニメーションクリップに切り替えて「Ctrl+A」「Ctrl+C」を続けて押します。
全てコピーします。 - 作成した新しいアニメーションクリップ(New Animation)に切り替えて「Ctrl+V」を押します。
アニメーションがコピーできました。 - 次のアニメーションクリップに切り替えて「Ctrl+A」「Ctrl+C」を続けて押します。
- 作成した新しいアニメーションクリップ(New Animation)に切り替えて再生位置をアニメーションが設定されている最後のコマの次に設定します。
アニメーションが重ならなければいいので、正確に1コマ次ではなく10コマ先でも問題ありません。後で切り分け作業がしやすいように切りが良いフレーム数でもいいと思います。
- 「Ctrl+V」を押します。
アニメーションが連結できました。 - 同様の手順で、全てのアニメーションを連結します。
- 最後に再生ボタンを押して、正常に連結されていることを確認します。
- アニメーション編集ウィンドウを閉じます。
右上の[×]ボタンを押すと閉じることができます。 - アニメータータブを開きます。
先程追加した新しいアニメーションクリップが追加されています。
- 新しく作ったアニメーション以外のアイコンを右クリックして削除を選択することで削除します。
左クリックで選択してDelキーを押すことでも削除できます。
これでアニメーションクリップの連結作業が終わりました。
作業手順 FBX出力とGPB変換
FBXファイルの出力とGPBファイルへの変換作業を行います。
- FBXコンバータを使ってアニメーションを連結したオブジェクト(high_school_girl)をFBXファイルにエクスポートしてください。
アニメーションを含むため、出力時の設定は「Model(s) + Animation」を選択してください。
FBX変換の詳しい手順についてはこちらを確認してください。→ 3DデータをGPBに変換
- 作成したFBXファイルをWindows10標準付属ソフト「3Dビューアー」で表示確認してください。
アニメーションクリップが連結されて1つだけになっていることが確認できます。 - GPBコンバーターでGPBファイルに変換してください。
FBX変換の詳しい手順についてはこちらを確認してください。→ 3DデータをGPBに変換 - resフォルダを作ってgpb、material、tgaファイルを入れ、サンプルからshadersフォルダをコピーして持ってきます。
- 後はhgimg4から呼び出せれば完了です。
hgimg4でアニメーションクリップを切り出す際は、Unityのアニメーション編集ウィンドウに表示されるコマ数を参考にするといいと思います。1コマ1/60秒になっているようです。
ついでに解説。テクスチャにpngファイルを使いたい場合は、少し手間が必要です。まずtgaファイルからpngファイルを作成してください。materialファイルをメモ帳で開き、tgaファイルを指定している部分をpngファイルの名前に書き換えてください。
サンプル
変換後のアニメーション付きGPBファイルと読み込むためのサンプルをダウンロードできるようにしました。
#include "hgimg4.as"
title "HGIMG4 Test"
gpreset
setcls CLSMODE_SOLID, $404040
gpload id_model,"res/high_school_girl_new" ; モデル読み込み
setang id_mode, 0, 3.141592 ; モデルの回転を設定
setscale id_model, 0.1,0.1,0.1
setpos GPOBJ_CAMERA, -30,20,30 ; カメラ位置を設定
;-----------------------------
; アニメーションクリップ
;-----------------------------
; この時点でのアニメーションクリップ
; ID :0
; 名前 :_idle
; フレーム:全フレーム
; 設定されているアニメーションクリップ一覧
; 結果はデバッグウィンドウで確認できます。
repeat
gpgetanim name, id_model, cnt, GPANIM_OPT_NAME
if stat < 0 : break
logmes "ID " + cnt + " : " + name
gpgetanim startf, id_model, cnt, GPANIM_OPT_START_FRAME ; 開始フレーム(ミリ秒単位)
gpgetanim endf, id_model, cnt, GPANIM_OPT_END_FRAME ; 終了フレーム(ミリ秒単位)
gpgetanim duration, id_model, cnt, GPANIM_OPT_DURATION ; 再生の長さ(ミリ秒単位)
gpgetanim elapsed, id_model, cnt, GPANIM_OPT_ELAPSED ; 経過時間(ミリ秒単位)
gpgetanim blend, id_model, cnt, GPANIM_OPT_BLEND ; ブレンド係数(%単位)
gpgetanim isplay, id_model, cnt, GPANIM_OPT_PLAYING ; 再生中フラグ(0=停止/1=再生)
gpgetanim speed, id_model, cnt, GPANIM_OPT_SPEED ; 再生スピード(%単位)
logmes "開始フレーム(ミリ秒単位) : " + startf
logmes "終了フレーム(ミリ秒単位) : " + endf
logmes "再生の長さ(ミリ秒単位) : " + duration
logmes "経過時間(ミリ秒単位) : " + elapsed
logmes "ブレンド係数(%単位) : " + blend
logmes "再生中フラグ(0=停止/1=再生): " + isplay
logmes "再生スピード(%単位) : " + speed
loop
; Name Frame Time
; _idle 0 ~ 225 0 ~ 3766 msec
; run 0 ~ 42 0 ~ 716
; stand 43 ~ 143 766 ~ 2365
; walk 144 ~ 225 2400 ~ 3766
;
; 切り取った結果を結果を再生して時間調整しました。
gpaddanim id_model,"run", 0, 716
gpaddanim id_model,"stand", 766, 2365
gpaddanim id_model,"walk", 2400, 3766
; アニメーションを再生
;gpact id_model, "_idle"
;gpact id_model, "run"
;gpact id_model, "stand"
gpact id_model, "walk"
*main
stick key,15
if key&128 : end
redraw 0 ; 描画開始
;-----------------------------
; カーソルキーでカメラ位置を動かす
;-----------------------------
if key&1 : addpos GPOBJ_CAMERA, -1.0, 0
if key&4 : addpos GPOBJ_CAMERA, 1.0, 0
if key&8 : addpos GPOBJ_CAMERA, 0, 0 , 1.0
if key&2 : addpos GPOBJ_CAMERA, 0, 0 , -1.0
gplookat GPOBJ_CAMERA, 0,14,0 ; カメラから指定した座標を見る
;-----------------------------
; 描画
;-----------------------------
;addang id_model,0,0.02 ; ノード回転
gpdraw ; シーンの描画
color 255,255,255
pos 8,8:mes "HGIMG4 sample"
redraw 1 ; 描画終了
await 1000/60 ; 待ち時間
goto *main
サンプルの補足
複数のアニメーションクリップを確認するためには、次の箇所のコメント部分を使用してください。
; アニメーションを再生
;gpact id_model, "_idle"
;gpact id_model, "run"
;gpact id_model, "stand"
gpact id_model, "walk"
gpaddanim
命令による再生時間の切り分けは、再生結果を確認しながら時間を調整しました。
アニメーションクリップの再生フレーム数から算出するとどうにも計算が合わず。メモした数値を間違えたのかな?
gpaddanim id_model,"run", 0, 716
gpaddanim id_model,"stand", 766, 2365
gpaddanim id_model,"walk", 2400, 3766
滑らかにアニメーションしない問題
サンプルを再生するとすぐに気づくかもしれませんが、アニメーションクリップの再生結果の動きがスムーズではなく、時折ケイレンするような動きをします。 特にwalkの頭部で顕著に見られ、standでは両手、runでは頭が本来ないはずの震える動きをします。
最初はgpaddanim
で切り出す範囲の間違いを疑ったのですが、_idleを再生した場合でも同様の現象が確認できることから切り出し範囲が原因ではありません。
Unityと3Dビューアー上では問題なく再生できるので、エクスポートしたFBXも正常です。
おそらくgpb形式にコンバートする際にうまく変換ができていないのではないかと考えられます。 GPB変換機能もまだまだ開発中なので、まあ仕方ないですね。
まとめ
ここまでに説明した要領で、複数のアニメーションクリップを含んだGPBファイルが作れるようになりました。 使い勝手があまり良くなく、変換品質にも若干問題があるようですが、今のところは出力結果に合わせて調整して使っていくしかありません。
とはいえアニメーションクリップの連結作業は数が多いと大変そうですね。 作業自体は単純作業なので、UnityやBlenderのバッチ機能でできそうな気がします。 ご興味ある方は自作してみてください。