見出し画像

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内から取り出します。

「不変トラックの削除」を無効化して…
パスを設定して再インポートボタンで t-pose.anim が出てくる

▼ 既存のAnimationPlayerを無効化

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

▼ Godotのシーンファイル作成

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

ちゃんとTポーズになってますね
これでようやくGodotで自由に動かせるようになります

■ モーションデータの取り込み

▼ モーションデータのダウンロード

Mixamo で配布されているモーションを再生してみましょう。

まずは UPLOAD CHARACTER でリギング済み.fbxをアップロード
プレビュー画面にアップしたモデルが表示されるようになる

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

ひとまず確認用に Running モーションをダウンロードしてみます。

モーションごとに固有のパラメータで動きを調整可能
"Character Arm-Space" はよく使いそう
Without Skin でダウンロード

▼ モーションデータをGodotに取り込む

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

モデルの組み込み時に作成したボーンマップ bonemap_accurig.tres をそのまま設定
保存パスを設定して "再インポート" で running.anim が出てくる
(画面下のドクロ?を押すとスケルトンの表示ON/OFF、ループモードは後でも設定できるので適当に)

▼ 作成したキャラクターでモーション再生

character.tscn に AnimationPlayer ノードを追加、アニメーションの管理→新規ライブラリ(空文字列でいい)を追加。そこに t-pose.anim, running.anim を加えます。

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

■ 撮影

▼ 撮影セット組み立て

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

キャラクター1体、固定カメラ1台、背景の板を1枚 etc...

背景は緑一色のクロマキーでいいかと思いきや、SCAIL-2が変な挙動になるようなのでダンジョン風にしました。が、これは失敗でした。背景が明るくないと後で背景除去する時の精度が下がります。

後は ビューポートをpng保存 → モーションを少し進める → png保存 → モーション進める → png保存 → モーション進める → 以下略
をするだけのスクリプトを書いて完了です。

歩きモーションを正面から撮影 (した連番pngを縮小&アニメGIF化)
走りモーションを横から撮影 (した連番pngを縮小&アニメGIF化)

なんというか首を振りすぎですね...
リアル寄りのMixamoモーションをちびキャラで動かしているから頭の動きが目立ってしまうんだと思われます。こちらは後で別途対策します。

▼ SCAIL-2特有の制限について補足

SCAIL-2 (というかベースになったWAN2.1?) は 4の倍数+1 コマのフレーム数(1, 5, 9, 13, 17, 21, ... 略)じゃないと生成できない、という制限があるようです。なので例えば8コマのアニメーションだったとしても9フレームになるよう余計なフレームを最後に付け足してパディングするようにしています。
このパディングフレームはSCAIL-2実行後に手動で消す想定です。

■ SCAIL-2でモーション転送

ようやくSCAIL-2の出番です。
ですが、その前にちょっとだけリファレンス画像を微調整します。

▼ リファレンス画像のサイズ調整

以下の方針で少しサイズ調整します。

  1. 画像サイズは32の倍数ピクセルで

  2. DrivingVideoの解像度は704p (○○ x 704, 704 x ○○ がオススメらしい)

  3. アスペクト比(A:B vs D:E)はなるべく近いほうがいい(多分)

  4. 画像の高さに対する身長比(A:C vs D:F)も近いほうが精度が上がる(気がする)

多分 とか 気がする とか書いているのはマジで正解が分からないためです。
でもなんか体感的に品質が良くなるというか、ぶっちゃけ神頼みというか...

最近インベスターZを読んでるんですがなかなか面白いです

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

■ SCAIL-2実行

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

SCAIL-2 ワークフロー。デカい。
これでも一部の処理をサブグラフで隠してます。

マルチリファレンス(複数画像参照)に対応してますが、3枚以上キャラクター画像を指定しても効果が無いかも? リファレンス画像は1~2枚(可能なら1枚)で、後はプロンプトで動作や特徴を補助するのが良さそうです。

実行結果がこちら。
けっこうガチャが必要な印象でした(口がパクパク動いたり変なエフェクトが出てきたりする)。

「An anime girl in a maid outfit is walking towards the viewer.」
Tポーズよりも手を下げた状態のリファレンス画像を指定したほうが精度が良さそう
「An anime girl in a maid outfit is walking to the left.」
「An anime-style girl in a maid outfit has her back to the viewer and is walking towards the background. Her gaze is fixed straight ahead.」
なぜか顔を見せようとしてくるのでプロンプトで抑え込んでます。
3Dモデルは真後ろからでも耳が見える髪型にしたほうがいいかも知れません。

モーションが可愛くないのでのっしのっし歩く感じになってますが、概ねいい感じではないでしょうか。特に指示も無く髪やスカートが物理演算ぽい挙動になるのもいいところです。
画像を小さくし、目を細めて見ると、、、まるで2Dゲームのキャラクターのようです (言いすぎ)


今回はここまで。
次回、頭が動きすぎるモーションを調整し、最後の仕上げに入ります(予定)。


いいなと思ったら応援しよう!