AIで2Dゲーム用スプライトを作る #3
第三回です。
前回はモーション撮影用の3Dモデルを作成しました。
作成した3DモデルをGodotEngineで動かして動画 (実際は連番PNG) を撮影できるようにします。Godotを使う理由はなんか軽くてシンプルだから好き、というだけです。固定カメラで任意モーションをコマ撮りできれば何でもいいのでUnityやUnrealEngine、Blender等々でも同じ事が出来ると思います。
■ キャラクターのFBXをGodotに取り込む
AccuRigからエクスポートした.fbxをGodotのプロジェクトに追加して開きます。

▼ リターゲット
まずリターゲットを行います。AccuRigが付けたボーン名 => Godotが扱うためのボーン名 にマッピングを行う作業です。

このBoneMapはこのあと何度も使うので別ファイルに保存しておく。
"BoneMap" を右クリック → 名前を付けて保存 → bonemap_accurig.tres
▼ レストポーズ設定
次にレストポーズ(基本姿勢)を設定します。画面左側ツリーでSkeleton3Dを選択し、レストポーズを UseAnimationPlayer, 0_T-Pose にします。
Tポーズを基本姿勢にしないとアニメーションが崩れます。

▼ Tポーズアニメを取り出す
姿勢リセット等で使いたいのでTポーズアニメをFBX内から取り出します。


▼ 既存のAnimationPlayerを無効化
次にAnimationPlayerを「インポートしない」に設定します。
モーション再生にAnimationPlayer自体は必要ですが、自前で用意しないと不便 (というかFBXを再インポートするたびに設定がリセットされるので実質使えない) なのでこちらは一旦消します。

▼ Godotのシーンファイル作成
Godotのファイルシステムから.fbxを右クリック→「新しい継承シーン」で.tcsnを作成します。この.tscnが撮影用のキャラクターになる想定です。


これでようやくGodotで自由に動かせるようになります
■ モーションデータの取り込み
▼ モーションデータのダウンロード
Mixamo で配布されているモーションを再生してみましょう。


最初プレビューが再生されない状態 (LOADING...から進まない) になって困りましたが、FBXをBlenderで開き直し → アニメーションを含まずにFBXエクスポート したら正常に動きました。でもこれはおま環な気がします。参考までに。
ひとまず確認用に Running モーションをダウンロードしてみます。

"Character Arm-Space" はよく使いそう

▼ モーションデータをGodotに取り込む
Mixamoからダウンロードした.fbxをGodotのプロジェクトに追加して開きます。ここでもリターゲットが必要になります。


(画面下のドクロ?を押すとスケルトンの表示ON/OFF、ループモードは後でも設定できるので適当に)
▼ 作成したキャラクターでモーション再生
character.tscn に AnimationPlayer ノードを追加、アニメーションの管理→新規ライブラリ(空文字列でいい)を追加。そこに t-pose.anim, running.anim を加えます。

これでキャラクターを動かせるようになりました。

■ 撮影
▼ 撮影セット組み立て
メインシーン(main.tscn)を作成し、撮影セットを構築します。

背景は緑一色のクロマキーでいいかと思いきや、SCAIL-2が変な挙動になるようなのでダンジョン風にしました。が、これは失敗でした。背景が明るくないと後で背景除去する時の精度が下がります。
後は ビューポートをpng保存 → モーションを少し進める → png保存 → モーション進める → png保存 → モーション進める → 以下略
をするだけのスクリプトを書いて完了です。


なんというか首を振りすぎですね...
リアル寄りのMixamoモーションをちびキャラで動かしているから頭の動きが目立ってしまうんだと思われます。こちらは後で別途対策します。
▼ SCAIL-2特有の制限について補足
SCAIL-2 (というかベースになったWAN2.1?) は 4の倍数+1 コマのフレーム数(1, 5, 9, 13, 17, 21, ... 略)じゃないと生成できない、という制限があるようです。なので例えば8コマのアニメーションだったとしても9フレームになるよう余計なフレームを最後に付け足してパディングするようにしています。
このパディングフレームはSCAIL-2実行後に手動で消す想定です。
■ SCAIL-2でモーション転送
ようやくSCAIL-2の出番です。
ですが、その前にちょっとだけリファレンス画像を微調整します。
▼ リファレンス画像のサイズ調整
以下の方針で少しサイズ調整します。

画像サイズは32の倍数ピクセルで
DrivingVideoの解像度は704p (○○ x 704, 704 x ○○ がオススメらしい)
アスペクト比(A:B vs D:E)はなるべく近いほうがいい(多分)
画像の高さに対する身長比(A:C vs D:F)も近いほうが精度が上がる(気がする)
多分 とか 気がする とか書いているのはマジで正解が分からないためです。
でもなんか体感的に品質が良くなるというか、ぶっちゃけ神頼みというか...

という事で、
・ DrivingVideo ... H1024 x W704
・ RefImage ... H1344 x W928
こんな感じでサイズをざっくり調整しました。

■ SCAIL-2実行
ComfyUIに戻ってSCAIL-2を動かしていきます。

これでも一部の処理をサブグラフで隠してます。
マルチリファレンス(複数画像参照)に対応してますが、3枚以上キャラクター画像を指定しても効果が無いかも? リファレンス画像は1~2枚(可能なら1枚)で、後はプロンプトで動作や特徴を補助するのが良さそうです。
実行結果がこちら。
けっこうガチャが必要な印象でした(口がパクパク動いたり変なエフェクトが出てきたりする)。

Tポーズよりも手を下げた状態のリファレンス画像を指定したほうが精度が良さそう


なぜか顔を見せようとしてくるのでプロンプトで抑え込んでます。
3Dモデルは真後ろからでも耳が見える髪型にしたほうがいいかも知れません。
モーションが可愛くないのでのっしのっし歩く感じになってますが、概ねいい感じではないでしょうか。特に指示も無く髪やスカートが物理演算ぽい挙動になるのもいいところです。
画像を小さくし、目を細めて見ると、、、まるで2Dゲームのキャラクターのようです (言いすぎ)
今回はここまで。
次回、頭が動きすぎるモーションを調整し、最後の仕上げに入ります(予定)。
