アバターを現実どおりに動かす「モーションフィルター」とは!?
こんにちは。バーチャルキャスト開発部のおぐらです!
バーチャルキャストのキャラクター制御まわりを主に担当しております。
今回はバージョン1.8.1aから実装された「モーションフィルター」の内容について説明していきます!
一部内容を説明するにあたってプログラムも出てきますが、ユーザーの方々にも広く理解できるようになるべくプログラムを使った説明はしないようにしていきます。
モーションフィルターとは
現実の肉体とVR空間のアバターとの間には、少なからず体格差が生まれます。
身長、腕の長さ、脚の長さ、肩幅… さまざまな箇所で差が生まれるため、現実のポーズをそのままアバターに反映させることは難しいです。
バーチャルキャストのようにアバターを操作するVRアプリを体験したことがある方、こんな経験はないでしょうか?
- 現実では腕が伸び切っていないのに、アバターの腕はピンと伸び切ってしまう現象
- 腕を曲げる時に、急にカクンッ!と肘が曲がってしまう現象
- 頭身の低い着ぐるみのようなアバターを使って、腕が身体の中に埋まってうまく操作できない現象
これらの現象は、リアルとアバターとの間に生まれる体格差が原因です。
せっかくお気に入りのアバターを着ても、うまく動くことができなかったら楽しさも半減…
そんな悲しみを減らすために生まれたのがこの「モーションフィルター」です。
モーションフィルターの効果はこちらの動画をご覧ください。
モーションフィルターの効果を動画で説明してみました。
効果が分かりやすいように腕を長くしたモデルを使っています。ダンスや筋トレなどの『動きを見せたい』時に是非使ってみてください。#バーチャルキャスト pic.twitter.com/IZAshslHz3— バーチャルキャスト@VirtualCast (@virtual_cast) November 28, 2019
リアルの腕よりアバターの腕の方が長いので、モーションフィルターを使わない場合ではリアルの腕を伸ばし切ってもアバターの腕は伸び切りません。
しかし、モーションフィルターを使っている右側のアバターは、リアルと同様に腕を伸ばし切ることができています。
こういった、腕の長さや脚の長さ、肩幅などの差を考慮した動きを実現できるのがモーションフィルターです。
今回の解説では、腕の処理に着目して解説を進めていきます。
モーションフィルターは内部で何をしているのか
簡単に言うと以下の4要素を使って、手足の位置を制御するIKポイントの位置を書き換えています。
(現実の体格に合ったモデルを用意してHumanPoseをアバターに同期させる手も考えましたが、操作性や接地感が壊滅的になるため、IKポイント位置を矯正する方式にしました)
- アバターの肩の座標
- アバターの腕の長さ
- リアルの腕の伸び具合(0~1で表現。腕が伸び切った状態を1とします)
- リアルの肩位置からコントローラー位置へ向かうベクトル(以下「腕のベクトル」といいます)
この4要素の算出は後で詳しく記述します。
1 2 3 4 5 |
//手のIKポイントの座標 = アバターの肩の座標 + リアルの腕の伸び具合 × アバターの腕の長さ × 腕のベクトル Vector3 ikPointPosiiton = avatarShoulderPosition + realArmStretch * avatarArmLength * realArmVector; |
上記4要素を使ってこのような処理を挟むことで、「腕の伸び具合」と「腕のベクトル」をもとにIKポイントの位置を書き換えて、リアルの腕の伸び具合をアバターにも反映できるようになります。
では、この結論をもとに4つの各パラメータを具体的に求めていきましょう。
アバター絡みの情報取得は比較的簡単
アバターの腕の長さや、毎フレームの肩の座標などは以下のようにして求められます。
1 2 3 4 |
//腕の長さはアバター読み込み時のTポーズの時に計算しておく float avatarArmLength = Vector3.Distance(animator.GetBoneTransform(HumanBodyBones.leftUpperArm).posiiton, animator.GetBoneTransform(HumanBodyBones.leftHand).posiiton); |
1 2 3 4 |
//毎フレームの肩の位置は、ExecutionOrderを操作してIKよりも実行順序が遅いLateUpdateの中で実行しないと正しい座標が取得できない Vector3 avatarShoulderPosition = animator.GetBoneTransform(HumanBodyBones.leftUpperArm).posiiton; |
しかし、リアル側の情報はそう簡単には取得できません。
腕の伸び具合も腕のベクトルもリアルの情報です。これらを取得するためには、さらにリアルの体型情報などが必要になってきます。
そのためにはまず、リアルの情報がどのようにVR空間に反映されているのかを把握する必要があります。
キャリブレーションの処理について見ていきましょう。
バーチャルキャストのキャリブレーション
バーチャルキャストのキャリブレーションではリアルの視点をアバターの視点に合わせるため、SteamVRのプレイエリアを拡大縮小する処理が入っています。
リアルの目(HMD)の高さが170cm、アバターの目の高さが140cmの場合だと、プレイエリアは 140÷170=0.8235… 倍に縮小されることになります。
このおかげで、リアルと身長差があるアバターでもそれなりに操作できるようになっています。
(リアルアバターは弊社のまついしゃちょーです)
目の高さを合わせたことで、身長差がほとんどなくなりました。縮小前よりも体格差が少なくなっていることが分かります。
ここまでが、モーションフィルターなしのバーチャルキャストです。
しかし下図を見ての通り、これだけではまだ手の位置が大きくズレていますし、肩幅にも差があります。
この状態からリアルの腕の曲がり具合などをできるだけ正確に取得するために、
- リアルの人間の 腕の長さ、肩幅、肩の高さ
- プレイエリア拡縮後のリアルの肩の位置(上図のまついしゃちょーの肩にある赤点の座標)
という情報が必要になってきます。
リアルの 「腕の長さ」 「肩幅」 「肩の高さ」 を取得するには?
これらの値は、VR機器のトラッキング情報から取得するのは非常に困難です。
初めはなんとか腕の長さだけでも取得できないかと試みましたが、個人差もある値を正確に出そうとするのは現実的ではないので、バーチャルキャストの設定に入力項目を増やしてユーザーに入力してもらう形にしました。
とはいえ、自分の腕の長さや脚の長さ、ましてや肩幅や肩の高さなどは普通のユーザーは把握していません。
なので、ユーザーが入力するのは「身長」のみとしました。
身長からはおおよその腕の長さ、脚の長さ、肩幅、肩の高さなどが推定できます。
例えば…
- 腕の長さ(肩~手首まで):身長×0.34
- 脚の長さ(地面~鼠径部まで):身長×0.52
- 肩幅:身長×0.25
- 肩の高さ:身長×0.8
…などなど。
こちらの情報は、人体寸法データベースから平均値を計算して求めた値です。
(※腕や脚の長さは個人差が大きいため、さらにリングメニュー上で0.75~1.25の補正値をかけて調整できるようになっています)
これでリアルの肩幅や肩の高さが分かったので、肩の位置も算出できそうですね。
リアルの肩位置を推定し、腕のベクトルと伸び具合を算出する
リアルの肩位置は、アバターの肩位置から一定距離だけズレています。下図の Sa と Sr がアバターの肩とリアルの肩です。
Sr の位置が毎フレーム分かれば、IKポイント位置 P との位置関係からその時の腕の伸び具合やベクトルが分かります。
このようして腕のベクトルと伸び具合が導出できます。
では、最初に挙げた計算式に戻ってみましょう。4つのパラメータすべての値が求められたので、IKポイントの補正後の座標(ikPointPosition
)が計算できるようになります。
1 2 3 4 5 |
//手のIKポイントの座標 = アバターの肩の座標 + リアルの腕の伸び具合 × アバターの腕の長さ × 腕のベクトル Vector3 ikPointPosiiton = avatarShoulderPosition + realArmStretch * avatarArmLength * realArmVector; |
これで、腕の伸ばし具合がリアルとアバターで一致するようにIKポイントの位置を補正することができました。
肘のカクカク現象が抑えられ、リアルの腕を曲げたのにアバターの腕が曲がらないといった現象も起こりにくくなります。特にダンスや筋トレなどのアバターの動きを見せたい時に効果を発揮します。
先に少しだけ触れましたが、モーションフィルターをONにしているとアバターの手の位置が現実のコントローラーの位置とズレます。動きをきれいにするために仕方ない事ではありますが、このズレが原因でアイテムが持ちにくくなったり、酔いやすくなったりすることもありえます。
VCIなどのアイテムを操作して遊ぶ場合はモーションフィルターをOFFにした方が快適に遊べますので、用途に応じてON/OFFを切り替えてみてください。
モーションフィルターの補正値の設定方法
腕や脚の長さには個人差があるため、リングメニューから補正値を設定することでさらに精度を高めることができます。
補正値の詳しい設定方法はこちらの動画を参照してください。
補正値の設定は、一度ちょうどいい値を見つけたら以後モデル変更をしても再設定する必要はありません。
こんなアバターも操作できるようになる!
モーションフィルターの適用で体格差を吸収することができるようになったので、バーチャルキャストでは頭身の低い着ぐるみのようなアバターも運用できるようになりました。
寸胴なアバターは上図のように、肩のボーンの間隔が広いのでリアルの肩の位置とものすごく差が生まれてしまいます。
しかし、モーションフィルターを使うことで「腕や脚の曲げ具合」をアバターに反映するようになるので、違和感のない動きを実現できるようになりました。
特に先日のバーチャル写真館ではいろいろなキャラクターを動かすうえで、モーションフィルターがよい働きをしてくれました。
皆さんもぜひぜひ、モーションフィルターを使ってみてくださいね!
今回は以上となります!
お読みいただきありがとうございました!
- Tag