Unity向けMovement SDKのフェイストラッキング 更新日時: 2025/08/28
フェイストラッキングAPIを利用すると、抽象化された顔の表情データを使ってソーシャルプレゼンスを高めることができます。例えば、フェイストラッキングは、他のユーザーとのバーチャルなやり取りをする際のキャラクターの表情をより自然に見せるのに役立ちます。フェイストラッキングを利用したキャラクターの作成は、大まかには、キャラクターの顔の表情を表すブレンドシェイプを使って表されるキャラクターを作成し、そのブレンドシェイプを含むキャラクターにスクリプトを追加して、APIを読み取り、検出された表情をキャラクターのブレンドシェイプにマッピングする、という手順で構成されます。
フェイストラッキングAPIは、フェイシャルアクションコーディングシステム(FACS)に基づく表情とOculus口形素ベースの表情をサポートします。FACSの表情は、顔のアニメーションに使用される70種類の筋肉を表現します。口形素は、音素を生成する際の(発声時の)口の形を指し、15種類のブレンドシェイプで表現されます。従来のリップシンクライブラリと、このセクションで説明するフェイストラッキングAPIは、同じ15種類のOculus口形素を使用しています。
Quest Proでは、ヘッドセットのセンサーによって検出された顔の動きが、FACSブレンドシェイプの表情のアクティブ化(あごの開閉や鼻のしわなど)に変換されます。他のQuestヘッドセットでは、音声ストリームが分析され、Audio To Expressions(音声の表情への反映)と呼ばれる機能を使用して音声サンプルでトレーニングされた機械学習モデルを活用し、FACSの表情またはOculus口形素に変換されます。
Unityのフェイストラッキングの実装において、これらの表情は、アーティストがキャラクターの顔の表情を表すために作成したFACSベースのブレンドシェイプにマッピングされます。非常にリアルな場合やサンプルにおいては、センサーによって検出される表情のそれぞれについて、対応するブレンドシェイプが1つずつあります。しかし、ヘッドセットを着用している人は、一般に、これらの複数の表情を同時に示すという点を認識することが重要です。例えば、人が笑うと、唇の端を上げることに加えて、頬や目の動作も観察されるでしょう。APIによって、表情の強さに対応する重み値が返されます(眉をわずかに上げるのか、眉を目いっぱい上げるのか、など)。次に、発せられた表情とその重み値のリストを使って、ブレンドシェイプがアクティブ化されます。これらのブレンドシェイプメッシュは表情の強さ(つまり重み)に応じて変形できるので、異なる複数のメッシュの組み合わせで望んでいる効果が生まれます。FACSベースのブレンドシェイプの数と表情の数は、必ずしも一致していなくても構いません。例えば、2つのブレンドシェイプ(ニュートラルとスマイル)を持つシンプルなアバターを作ります。次に、提供されているいくつかの表情(唇の端を上げるなど)をマッピングし、笑顔を検出してスマイルのブレンドシェイプをアクティブ化することができます。
フェイストラッキングAPIには、鼻、口、顎、眉、そして目の周辺など、顔のほとんどの部分を表すFACSベースのブレンドシェイプが用意されています。それにより、笑顔、しかめ面、驚きなどの表情を構成する顔の動きがカバーされます。これにより、開発者は、リアルなVRエクスペリエンスのための高品質な3D表現から、ファンタジーやSF環境向けの高度にスタイル処理された表現に至るまで、さまざまなキャラクターをユーザーに提供できます。
非常にリアルなキャラクターの場合は、顔面アセットを生成し、フェイストラッキングAPIが定義する70種類のFACS表情または15種類の口形素を提供するために、正確なフォトグラメトリーを使うことが特に重要です。それらを組み合わせることにより、スキンメッシュにすることができます。
ユーザーが自然な表情機能をオンにしたアプリには、リアルタイムの抽象化された顔の表情データへのアクセス許可が付与されます。このデータは、
開発者データ使用ポリシー の下で使用されるユーザーデータです。このデータは、開発者データ使用ポリシーで概説されている用途に限り、使用が許可されます。このデータを
データ使用の禁止行為 に使うことは明示的に禁止されています。自然な表情機能では、MetaのフェイストラッキングAPIが利用されています。
フェイストラッキングAPIを使用するには、
Oculus SDKライセンス契約 、
開発者データ利用ポリシー 、ならびに適用されるすべてのOculusおよびMetaのポリシー、利用規約、条件に従う必要があります。Movementの使用には、適用されるプライバシーおよびデータ保護法が適用される場合があります。
特に、フェイストラッキングAPIによるデータの収集、使用、保持、および処理について明確に説明しているプライバシーポリシーを、一般公開で容易に閲覧できる状態で掲載し、それに準拠する必要があります。プライバシーとデータ保護について適用される法律で義務付けられていることも含め、抽象化された顔の表情データを収集する前に、そのようなデータへのアクセスおよび使用に関する明確で包括的な情報をユーザーに提供し、ユーザーの同意を得ておかなければなりません。
フェイストラッキングAPIの利用がMetaのポリシーを遵守しているかどうかをモニターする権利をMetaが留保していることに注意してください。
既知の問題は次のとおりです。
フェイストラッキングAPIの表情に関する信頼性の値が設定されていません。 Audio to Expressions: モデルは主に音声入力に基づいてトレーニングされていることから、あくびの動作がキャラクターの口を開く動作として再現されない場合があります。 Audio to Expressions: アプリを初めて起動したとき、音声が完全に接続されて顔のアニメーションが動作するまでに最大10秒かかる場合があります。この問題はデバイスの再起動後に確認されています。 視覚ベースのフェイストラッキングと同様、Audio to Expressionsのモデルは、ユーザーが実際に唇をどう動かすかに基づいてトレーニングされています。口形素による動きのような、より誇張した動きを希望する場合は、リターゲティング構成ファイルで乗数を増やすことができます。JSONの構成セクションを参照してください。 このセクションを完了すると、開発者は以下のことができるようになります。
ボディトラッキングをサポートする新プロジェクトを設定する。
フェイストラッキングAPIに直接対応するブレンドシェイプを使用して、フェイストラッキングが有効なキャラクターを設定する。
ARKitブレンドシェイプを使用してキャラクターのフェイストラッキングを有効にする。
口形素を使用してキャラクターのフェイストラッキングを有効にする。
フェイストラッキングをサポートするプロジェクトを設定する VR用にプロジェクトを設定したら、以下の手順を実行します。
シーンにOVRCameraRig prefabがあることを確認します。このprefabはPackages/com.meta.xr.sdk.core/Prefabs/OVRCameraRig.prefabにあります。 [Hierarchy (階層)] でOVRCameraRig オブジェクトを選択します。次に、[Inspector (インスペクター)] でOVRManager コンポーネントを見つけます。[Quest Features (Quest機能)] アイテムを展開し、[General (一般)] をクリックします。ジェスチャーコントロールを使う場合は、[Hand Tracking Support (ジェスチャーコントロールのサポート)] で[Controllers and Hands (コントローラーと手)] を選択します。 [Face Tracking Support (フェイストラッキングのサポート)] が[Supported (利用可能)] に設定されていることを確認します。プロジェクト設定ツールによって診断された問題があれば、それらを修正します。Unityのメニューで[Edit (編集)] > [Project Settings (プロジェクト設定)] > [Meta XR] に移動して、プロジェクト設定ツールにアクセスします。 [Android, Meta Quest (Android、Meta Quest)] プラットフォームタブを選択します。問題がある場合は、[Fix All (すべて修正)] をクリックします。詳しくは、プロジェクト設定ツールの使用 をご覧ください。 注 : フェイストラッキング、アイトラッキング、またはジェスチャーコントロールに依存しているプロジェクトの場合、ヘッドセット上でこれらが有効になっていることを確認する必要があります。通常これはデバイスの設定の一部ですが、[Settings (設定)] > [Movement Tracking (動きのトラッキング)] をクリックして、この設定を確認したり変更したりすることができます。
FACSベースのフェイストラッキングを適用するキャラクターを設定する 注 : 以下のスクリプトの中には、Meta XRオールインワンSDKではなく、サンプル内で配布されているものがあります。それらのスクリプトにアクセスするには、
OculusサンプルのGitHubリポジトリ をダウンロードする必要があります。これはパッケージとして配布されているので、既存のプロジェクトに追加できます。
ステップ1: FACSベースのブレンドシェイプを使用したキャラクター。キャラクターに、フェイストラッキングAPIブレンドシェイプに対応するブレンドシェイプがある場合は(FACSベースのブレンドシェイプ を参照)、この手順に従ってください。そうでない場合は、ステップ2に進みます。
ステップ1a: [Game Object (ゲームオブジェクト)] > [Movement SDK] > [Face Tracking (フェイストラッキング)] > [Add A2E Face (A2Eフェイスの追加)] に、ヘルパー関数があります。これを基本設定として使用しますが、ブレンドシェイプが予想どおりに連携することを確認するため、ターゲットキャラクターに基づいて検査し変更する必要があります。 ステップ2: ARKitブレンドシェイプを使用したキャラクター。ブレンドシェイプを持つキャラクターの顔のスキンメッシュを右クリックし、[Game Object (ゲームオブジェクト)] > [Movement SDK] > [Face Tracking (フェイストラッキング)] > [Add A2E ARKit Face (A2E ARKitフェイスの追加)] にあるARKitヘルパー関数を使用して、ARKitのデフォルトマッピングを確立します。
ステップ3: キャラクターにFaceDriverおよびFaceRetargeterComponentのコンポーネントがあり、FaceRetargeterComponentコンポーネントがOVRWeightsProviderを参照していることを確認します。FaceDriverは、フェイストラッキングに応じてアニメーション付きのメッシュを参照する必要があります。
ステップ4: キャラクターをテストします。この時点で、使用するキャラクターにヘッドセットを装着してテストする準備が整っているはずです。FaceRetargeterComponentの「Retargeter Config」フィールドは、キャラクターにアニメーションを付ける方法に影響を与えるために変更できるJSONを参照します。 注: まぶたの近くに異常なしわが現れるなど、キャラクターのアニメーション中にキャラクターへのライティングが適切でないことに気付いた場合は、RecalculateNormalsコンポーネントを使用してください。
RecalculateNormalsコンポーネントを構成するには、以下の手順を実行します。
キャラクターのフェイススキンメッシュレンダラーを、[Skinned Mesh Renderer (スキンメッシュレンダラー)] フィールドに割り当てます。
法線再計算が動作するためには、スキンメッシュレンダラーに対して、Movement/PBR (Specular)またはMovement/PBR (Metallic)に基づく互換マテリアルを使う必要があります。 [Recalculate Material (マテリアルを再計算)] のインデックス配列を、法線再計算の実行に必要なマテリアルのインデックスに設定します。「Sub Mesh」配列を使用して、再計算を実行するサブメッシュのインデックスを指定します。[Duplicate Layer (重複レイヤー)] フィールドを、キャラクターの属するレイヤーに設定します。[Hidden Mesh Layer Name (非表示メッシュレイヤー名)] フィールドを、カメラによってレンダリングされないレイヤーの名前に設定します。
レイヤーが存在しない場合は、[Edit (編集)] > [Project Settings (プロジェクト設定)] > [Tags and Layer (タグとレイヤー)] に移動し、[Layers (レイヤー)] セクションを展開して、空のスロットに新しいレイヤーを作成します(例えば、ユーザーレイヤーフィールドの1つにHiddenMeshのような名前を入力します)。[Hidden Mesh Layer Name (非表示メッシュレイヤー名)] フィールドには、この新しいレイヤー名を使用します。RecalculateNormalsスクリプトにより、このレイヤーのレンダリングを除外するよう、シーン内の全カメラのカリングマスクが変更されます。 [Recalculate Independently (独立して再計算)] フィールドを有効にします。このセクションでは、フェイストラッキングのためのブレンドシェイプを定義するOVR Face Expressions コンポーネントについて簡単に説明します。
OVRFaceExpressionsコンポーネントは、各フレームの顔の表情のデータをクエリし更新します。
OVRFaceExpressionsコンポーネントスクリプトには、顔の表情データにアクセスするためのインデクサーが定義されており、表情データが有効かどうかを示すフィールド
ValidExpressionsが提供されています。このコンポーネントは、ユーザーがフェイストラッキングのアクセス許可を付与したアプリでのみ動作します。
JSON構成ファイルに基づいてソーストラッキングの重みをターゲットの重みのセットにマッピングするためのリターゲティングWeightsProviderを実装します。このファイル内の各項目は、入力ドライバーのセットと、この特定の組み合わせがマッピングされる出力の重みの組み合わせを定義します。次に、FaceRetargeterComponentクラスはこれらを実装するマッピング関数を作成します。これらの重みの想定されるコンシューマーは、FaceDriverインスタンスです。
命名規則に基づいてリグのコンセプトを実装し、変形を駆動します。スキンメッシュのリストから抽出されたブレンドシェイプのリストを使用して、RigLogicインスタンスを構築します。このインスタンスは、直接ドライバー信号、中間信号、および補正信号の観点から各名前を解釈し、それらのアクティベーション関数を組み立てます。関連付けられたWeightsProviderからの信号が変形を駆動します。
コンシューマーに重み値を提供する抽象クラス。例としては、FaceRetargeterComponentやOVRWeightsProviderなどがあります。
各キャラクターのFaceRetargeterComponentは、[Retargeter Config]フィールドを参照します。このフィールドを使用し、重みによってターゲット(ターゲットとなるFACSベースのブレンドシェイプ)を駆動するドライバー(FaceExpression)を調整することで、キャラクターのパフォーマンスを微調整できます。例えば、[Game Object (ゲームオブジェクト)] ->[Movement SDK] ->[Face Tracking (フェイストラッキング)] ->[Add A2E ARKit Face (A2E ARKitフェイスの追加)] を使用してキャラクターを設定すると、デフォルトのarkit_retarget_a2e_v10.json設定が追加されます。この設定の各エントリーにはFaceExpression名があり、それに続いて、その表情によって動かされるARKitブレンドシェイプ名が記述されます。対応するARKitブレンドシェイプに異なる反応をさせたい場合は、その横にある重みを増やすことができます。必要に応じて、エントリーを削除および追加することで、変更されるFACSベースのブレンドシェイプを変更することもできます。このワークフローは、口形素ベースのブレンドシェイプには適用されません。
口形素ベースのフェイストラッキングを適用するキャラクターを設定する このセクションでは、
口形素 対応のブレンドシェイプを持つキャラクターの設定方法について説明します。
口形素を使用するには、
上記 の手順に従ったうえで、以下を有効にしてください。
[Hierarchy (階層)] の中の[OVRCameraRig] を選択します。[Inspector (インスペクター)] で[OVR Manager (Script) (OVRマネージャ(スクリプト))] アイテムを見つけます。[Quest Features (Quest機能)] を展開します。次に、[Experimental (テスト)] をクリックし、[Experimental Features Enabled (テスト機能をオン)] アイテムにチェックマークを付けます。[Tracking (トラッキング)] > [Face Tracking (フェイストラッキング)] を展開します。次に、[Visual (ビジュアル)] 、[Audio (音声)] 、[Enable visemes (口形素を有効にする)] の各アイテムにチェックマークを付けます。[Permission Requests On Startup (起動時のアクセス許可リクエスト)] を展開します。次に、[Record Audio for audio base Face Tracking (音声ベースのフェイストラッキング用に音声を録音)] アイテムにチェックマークを付けます。OVRFaceExpressionsは、口形素にアクセスするための複数のプロパティと関数を提供します。コンポーネントの
AreVisemesValidを使用すると、口形素の有効性を確認できます。また、
GetVisemeを使用すると、指定した
FaceVisemeの重みを取得できます。
TryGetFaceVisemeは
GetVisemeと似ていますが、指定した
FaceVisemeが無効な場合は
falseを返します。
ステップ1: 口形素対応のブレンドシェイプを持つ各スキンメッシュレンダラーにVisemeDriverをコンポーネントとして追加します。 ステップ2: [Auto Generate Mapping (マッピングを自動生成する)]ボタンをクリックし、スキンメッシュレンダラーのブレンドシェイプを口形素に関連付けます。
ステップ2a: [Clear Mapping (マッピングをクリアする)]ボタンを使用すると、これらの関連付けをクリアできます。 ステップ3: VisemeDriverコンポーネントで生成されたマッピングを確認し、必要に応じて修正します。 まぶた付近に不自然なしわが発生する場合は、上記で説明したRecalculateNormalsコンポーネントを使用してください。
どのヘッドセットがフェイストラッキングをサポートしていますか?
内向きのカメラに基づいて顔の動きを推定する自然な表情機能は、Meta Quest Proヘッドセットでのみ利用できます。ただし、Audio To Expressionsは、すべてのMeta Quest 2、Meta Quest 3、Meta Quest 3Sデバイスで同じAPIを使って利用できます。既存のブレンドシェイプを、フェイストラッキングAPIが提供するFACSのブレンドシェイプに対応させるにはどうしたらよいですか?
既存のブレンドシェイプが、OVRFace で想定されているブレンドシェイプの命名規則とマッチしない場合、ブレンドシェイプを手動で割り当てる必要があります。OVRCustomFace を継承して、独自のカスタムマッピングを作成することもできます。ブレンドシェイプのビジュアルリファレンスは、動き - フェイスブレンドシェイプ のトピックにあります。舌のブレンドシェイプはサポートされていますか?
はい。提供されているFACSブレンドシェイプの中で、舌を突き出したものなど、合計7つの舌のブレンドシェイプがサポートされています。ブレンドシェイプ BROW_LOWERER_LとBROW_LOWERER_Rは、眉の部分を寄せて下げ、額の中央部分を下げます。
CHEEK_PUFF_LとCHEEK_PUFF_Rは、頬に空気を溜め、頬を丸くして外側に広げます。
CHEEK_RAISER_LとCHEEK_RAISER_Rは、目の周囲を引き締め、目尻をすぼめます。
CHEEK_SUCK_LとCHEEK_SUCK_Rは、頬を内側に吸い込み、歯に押し当てて頬にくぼみを作ります。
CHIN_RAISER_BとCHIN_RAISER_Tは、顎と下唇の皮膚を押し上げます。唇が触れ合っている場合、下唇から上向きの力が加わり上唇も押し上げます。
DIMPLER_LとDIMPLER_Rは、唇の端を歯に押し当て、その際に唇をやや後方に、そして多くの場合は上方向に引き上げます。
EYES_CLOSED_LとEYES_CLOSED_Rは、上まぶたを下げて目を覆います。
EYES_LOOK_DOWN_LとEYES_LOOK_DOWN_Rは、視線を下に向ける動きに合わせてまぶたを動かします。
LOOK_LEFT_LとLOOK_LEFT_Rは、視線を左に向ける動きに合わせてまぶたを動かします。
LOOK_RIGHT_LとLOOK_RIGHT_Rは、視線を右に向ける動きに合わせてまぶたを動かします。
LOOK_UP_LとLOOK_UP_Rは、視線を上に向ける動きに合わせてまぶたを動かします。
INNER_BROW_RAISER_LとINNER_BROW_RAISER_Rは、眉間と額の部分を持ち上げます。
JAW_DROPは、下顎を首に向かって下方向に動かします。
JAW_SIDEWAYS_LEFTは、下顎を左方向に動かします。
JAW_SIDEWAYS_RIGHTは、下顎を右方向に動かします。
JAW_THRUSTは、下顎を前方に突き出します。
LID_TIGHTENER_LとLID_TIGHTENER_Rは、まぶたの周囲を引き締め、下まぶたの皮膚を目頭に向かって押し上げます。
LIP_CORNER_DEPRESSOR_LとLIP_CORNER_DEPRESSOR_Rは、唇の端を下方向に引きます。
LIP_CORNER_PULLER_LとLIP_CORNER_PULLER_Rは、唇の端を上方向、後方、横方向に引きます。
LIP_FUNNELER_LB、LIP_FUNNELER_LT、LIP_FUNNELER_RB、LIP_FUNNELER_RTは、唇を前方に突き出して外側に広げます。多くの場合、口が丸くなり、唇同士が離れます。
LIP_PRESSOR_LとLIP_PRESSOR_Rは、上唇と下唇を互いに押し付けます。
LIP_PUCKER_LとLIP_PUCKER_Rは、唇の端を内側に引き込み、その過程で唇が突き出るようにします。
LIP_STRETCHER_LとLIP_STRETCHER_Rは、唇の端を横方向に引き、唇を伸ばして顎のラインを広げます。
LIP_SUCK_LB、LIP_SUCK_LT、LIP_SUCK_RB、LIP_SUCK_RTは、唇を口の中に吸い込みます。
LIP_TIGHTENER_LとLIP_TIGHTENER_Rは、それぞれの唇を水平面上で狭めて引き締めます。
LIPS_TOWARDは、顎の位置に関係なく、強制的に上唇と下唇を触れさせ口を閉じた状態に保ちます。
LOWER_LIP_DEPRESSOR_L と LOWER_LIP_DEPRESSOR_R は、下唇を下方向に引き、さらにわずかに横方向に引きます。
MOUTH_LEFTは、唇の左端を左に引き、口の右側を唇の左端に向かって押します。
MOUTH_RIGHTは、唇の右端を右に引き、口の左側を唇の右端に向かって押します。
NOSE_WRINKLER_LとNOSE_WRINKLER_Rは、鼻の側面、鼻孔、上唇の中央部分を持ち上げます。多くの場合、眉を下げる筋肉と組み合わさり、眉頭が下がります。
OUTER_BROW_RAISER_LとOUTER_BROW_RAISER_Rは、眉尻と額の部分を持ち上げます。
UPPER_LID_RAISER_LとUPPER_LID_RAISER_Rは、上まぶたを上方向と後方に引き上げ、目を大きく開きます。
UPPER_LIP_RAISER_LとUPPER_LIP_RAISER_Rは、上唇を持ち上げます(鼻のしわを寄せるというよりも、横に広げます)。
TONGUE_TIP_INTERDENTALは、口形素「TH」の発音のように舌先を上げて上の歯に触れさせます。舌が見え、歯のラインよりわずかに突き出ています。
TONGUE_TIP_ALVEOLARは、口形素「NN」の発音のように、舌先を上げて上の歯の裏に触れさせます。
TONGUE_FRONT_DORSAL_PALATEは、口形素「CH」の発音のように、舌の前部を口蓋に押し付けます。
TONGUE_MID_DORSAL_PALATEは、口形素「DD」の発音のように、舌の中央を口蓋に押し付けます。
TONGUE_BACK_DORSAL_VELAR は、口形素「KK」の発音のように、舌の奥を口蓋に押し付けます。
TONGUE_OUTは、舌を突き出します。
TONGUE_RETREATは、舌を喉の奥に引き、口形素「AA」の発音のように、舌を下げた状態にします。
口形素 音素 例 中程度 強調 回転 SIL
中性
なし
PP
p、b、m
put、bat、mat
FF
f、v
fat、vat
TH
th
think、that
DD
t、d
tip、doll
KK
k、g
call、gas
CH
tS、dZ、S
chair、join、she
SS
s、z
sir、zeal
NN
n、l
lot、not
RR
r
red
AA
A:
car
E
e
bed
IH
ih
tip
OH
oh
toe
OU
ou
book