数ヶ月前より、Plaskというサービスが出ています。
これは、スマートフォンなどのカメラで撮影した人の動き (モーション) をアップロードすると、Humanoidアバターにモーションを割り当ててくれるWebサービスです。
割り当てたモーション付きのアバターをダウンロードすることもできます。ただ、私の確認漏れかもしれませんが、plask上に任意のアバターをアップロードしてモーションを割り当てようとしたのですが、うまくいきませんでした。
そこで、今回はplaskで生成されたモーションデータをBlenderを使ってglb形式のアバターに割り当てる方法をまとめました。
なお、今回のまとめは、WebGL系などUnityではない開発環境を使っている方向けです。Unityを使っている場合はこのような手順を実行しなくても簡単にモーションデータを割り当てることができます。これについても後ほど紹介します。
今回使用した環境
・Unity 2019.4.12f1
・Blender2.93
・アバター作成はReady Player Meを使用
1. Plaskでできること
まずはPlaskでできることの説明です。
以下の公式マニュアルに説明がありますが、基本的にはこの4つです。
Motion Capture: 動画からモーションを生成する
Retargeting : 生成したモーションをHumanoidアバターに割り当てる
Edit Keyframe:生成したモーションを修正する
Export : モーション、およびモーション付きアバターを出力する。形式はobj、fbx、glb、bvh (=モーションデータのみ)
2. Plaskを使うための準備と基本的な使い方
こちらの記事にサインアップの方法から詳しく書かれているのでご参考ください。
今回は、Unreal Engineを使う前までの内容を参考にさせていただきました。
3. ざっと調べてわかったこと
3.1 2022/3/26時点では、任意のアバターにモーションを割り当てることができない
2022/3/10時点では、プリセット表示されているアバターにモーションを割り当てて出力することはできるのですが、任意のアバターをインポートすると、このようにマシュマロ?みたいな表示になります。
マシュマロ?の中には本来の3DCGモデルが表示されているのですが、ここにplask上で生成されたモーションをドラッグするとエラーが出ます。
Application error : a client-side exception has occurred (see the browser console for more information)
3/26時点では、マシュマロ?表示はなくなりました。しかし、plaskで生成されたモーションをドラッグすると、アバター自体が消えてしまい、やはりモーション割り当てはできませんでした。
3.2 2022/3/26時点では、エクスポートできるのは、プリセットアバター and/or 生成モーションのみ
2.1と関連しますが、plask上では任意のアバターにモーションを割り当てることができませんでした。一方、プリセットされているアバターには割り当て可能であり、割り当てたアバターをfbxやglb形式で出力することができます。また、bvh形式でモーションデータのみを出力も可能です。
3.3 UnityとUnreal Engineの中であればプリセットアバター and/or 生成モーションを使って、任意のアバターにモーションを割り当てることができる
【Unityの場合】
2016年の記事ですが手順に沿って進めたところ、Unity 2019.4.12f1でも動作を確認しました。
Plaskからはbvhのみを生成し、このbvhをBlenderで開きました。このBlenderの.blenderプロジェクトをそのままUnityにインポートして、別途準備したfbx形式のアバターにbvhを割り当てました。
【Unreal Engineの場合】
こちらの記事の後半に書かれています。
zenn.dev
なお、UnityとUnreal Engineを使わずに、bvh形式で生成されたモーションを任意のアバターに割り当てる方法は、plaskの公式マニュアルには記載がありません。
そのため、Plaskの使い方を紹介している記事を探しましたが、Unity、Unreal Engine以外だとプリセットアバターを使った例しか見つけられませんでした。
ここからが本題になりますが、いろいろ試した結果、Blenderを使用しglb形式であればBabylon.jsでも再生させることができました。
このやり方を解説していきます。
4. bvh形式モーションをglb形式のアバターに適用させる手順
4.1 Plaskからbvh形式のモーションをexportする
Plaskで生成したモーションで右クリックし、Exportでbvhを選んでexportします。
4.2 Blenderでbvh形式のモーションをimportする
exportしたらBlenderを開き、File > Importでbvhファイルを選択します。
もしimportの選択肢の中にbvhがない場合、Edit > Preference > Add-ons でbvhのアドオンを有効にします。
ファイルを選択する画面ではいくつかオプションがあります。今回使ったアバターはReady Player Meから生成しました。Ready Player Meとサイズを合わせるには、このように選択します。
scale : 0.009
update fps : チェックをつける
loop: チェックをつける
続いて、Ready Player Meで作ったglb形式のアバターもインポートします。それぞれの位置を調整して隣に並べておきます。
4.3 bvh形式モーションとglb形式のアバターそれぞれでOrigin to Geometryする
OriginとはWorld座標系でのそのデータの原点位置です。xyzのgizmoの原点です。import直後だと、bvhモーションもglbアバターもOriginがバラバラです。この状態でモーションを割り当てると後述の「Guess Hierarchy Mapping」があまり機能してくれなかったので、Originを揃えておきます。
Blenderでは対象を選択してから、Object > Origin > Origin to Geometryを実行すると、Originを重心に移動させることができます。
Originの移動前と移動後です。bvhとglbのそれぞれで行います。
4.4 BlenderのMotion Capture Toolsを使って、bvh形式のモーションをglb形式のアバターに割り当てる
このようなモーション割り当てをリターゲッティングと呼ぶようです。リターゲッティングの方法は、こちらの黒城ナディアさんのツイートが具体的かつ丁寧なので引用させていただきます。
Blenderの標準で使える機能とアドオンでモーションデータをリターゲティングできる!すごいぞBlender!!
— 黒城ナディア@VTuber⚡🥦 (@KurokiNadir) 2020年4月22日
(Blender2.81以降必須、アドオンを有効にするのを忘れずに!!)
◆必要なアドオン・機能
・標準のbvhインポート機能
・Motion Capture Tools
・Simplify Curves+ pic.twitter.com/wyJjyJ1g3j
noteにまとめていただいていますので、こちらも引用いたします。
記載の通り、Blender2.9の場合はMotion Capture ToolsをGitHubから取得する必要があります。
ここまでの手順により、Blenderの中でbvh形式のアニメーションをglb形式アバターに割り当てることができます。
いくつか補足します。
■bvh、glbの順番に選択して、「Guess Hierarchy Mapping」をクリックすると、ある程度のボーンは自動的に割り当ててくれる
画像の通りです。
いくつか空欄になっているので、ここは手動で割り当てることになります。
■手動でボーンを割り当てるときは、ArmatureのViewport Displayで Showカテゴリの "Names"オプションにチェックを入れてボーン名称を見えるようにする
こちらを参考にさせていただきました。
note.com
glb形式のモデルを選択してから同様の操作を実行し、glb形式のアバターでもボーン名称が見えるようにします。
■glb形式のアバターでは、ボーンが常に表示されるようにしておく
アバターのボーンが見えないと手動割り当てがしづらいので、常にボーンが見えるようにします。
この画像だと一部のボーン名称が被って見えなくなっていますが、拡大していけば見えるようになります。
一通り割り当てたらRetargetting!ボタンを押します。少し待ちますが、完了するとモーションが割り当てられ、アバターの姿勢が変化します。
5. おわりに
思ったよりも量が多くなったので、この後のアニメーション付きglbを出力する手順については次の記事にしたいと思います。