はじめに
こんにちは。先月にQuestProを買いVRChatを始めたのですが、せっかくフェイストラッキングが機能があるので使えるように色々調べてようやく動作するようになりました。今回、フェイストラッキングを行うときに戸惑った場所や分かりにくかった部分について紹介したいと思います。
私以外に多くの方がVRChatでフェイストラッキングを行う方法について記事にしていただいています。以下の記事を参考にしました。これらの記事のおかげで無事行えるようになりとても感謝しています。
- @Kazu_Sack – Meta Quest Proを使ってVRChatでフェイストラッキングをする話 (2022/12/11 – 2023/12/02)
- にゃー! (id:virtual_neco) – VRChatでフェイシャルトラッキング対応アバターを作る方法 (2023/11/07)
- ペルキ・ギャンパーク – 【VRChat】QuestProを手に入れたのでフェイストラッキングをしてみた(覚書リンクまとめメモ)【VRoid】(2024/1/26)
今回調べた内容は、2024年4月14日の時点の情報のため、最新はまた変わってくる可能性があり注意してください。
関連記事について
これまで、VRChat用のアバターを作るためにVRoidStudioとメタセコイアを使って作ってきました。
今回の記事ではここで作成したアバターでフェイストラッキング化を行います。なお応用編の記事は以下にあります。
実行環境について
今回、私が試した実行環境は以下の通りです。
- HMD
- Meta Quest Pro
- VRChat環境
- Virutal Desktop (Wireless version) 1.30.5
- SteamVR 利用
- VRCFaceTracking + Virutal Desktop モジュール
- アバター
- VRoidStudio でアバターを作成(+メタセコイアで改変)
- HANA_APP にてシェイプ自動生成の追加(無しでもある程度対応は可能です後述)
- FaceEmo (表情
*.anim
ファイルを作成) - VRM Converter for VRChat にてVRM0から変換
- Unity 2022.3.6f1
環境整備をしたVRChatに対して、フェイストラッキングに対応したアバターをアップロードすることで利用可能になります。先に環境整備を行い、アバターのフェイストラッキング対応を説明します。
環境整備
HMDの設定を変更する
以下の設定を有効化します。これにより表情が読み取れるようになります。
Virutal Desktopなどの準備
色々な方法があるとは思いますが、以下のようなインサイドアウトボディートラッキング(IOBT)を別途利用したいと考えていたため、Virutal Desktop (Wireless version)を用いた方法を使用しました。
HMD側にて以下の対応が必要です。
- HMD内臓OSのプライバシー設定からVirutual Desktopのアクセス許可
- HMD上からVirutual Desktopを起動し、以下を有効化
- Forward traking data to PC
- Emulate SteamVR Vive trackers
- Emulate Index controllers
- Forward traking data to PC
他にもSteam側でOpenXRの設定などがありますが、@Kazu_Sackさんの記事を参考にしてみてください。
フェイストラッキング情報を送信するツールを準備
HMDからVirutal Desktop経由で送られたフェイストラッキング情報を、VRChatへOSC情報として送信するVRCFaceTrackingをインストールします。
インストールを終えたら、ツールを起動させてVirutal Desktop用のプラグインをインストールすれば完了です。
フェイストラッキングを行う場合はVRCFaceTrackingを起動した状態で、VRChatを起動する必要があります。正しくVRCFaceTrackingに対応したアバターがVRChat上で動作していると以下のようにAvatar Status
が表示されます。
VRChat側の設定を変更
後で設定してもいいのですが、環境整備ということでここで説明します。
VRChat自体にアイトラッキング機能が内蔵しているため、後に作成するアバターではフェイストラッキングの設定のみ行います。VRChatの設定は以下のようにしました。目の開き方はフェイストラッキングを使用するためVRChat側の設定はDisable
とします。
表情情報を受信用にOSCを有効化したいため、左手のメニューからOSCを探して、Enable
に設定しておきます。
ちなみにVRCFaceTrackingと連携できていないとOSC Debugで次のような表示がされます。OSC Debugはフェイストラッキングが正常動作しているかの確認等で使用するので覚えておきましょう。
Not receiving any OSC messages?
– Make sure your sender program is sending to port 9000
– If your sender program is running on a different device, make sure you are sending it do the correct IP address.
– Check your firewall settings. You may have to make an exception to allow VRChat or port 9000 through.
– Make sure you don’t have any other programs listing on port 9000.
– If you started your sender program before VRChat was launched, you may need to restart is so they can connect.
アバターを準備する
アバターにモーフ情報を埋め込む
vroid形式のアバターにモーフ情報を埋め込みます。後ほどこのモーフ情報を用いてフェイストラッキングで対応したい顔の表情を作成します。
デフォルトのモーフ情報
VRoid StudioでVRM0.xで出力したvrmファイルの時点でモーフ情報が埋め込まれています。眉毛の位置情報を切り替えるのがないので微妙ですが、目を閉じたり、口の開け閉めだけであればこれらの組み合わせで対応できます。
モーフID | 種類 | 内容 |
Fcl_ALL_Neutral | 表情 | 標準 |
Fcl_ALL_Angry | 表情 | 怒り |
Fcl_ALL_Fun | 表情 | 嬉しい |
Fcl_ALL_Joy | 表情 | 楽しい |
Fcl_ALL_Sorrow | 表情 | 悲しい |
Fcl_ALL_Surprised | 表情 | 驚き |
Fcl_BRW_Angry | 眉毛 | 怒り |
Fcl_BRW_Fun | 眉毛 | 嬉しい |
Fcl_BRW_Joy | 眉毛 | 楽しい |
Fcl_BRW_Sorrow | 眉毛 | 悲しい |
Fcl_BRW_Surprised | 眉毛 | 驚き |
Fcl_EYE_Natural | 目 | 標準 |
Fcl_EYE_Angry | 目 | 怒り |
Fcl_EYE_Close | 目 | 両目を閉じる |
Fcl_EYE_Close_R | 目 | 右目を閉じる |
Fcl_EYE_Close_L | 目 | 左目を閉じる |
Fcl_EYE_Fun | 目 | 嬉しい |
Fcl_EYE_Joy | 目 | 楽しい |
Fcl_EYE_Joy_R | 目 | 右目だけ楽しい |
Fcl_EYE_Joy_L | 目 | 左目だけ楽しい |
Fcl_EYE_Sorrow | 目 | 悲しい |
Fcl_EYE_Surprised | 目 | 驚き |
Fcl_EYE_Spread | 目 | 目を開く |
Fcl_EYE_Iris_Hide | 目 | 眼孔を小さく |
Fcl_EYE_Highlight_Hide | 目 | ハイライトを隠す |
Fcl_MTH_Close | 口 | 下唇を上げる |
Fcl_MTH_Up | 口 | 口の位置を上へ |
Fcl_MTH_Down | 口 | 口の位置を下へ |
Fcl_MTH_Angry | 口 | 怒り |
Fcl_MTH_Small | 口 | 口の横幅を小さく |
Fcl_MTH_Large | 口 | 口の横幅を大きく |
Fcl_MTH_Neutral | 口 | 口の横幅を通常 |
Fcl_MTH_Fun | 口 | 嬉しい |
Fcl_MTH_Joy | 口 | 楽しい |
Fcl_MTH_Sorrow | 口 | 悲しい |
Fcl_MTH_Surprised | 口 | 驚き |
Fcl_MTH_SkinFung | 口 | 唇で牙を作る |
Fcl_MTH_SkinFung_R | 口 | 唇で右の牙を作る |
Fcl_MTH_SkinFung_L | 口 | 唇で左の牙を作る |
Fcl_MTH_A | 口 | ア |
Fcl_MTH_I | 口 | イ |
Fcl_MTH_U | 口 | ウ |
Fcl_MTH_E | 口 | エ |
Fcl_MTH_O | 口 | オ |
Fcl_HA_Hide | 歯 | 歯を隠す |
Fcl_HA_Fung1 | 歯 | 八重歯を生やす |
Fcl_HA_Fung1_Low | 歯 | 下の八重歯を生やす |
Fcl_HA_Fung1_Up | 歯 | 上の八重歯を生やす |
Fcl_HA_Fung2 | 歯 | サメ歯を生やす |
Fcl_HA_Fung2_Low | 歯 | 下のサメ歯を生やす |
Fcl_HA_Fung2_Up | 歯 | 上のサメ歯を生やす |
Fcl_HA_Fung3 | 歯 | 中央の上下に牙を生やす |
Fcl_HA_Fung3_Up | 歯 | 中央の上に牙を生やす |
Fcl_HA_Fung3_Low | 歯 | 中央の下に牙を生やす |
Fcl_HA_Short | 歯 | 歯を短くする |
Fcl_HA_Short_Up | 歯 | 上の歯を短くする |
Fcl_HA_Short_Low | 歯 | 下の歯を短くする |
モーフ情報の拡張
有料ですがVRoid Studioで出力したVRM0ファイルに対してモーフ自動生成ツールのHANA_APPを用いることで、パーフェクトシンク用のモーフが追加され、モーフ情報が大幅にアップデートされます。以下は追加される情報です。眉毛の位置、口を膨らませる動作、舌を出すといった情報が追加されるため、これらをフェイストラッキングに組み込むことが可能になります。パーフェクトシンクの表情は、私が文章化していますが実際の顔を確認したい場合ははいぬっかさんのiPhoneトラッキング向けBlendShapeリストが参考になります。
モーフID | 種類 | 内容 |
browInnerUp | 眉毛 | 両方の眉毛が上がり、合わせて瞼も上がる |
browDownLeft | 眉毛 | 左の眉毛が下がり、合わせて瞼も下がる |
browDownRight | 眉毛 | 右の眉毛が下がり、合わせて瞼も下がる |
browOuterUpLeft | 眉毛 | 左の眉毛が上がり、合わせて瞼も上がる |
browOuterUpRight | 眉毛 | 右の眉毛が上がり、合わせて瞼も上がる |
eyeLookUpLeft | 目 | 左の瞼が上がる |
eyeLookUpRight | 目 | 右の瞼が上がる |
eyeLookDownLeft | 目 | 左の瞼が下がる |
eyeLookDownRight | 目 | 右の瞼が下がる |
eyeLookInLeft | 目 | 左目で内側を見る |
eyeLookInRight | 目 | 右目で内側を見る |
eyeLookOutLeft | 目 | 左目で外側を見る |
eyeLookOutRight | 目 | 右目で外側を見る |
eyeBlinkLeft | 目 | 左目を閉じる |
eyeBlinkRight | 目 | 右目を閉じる |
eyeSquintLeft | 目 | 左目を半開きにする |
eyeSquintRight | 目 | 右目を半開きにする |
eyeWideLeft | 目 | 左目を広げる |
eyeWideRight | 目 | 右目を広げる |
cheekPuff | 頬 | 頬を膨らます |
cheekSquintLeft | 頬 | 左の頬を上げる |
cheekSquintRight | 頬 | 右の頬を上げる |
noseSneerLeft | 鼻 | 左側の顔であざ笑う |
noseSneerRight | 鼻 | 右側の顔であざ笑う |
jawOpen | 顎 | 口を開ける |
jawForward | 顎 | 顎を前へ出す |
jawLeft | 顎 | 顎を左へずらす |
jawRight | 顎 | 顎を右へずらす |
mouthFunnel | 口 | 口をすぼめながらイーってやる |
mouthPucker | 口 | 口をすぼめる |
mouthLeft | 口 | 口を左へずらす |
mouthRight | 口 | 口を右へずらす |
mouthRollUpper | 口 | 上唇を前へ出す |
mouthRollLower | 口 | 下唇を上げる |
mouthShrugUpper | 口 | 口を横に広げてイーってやる |
mouthShrugLower | 口 | ムスーって口にする |
mouthClose | 口 | 口を閉める |
mouthSmileLeft | 口 | 口の左側で笑う |
mouthSmileRight | 口 | 口の右側で笑う |
mouthFrownLeft | 口 | 口の左側を下げる |
mouthFrownRight | 口 | 口の右側を下げる |
mouthDimpleLeft | 口 | 口の左側を横に広げる |
mouthDimpleRight | 口 | 口の右側を横に広げる |
mouthUpperUpLeft | 口 | 口の左側の歯茎を見せる |
mouthUpperUpRight | 口 | 口の右側の歯茎を見せる |
mouthLowerDownLeft | 口 | 口の左側の下歯茎を見せる |
mouthLowerDownRight | 口 | 口の右側の下歯茎を見せる |
mouthPressLeft | 口 | 口の左側を閉める |
mouthPressRight | 口 | 口の右側を閉める |
mouthStretchLeft | 口 | 口の左側を下へ伸ばす |
mouthStretchRight | 口 | 口の右側を下へ伸ばす |
tongueOut | 口内 | 舌を出す |
表情アニメーションを作成する
上記のモーフですが、Unityではシェイプキーと呼ばれています。このシェイプキーを元に表情アニメーション(*.anim
)を作成していきます。ここからはUnityでの操作となります。上記のアバターをVRM Converter for VRChat で取り込んだものとして説明していきます。
表情アニメーションは、フェイストラッキングから受信した情報を元に、どの表情アニメーションに設定するかというものになります。VRCFaceTrackingで対応している表情はVRCFaceTracking Parametersに記載されています。量が多いので、必要な表情のみピックアップして限定的に対応でよいかと思います。顔のイメージはUnified Expressionsに記載されています。
表情アニメーションを作成には、本来目的は違うのですがFaceEmoというUnity用のツールを使用していきます。アニメーションファイルは複雑な操作で作る必要があるのですが、このツールを使うことで簡単に作成することが可能となります。
作成するアニメーションを考える
作成するアニメーションはVRCFaceTracking Parametersに記載されているものから以下としました。表情アニメーション名の列は用意するファイルです。最終的に0.0
ならどの表情、1.0
ならどの表情という設定をする必要が出てくるため、0.0
用の表情として無表情の「EmptyFace.anim
」も用意しています。
名前 | 機能 | 表情 | 表情アニメーション名 |
無し | 無し | 無表情 | EmptyFace.anim |
v2/BrowInnerUpLeft |
<0.0 -> 1.0>Brow Inner Up Left | 左眉がハの字 | v2BrowInnerUpLeft1.anim |
v2/BrowInnerUpRight |
<0.0 -> 1.0> Brow Inner Up Right | 右眉がハの字 | v2BrowInnerUpRight1.anim |
v2/CheekPuffSuck |
<0.0 -> 1.0> Cheek Puff <0.0 -> -1.0> Cheek Suck |
ほっぺ膨らまし | v2CheekPuffSuck1.anim |
v2/EyeLidLeft |
<0.0 -> 0.75> Left Eye Openness <0.75 -> 1.0> Left Eye Widen |
左目を閉じる | v2EyeLidLeft0.anim v2EyeLidLeft75.anim v2EyeLidLeft100.anim |
v2/EyeLidRight |
<0.0 -> 0.75> Right Eye Openness <0.75 -> 1.0> Right Eye Widen |
右目を閉じる | v2EyeLidRight0.anim v2EyeLidRight75.anim v2EyeLidRight100.anim |
v2/EyeSquintLeft |
<0.0 -> 1.0> Eye Squint Left | 左目を細める | v2EyeSquintLeft0.anim v2EyeSquintLeft1.anim |
v2/EyeSquintRight |
<0.0 -> 1.0> Eye Squint Right | 右目を細める | v2EyeSquintRight0.anim v2EyeSquintRight1.anim |
v2/JawOpen |
<0.0 -> 1.0> Jaw Open | アの口 | v2JawOpen1.anim |
v2/LipPucker |
<0.0 -> 1.0> Lip Pucker | 口をすぼめる | v2LipPucker1.anim |
v2/MouthOpen |
<0.0 -> 1.0> Mouth Upper Up + Mouth Lower Down |
イの口 | v2MouthOpen1.anim |
v2/SmileFrown |
<0.0 -> 1.0> Mouth Corner Pull <0.0 -> 1.0> Mouth Corner Slant <0.0 -> -1.0> Mouth Frown |
口角を上げる | v2SmileFrown1.anim |
v2/TongueOut |
<0.0 -> 1.0> Tongue Out | 舌を出す | v2TongueOut1.anim |
FaceEmoで作成していく
ヒエラルキーからVRChat用アバターの右にEmoアイコンがあるのでこれをクリックしてツールを起動できます。
主に使うのは2つの機能です。
- +ページのアイコン … 新しい表情アニメーションを作成する
- 鉛筆のアイコン …. 表情アニメーションを編集する
例えば、イを表すv2MouthOpen1
という表情アニメーションを作ってみます。これはVRoidに最初から入っていたFd_MTH_I
を使用して作成できます。
口角を上げるv2SmileFrown1
も作ってみます。これはパーフェクトシンク用のモーフのcheekSquintLeft
とcheekSquintRight
の両方を用いて作成してみました。
無表情の表情アニメーションは特に何もなしで作成しました。
このように、頑張ってたくさん用意していきます。
VRCFaceTrackingから受け取る情報を設定する
VRCFaceTrackingから受け取る表情パラメータVRCFaceTracking Parametersに記載されたパラメータをいくつか受け取れるように設定します。
VRChat用アバターを選択した状態でインスペクターにあるExpressions
のPrameters
にあるVRCExpressionParameters
をダブルクリックします。
既存設定にVRCFaceTrackingから受け取る表情の情報を追加します。これでVRChatプレイ中にこの値がリアルタイムに変わるようになります。Synced
のチェックは入れ忘れないように。
専用のAnimationControllerを作る
VRC Expression Parameters
で設定された値を元に、どの表情アニメーションに切り替えるかという設定ファイルを作ります。今回は、VRCFaceTracking.controller
というファイル名で作っていきます。
上記(スクリーンショットでは作成済み)のようにプロジェクトのフォルダ内で右クリックをして「作成」から「アニメーターコントローラー」を選択することで、「New Animator Controller.controller
」というファイルが作成されます。分かりにくいので適当に名前を振っておきましょう。プロジェクトでこのファイルをダブルクリックするとファイルがUnity上で開かれて編集ができます。
パラメータを追加
パラメータタブで連動する変数をfloat
型で作成します。ここでの値はVRC Expression Parameters
で設定した変数名に合わせる必要があります。
レイヤーを追加
作成したい表情分のレイヤーを追加します。
ウェイトを設定する
ギアマークを押すとウェイト
の設定(0.0
~1.0
)ができるので1.0
にします。
Blend Treeの設定をする
各種レイヤーに対して、パラメータに応じた表情アニメーションの設定を行います。具体的にはBlend Treeというものを使用していきます。
以下のように右クリックで新規作成からBlend Treeを作ります。作成したBlend Tree
を選択したらインスペクターのMotion
にあるBlend Tree
をダブルクリックすると詳細設定が可能になります。Motion
にBlend Tree
が表示されない場合は、作り方が間違っている可能性があります。
あとは以下のような感じで、パラメータの数字に合わせてどの表情アニメーションを使用するかを適当に設定していきます。余裕をもって、0.0
や1.0
といったピッタリな数字を使わずにちょっと誤差があっても動くように設定するのがコツのようです。
目の閉じ方については、0.75
からは意味が変わってくるため、表情アニメーションが複雑になります。
全ての設定を終えたら、VRChatアバターを選択してインスペクターから、Playable Layers
のBase
のFX
に先ほど作成したVRCFaceTracking.controller
へ変更したら完成です。
VRChatで動作を確かめる
以上の設定を終えたらVRChatで動作を確かめてみましょう。うまく動作しない場合はOSC Debugを確認すると良いです。正しく取得できていると以下のように追加したパラメータが動作していることが分かると思います。
ここで出てくる表示が変だった場合は、以下のローカルに記録されているアバターのOSC情報を削除すると治る場合があります。
C:\Users\***\AppData\LocalLow\VRChat\VRChat\OSC\usr_***\Avatars
おわりに
いったん駆け足でしたが、私が作った時の調べたことや難しい箇所をまとめてみました。
参考になりましたら幸いです。
ちなみにHMDを購入して1か月が経とうとしていますが、1週間のうち数時間しか遊べない貴重な時間をVRChatの技術的な情報を調べるだけでなかなかプレイが出来ていない状況ですので、そろそろアバターで散歩したり色々な人と話したりしてみたいなぁとこの頃です。
応用編の記事も書いたので気になった方は読んでみてください。
コメント