見出し画像

【VRChat】【Unity】表情改変の基礎知識(概論)(後日追記予定)

0.この記事の対象

2024.5時点の筆者のUnityバージョン
・Unity 2022.3.6f1
・VRChat SDK - Avatars 3.5.2
想定レベル:UnityのAnimatorControllerを理解して簡単なON/OFFギミックならツールに頼らずに手動で組める方向け


1.VRChatアバターの表情はどこで制御しているのか

1-1. BlendShapes

 「顔」のメッシュのSkinned Mesh Rendererの中に「BlendShapes」の項目があるのでそこを開くと、0-100の幅で設定できるスライダーがある。このスライダーを動かすと、シーンに配置したアバターの表情が変わる。このBlendShapesを「この表情の時は0」「この表情の時は100」「この表情の時は0→100へ時間経過で変更」みたいなアニメーションを設定したものの集合体が表情制御になる。

「顔」が所属しているメッシュを選択
このBlendShapesが表情変化の本体

1-2. VRChat公式が用意した表情制御法

 VRChat公式が用意した表情制御法は、「基本的にトラッキングによって目や口パクを制御する」というもの。場所はアバターRootにあるVRC Avatar Descriptorの中。

リップシンクの設定。ここに動かしたいBlendShapeキーを登録すると自動設定される
視線、まばたきの設定。画像では未設定だがここに目ボーンやまばたきブレンドシェイプを設定すると視線移動やまばたきアニメーションが自動設定される

 しかし販売アバターのページを眺めると、ハンドサインによって表情が変わるようなアバターを数多く見かける(というかそれが日本アバターの現在の主流)。この説明は次項。


2. ハンドサインによって表情が変わるアバターはどこで表情制御しているのか 

アバターのデバッグコンソール画面

 VRChatのアバター制御は、「複数のAnimator Controllerを連結させる」ことによりアニメーション制御を行っている(上の画像のAnimation Controllersの欄)。

各コントローラーは上から順に処理されていく(はず)ので、下にあるコントローラーほど優先順位が高い(処理を上書きしていく)

 アバターのAnimator Controllerの役割は大まかに上の画像の通りになっていて、このうちFX Layerはコントローラー群の中で最下層にある(TPOSE、IKPOSEは設定用に使用するレイヤーなので除外)ので、ここに表情変化のBlendShapesの変化量を定義したアニメーションを登録すると、アバターの表情変化をここの数値で上書きできる為、制御が可能になる。これをハンドサインの変数「GestureLeft」「GestureRight」と結び付けることにより、ハンドサインと表情を連動させて変化させる運用を可能にしている。

ここの「FX」に登録したコントローラーに対して、表情変化のアニメーションを登録していく

3. Gestureレイヤー流用の表情制御法とその注意点

 ハンドサインと表情を連動させるため、ハンドサインの指の形を定義したレイヤー「Gestureレイヤー」のコントローラーをそのままコピーして、FXレイヤーへ転用した様なアバターが数多く存在する。

Gestureレイヤー。これをコピーしてFXレイヤーに転用すると楽といえば楽だが…(後述)

 この方法だと自分でアニメーターを1から組まなくて良いので楽といえば楽だが、Gestureレイヤーは指の動きを定義したコントローラーである為、FXレイヤーへ転用する場合は指の動きを定義したアニメーション・パラメータ設定を外しておかないと不具合が発生するので要注意。また、この構造だとVRChatの仕様上避けられない不具合(顔面崩壊)がある

アバターマスク設定(「M」の表示がマスク設定有効を示す)。
FXレイヤーには不要(というか存在すると後々違うバグのもとになる)ので外す
Idleステートに居る諸悪の根源、▲proxy_hands_idle。
指のデフォルトの形を定義したアニメーションファイル(表情とは関係ない)なので、FXレイヤーに居ると指がGestureレイヤーの状態に関わらずFXレイヤーのこのファイル(デフォルトの形)で上書きされて動かなくなる。必ず外す。
▲proxy_hands_fistは表情制御のアニメーションファイルへ差し替える。
Motion Timeの欄は指の形がFistの時のみ有効(コントローラーのトリガーで半目とかを再現するのに使用する)。Fist以外では使用しないので外す

4.表情制御のFXレイヤーを1から設計する

 表情制御のFXレイヤーはVRChat公式が想定しているものでは無い(公式としてはトラッキングによる制御を想定している)為、言い換えるとオリジナルの表情制御法を実装することが可能。よって表情表現にこだわりたい場合、自分がVR中でどのような操作で表現をしたいか?を考え、それに従ってAnimatorを設計することになる。
・片手のみで制御
・両手で制御
・右手に表情、左手に漫符など
・右手に目の動き、左手に口の動きで別々に制御する
・まばたきの実装有無
・リップシンクとの共存
etc…

左手、右手それぞれで表情制御する例(この場合右手レイヤーが下にあるので右手優先)
右手のみで制御する例。まばたき・リップシンクを考慮しないなら実はこれだけで良い
左手側に漫符のBlendShapeを仕込んでおくと右手で表情、左手で漫符の制御ができる

 特に無言勢でアバターの動きで感情表現する人はアバターの表情は結構重要な要素なので、表情操作の仕方はこだわっておきたいポイントになる。


5.FaceEmoの処理について

 最近登場したお手軽表情設定ツール「FaceEmo」だが、アバターに適用すると以下のPrefabがアバターに追加される。

Modular Avatarの理解が深い人ならピンと来るはず

「MA Merge Animator」…つまりアバターのFXレイヤーに非破壊でFaceEmo作成のFXレイヤー(FaceEmo_FX)を合成する処理を行っている。よってアバターに元々設定されていた表情変化のレイヤーをFaceEmo_FXの設定で上書き処理する方法が取られている。このFaceEmo_FXの中身はとある設計のプロの方が作成したFXレイヤーの構造になっており、まばたき干渉、リップシンク干渉などの表情崩壊系バグが起きない様に設計されている。表情設計にあまりこだわらない、という方はFaceEmoを用いて表情設定を行えば安定かと思う。

6. 表情制御を設計したい方へのテクニック集(執筆中…)


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