CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

Plaskで取得したbvh形式モーションをglb形式のアバターに適用させる方法

数ヶ月前より、Plaskというサービスが出ています。

Plask

これは、スマートフォンなどのカメラで撮影した人の動き (モーション) をアップロードすると、Humanoidアバターにモーションを割り当ててくれるWebサービスです。

割り当てたモーション付きのアバターをダウンロードすることもできます。ただ、私の確認漏れかもしれませんが、plask上に任意のアバターをアップロードしてモーションを割り当てようとしたのですが、うまくいきませんでした。

そこで、今回はplaskで生成されたモーションデータをBlenderを使ってglb形式のアバターに割り当てる方法をまとめました。

なお、今回のまとめは、WebGL系などUnityではない開発環境を使っている方向けです。Unityを使っている場合はこのような手順を実行しなくても簡単にモーションデータを割り当てることができます。これについても後ほど紹介します。

今回使用した環境

・Unity 2019.4.12f1

・Blender2.93

・アバター作成はReady Player Meを使用

1. Plaskでできること

まずはPlaskでできることの説明です。
以下の公式マニュアルに説明がありますが、基本的にはこの4つです。

plasticmask.notion.site

Motion Capture: 動画からモーションを生成する

Retargeting : 生成したモーションをHumanoidアバターに割り当てる

Edit Keyframe:生成したモーションを修正する

Export : モーション、およびモーション付きアバターを出力する。形式はobj、fbx、glb、bvh (=モーションデータのみ)

2. Plaskを使うための準備と基本的な使い方

こちらの記事にサインアップの方法から詳しく書かれているのでご参考ください。
今回は、Unreal Engineを使う前までの内容を参考にさせていただきました。

zenn.dev

3. ざっと調べてわかったこと

3.1 2022/3/26時点では、任意のアバターにモーションを割り当てることができない

2022/3/10時点では、プリセット表示されているアバターにモーションを割り当てて出力することはできるのですが、任意のアバターをインポートすると、このようにマシュマロ?みたいな表示になります。

A glb format file is failed to upload in plask.ai

マシュマロ?の中には本来の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でも動作を確認しました。

nn-hokuson.hatenablog.com

Plaskからはbvhのみを生成し、このbvhをBlenderで開きました。このBlenderの.blenderプロジェクトをそのままUnityにインポートして、別途準備したfbx形式のアバターにbvhを割り当てました。

Attached bvh motion in Unity

【Unreal Engineの場合】

こちらの記事の後半に書かれています。
zenn.dev

なお、UnityとUnreal Engineを使わずに、bvh形式で生成されたモーションを任意のアバターに割り当てる方法は、plaskの公式マニュアルには記載がありません。

そのため、Plaskの使い方を紹介している記事を探しましたが、Unity、Unreal Engine以外だとプリセットアバターを使った例しか見つけられませんでした。

babylonjs.medium.com

ここからが本題になりますが、いろいろ試した結果、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のアドオンを有効にします。

bvh importing add-ons

ファイルを選択する画面ではいくつかオプションがあります。今回使ったアバターはReady Player Meから生成しました。Ready Player Meとサイズを合わせるには、このように選択します。

scale : 0.009

update fps : チェックをつける

loop: チェックをつける

続いて、Ready Player Meで作ったglb形式のアバターもインポートします。それぞれの位置を調整して隣に並べておきます。

A bvh data and a glb format avatar in Blender

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を重心に移動させることができます。

How to show origin to geometry in Blender 2.9

Originの移動前と移動後です。bvhとglbのそれぞれで行います。

Before/After of Origin to Geometry in Blender2.9

4.4 BlenderのMotion Capture Toolsを使って、bvh形式のモーションをglb形式のアバターに割り当てる

このようなモーション割り当てをリターゲッティングと呼ぶようです。リターゲッティングの方法は、こちらの黒城ナディアさんのツイートが具体的かつ丁寧なので引用させていただきます。

noteにまとめていただいていますので、こちらも引用いたします。

kurokinadir.fanbox.cc

記載の通り、Blender2.9の場合はMotion Capture ToolsをGitHubから取得する必要があります。

ここまでの手順により、Blenderの中でbvh形式のアニメーションをglb形式アバターに割り当てることができます。

いくつか補足します。

■bvh、glbの順番に選択して、「Guess Hierarchy Mapping」をクリックすると、ある程度のボーンは自動的に割り当ててくれる

画像の通りです。

'Guess Hierarchy Mapping' option in Blender 2.93 and Motion Capture Tools

いくつか空欄になっているので、ここは手動で割り当てることになります。

■手動でボーンを割り当てるときは、ArmatureのViewport Displayで Showカテゴリの "Names"オプションにチェックを入れてボーン名称を見えるようにする

こちらを参考にさせていただきました。
note.com

Armature Viewport Display in Blender2.93

glb形式のモデルを選択してから同様の操作を実行し、glb形式のアバターでもボーン名称が見えるようにします。

■glb形式のアバターでは、ボーンが常に表示されるようにしておく

アバターのボーンが見えないと手動割り当てがしづらいので、常にボーンが見えるようにします。

Armature Viewport Display and infront option in Blender2.93

この画像だと一部のボーン名称が被って見えなくなっていますが、拡大していけば見えるようになります。

一通り割り当てたらRetargetting!ボタンを押します。少し待ちますが、完了するとモーションが割り当てられ、アバターの姿勢が変化します。

Retargetted avatar motion in Blender 2.93

Avatar motion example in Blender2.93

5. おわりに

思ったよりも量が多くなったので、この後のアニメーション付きglbを出力する手順については次の記事にしたいと思います。