見出し画像

[VRM]Unityで高画質自撮り:既存モーション+物理演算ベイク

この記事では以下の事を取り扱います。Unityのバージョンは 2019.4.31f1

  • Unity Recorder を使った高画質png、透過png出力方法

  • 物理演算結果のベイク(記録)方法

  • 既存モーションからの Animation Clip の抽出方法

  • Timelineを使った、より便利な Animation Clip 制御方法

前書き

VRMキャラクターをもっと凝ったアングルやモーションで撮影したいと思ったとき用の備忘録。Mixamoなどの既存のモーションデータを適用することで、手軽に見栄えの良いポーズをとらせることができます
さらに Unity Recorder で物理演算をモーションとしてベイク(記録)することで、物理演算の難点である「巻き戻しができない」を克服し、好きなように一時停止や巻き戻ししつつ、カメラを周回させて最適なアングルを探すことができます

透過png出力結果(黒背景)

この方法はUnity用のMMDモーション読み込みツール"MMD4Mecanim"でもほぼそのまま利用できます。MMDモーションには凝ったものが多いので、利用すれば映えるスクショの大きな助けとなるでしょう
ただし、モーションデータ利用の際は利用規約に注意してください

今回は ひゅうがなつみかん さんの販売アバター「リーファ」ちゃんのVRM版を利用しています

Mixamoでのダウンロードと Animation Clip 抽出

  1. Mixamo にログイン

  2. モーションを検索し Download を選択

  3. FBX for Unity → Without Skin で Download

  4. 上記ファイルをUnityのアセットウィンドウにドラッグ&ドロップ

  5. 上記ファイルを選び、インスペクタから Rig → Humanoid → Apply

  6. 上記ファイルのツリーを開き、Animation Clip を選び [Ctrl + D]

上記サイトでゲーム向きのモーションデータが無料で公開されています。Adobeのアカウントがあればそれで、無ければアカウントを新規作成します。今回は Hip Hop Dancing のモーションを使います

Mixamo サイトは直感的に利用できると思います。調整用に様々な項目がありますが、今回は特に弄らずにそのまま Download に進みます

FBX for Unity、60fps、Without Skin、を選択
モデルデータも欲しい場合は With Skin を選択します

Unityへの導入と Humanoid Rig への変換

Unityを開き、落としたファイルをアセットの適当なフォルダにドラッグ&ドロップして導入します

落としたファイルをクリックし、インスペクタの RigAnimation TypeHumanoid に変更し、Apply をクリックします。やや時間がかかった後にHumanoid への変換が完了します
通常この後は Humanoid 用ボーンの割り当て修正作業がありますが、Mixamo の FBX for Unity で落としたモーションであれば大抵は無調整で使えるので、そのまま次に進みます

Animation Clipの抽出

落としたファイルのツリーの中に、三角形のアイコンがあります。これが Animation Clip というアニメーションの構成単位です
これを選択し [Ctrl + D] を押すことで Clip だけを取り出すことができます。マウス操作の場合、Clip を選択して メニュー → Edit → Duplicate です

今回の例では全身を制御するモーションですが、Animation Clip は本来は小さな構成単位であり、複数の Clip を混ぜ合わせて使用することが可能です。実際に後の物理ベイクで似たようなことを行います

タイムラインの作成と Animation Clip の適用

  1. アセットウィンドウで右クリック → Create → Timeline

  2. 作成したタイムラインをヒエラルキーにドラッグ&ドロップ

  3. メニュー → Window →Sequencing → Timeline でタイムラインウィンドウを表示(またはアセットのタイムラインをダブルクリックで表示)

  4. ヒエラルキーのタイムラインを選んで、右端のロックボタンでロック

  5. VRMをタイムラインにドラッグ&ドロップし [Add Animation Track]

  6. 先ほど抽出した Animation Clip をタイムライン上にドラッグ&ドロップ

  7. VRMにモーションが適用される

アセットで右クリック → Create → Timeline でタイムラインを作成します。このタイムライン機能を使うことで、VRMへの Animation Clip の割り当てやタイミング制御を簡単に行うことができます

一般的にはここで Animator Controller を作成して、そこに Animation Clip を登録する、という説明が多いのですが、今回の用途だとタイムラインのほうが使いやすいと思うので今回は割愛します

アセットにあるタイムラインをヒエラルキーにドラッグ&ドロップします
実際の作業は「ヒエラルキー上にあるタイムライン」に対して行う点に注意してください。ヒエラルキー上にあるものとアセット側にあるタイムラインとは別物として扱われます
「何かおかしいな」と思ったら、ヒエラルキー上にあるタイムラインを選択しているか確認してみましょう

タイムラインを編集するため、専用のタイムラインウィンドウを開きます。メニュー → Window → Sequencing → Timeline を選択するか、アセット側のタイムラインをダブルクリックします

タイムラインウィンドウのタブをドラッグ&ドロップして適当な場所に設置します。次にヒエラルキー上のタイムラインをクリックした後、右側の南京錠のアイコンをクリックしてロック状態にします
ロック状態にすることで、選択したものに関わらず常にタイムラインが表示されるようになります
この操作はインスペクタウィンドウにも有効なので覚えておくと便利です

タイムラインの編集をしていきます
VRMをタイムラインにドラッグ&ドロップするとメニューが出るので、Add Animation Track を選択します。このトラック上に Animation Clip を置いていくことで時間軸に沿ってアニメーションを設定していきます
先ほどダウンロードした Hip Hop Dance の Animation Clip を配置し、再生ヘッドを動かしていい感じのフレームを見つけましょう

メインカメラの設定と動かし方

  1. Sceneビューとメインカメラの Field of View を同じ値にする

  2. メインカメラのインスペクタで Clear Flags を Solid Colorにする

  3. Solid Color の設定のAlpha値を0にする

  4. Clipping Planes を0.01にする

  5. Gameビューで所望のアスペクト比に設定

  6. Sceneビューでカメラを動かして好みのアングルに設定

  7. ヒエラルキーで Main Camera を選択して [Ctrl + Shift + F]

  8. Gameビューにして結果を確認

スクショ撮影のためにメインカメラとSceneビューを調整します
Sceneビューでの見え方をメインカメラと一致させるため、Field of View を同じ値に設定します
次に透過用の設定(透過しない場合でも無問題)として、メインカメラのインスペクタで Clear Flags を Solid Color にし、色設定を開いてAlpha値を0にします
最後にカメラの近くを自動で非表示にする Clipping Planes を0.01にします。スクショ撮影時にカメラを寄せることがあるので、勝手にキャラが欠けると困るためです

なお今回は背景色をグリーンバックにしましたが、透過png出力時に微かながら背景色が混じるため、出力前に白または黒にしたほうが良いかもしれません

Gameビューでアスペクト比を設定します
一般的には16:9ですが画像の用途に合わせてえらびましょう

これでSceneビューとメインカメラの設定が一致したのでスクショアングル探しに入れます。Sceneビューでカメラを動かし、良いアングルが決まったら、ヒエラルキー上で Main Camera を選んだ状態で [Crtl + Shift + F] を押すと、メインカメラがSceneビューと同じ位置に移動します
Gameビューにして結果を確認しておきましょう。あらかじめウィンドウサイズを調整して、SceneビューとGameビューの表示範囲を似せておくと作業が楽です

リーファちゃんかわいい

Unity Recorder の設定

申し訳ありませんが、あまりに長い&同じことの繰り返しなるため冒頭のまとめはありません。下記を参考に設定願います

まず Unity Recorder を導入します。Unity公式の機能です
メニュー → Window → Package Manager を開き、Unity Registryを選択し、"Record"あたりで検索すると出てくるので Install します

インストールした Unity Recorder 本体を開きます
メニュー → Window → General → Recorder → Recorder Window で開き、タイムラインのとき同様にウィンドウを配置します

  • Recording Mode → Single Frame(1フレームだけの出力)

  • Target Frame → 0(最初のフレーム)

  • Playback → Constant、Target FPS → 60、Cap FPS → チェック入れる

  • Add Recorder → Image Sequence を追加

  • Source → Targeted Camera、Camera → Main Camera

  • Aspect Ratio → Gameビューで設定したアスペクト比と同じ

  • Output Resolution → 8k

  • Media File Format → PNG

  • 透過pngにする場合 → Include Alpha にチェック入れる

  • Output File の項目を適当に設定

Sourceを Targeted Camera に設定することで8k出力することができます

先ほどの設定で Target Frame を0に設定したので、タイムラインの一番最初のフレームが出力されることになります。それに合わせてタイムラインを短縮します
まず再生ヘッドの所までクリップの左隅をドラッグして短縮します(スナップが効くので自動でヘッドの所で止まります)、次にクリップ自体をドラッグしてタイムラインの左隅に押し付けます。これで目当てのフレームが0フレームになりました

なぜこうするのかというと、Unity Recorder が出力時に必ずタイムラインの最初から再生する挙動をとるためです。たとえば1000~2000フレームを出力範囲として設定した場合、Unity Recorder は0~999フレームまでを通常通り再生して1000フレームまで進んでから出力を開始します。これは試行錯誤には不向きなので、目当てのフレームを0フレームに設定するわけです

ただし後述する物理演算のベイクでは初期化時に物理が荒ぶるため、実際のモーション開始前に1~2秒程度の空白時間を要する場合があります(クリップを少し右側にずらすことで容易に設定可能です)

あとはウィンドウの録画ボタン、または Start Recording ボタンで出力が開始されます。ややタイムラグがあるので連打しないよう注意

物理演算を停止した状態で出力する場合

場合によっては物理演算無しで出力したほうが良い場合もあります。物理演算無しの場合、ヒエラルキーでVRMの secondary を選び、インスペクタのチェックを外して Spring Bone を無効化しておきます。後は Unity Recorder のStartボタンを押せば、Output~で指定した場所にファイルが作成されます

出力したリーファちゃんを雑にNovelAI製背景と合わせた例。透過pngでの出力なので簡単に合成ができます(他いくつか加工有り)

物理演算のベイク(記録)

物理演算をモーションデータとしてベイク(記録)するため、今度はタイムライン側で Unity Recorder を制御します
タイムラインの空きトラックで右クリック → ~Timeline → Recorder Track を選択して Unity Recorder の制御用トラックを追加します

物理演算を記録するためVRMの secondary を適用しておきます
次にタイムラインの Recorder 制御用トラックで右クリックし、Add Recorder Clip で制御用Clipを追加します

Recorder Clip の設定を行います。インスペクタ側で設定を行う点に注意

  • Selected Recorder → Animation Clip

  • GameObject → 対象VRM

  • Record Hierarchy → チェック有

  • Anim.Compression  → Lossy

設定が終わったら、Recorder Clip の長さをダンスモーションと同じ長さにします

あとはGameビュー側の再生ボタンを押すと、Recorder Clip で指定した部分が自動で録画され、物理演算だけの Animation Clip が生成されます
タイムライン上の Recorder Clip を消すかミュート状態にしないと再生するたび記録されてしまうので注意してください

厳密には物理演算だけではなく体のモーションも記録されているのですが、 Unity Recorder で記録されるのは Generic Rig 形式のため、Humanoid Rig のVRMには体の動きが適用されません。結果的に物理演算部分だけが残ることになります
Mixamo モーションを Humanoid 変換した時と同じ要領で変換することもできますが、そうすると今度は物理演算部分がおかしくなるため、素直に物理ベイクと割り切って使うほうが無難そうです

巻き戻しや一時停止が可能になった

記録が終了したら、対象VRMの Animation Track をもう一つ追加し、そこに先ほど記録した Animation Clip を追加します。元のモーションデータと同位置に配置することで、体の動きに物理演算モーションが追加で読み込まれ、自由に巻き戻しやスキップが可能となります
スクショ撮影時にはGameモードで物理演算が実行されてしまいます。VRM側の物理は無効化しておきましょう

ところで記録した物理トラックのみ再生したことのある人は「体全体の回転情報が入ってるけど大丈夫?」と思う筈ですが、結論からいうと問題ありません
Animationトラックで同じキャラ&同じ部分のキーフレームは「より下のトラックで上書き」されるようなので、体の回転が加算されて破綻したりはしないようです

!注意! 物理ベイクはファイルサイズが大きいです
4分のMMD動画で物理ベイクするとLossyでもクリップサイズ500MB、Losslessを選ぶと2GB近くのファイルになります。当然処理時間もかかるためクリップ書き込み時と読み込み時には数分間応答無しになることもあります
あらかじめ必要な場所を絞って短時間にする、複数に分ける、破綻は画像編集で直すことにして30fpsで記録する、などで軽量化できます

お疲れ様でした。記事にすると長いですが理屈がわかれば難しくはないので、様々な使い方ができると思います

この記事が気に入ったらサポートをしてみませんか?