Face AR Sample プロジェクトは、Unreal Engine 内で Apple の ARKit によるフェイス トラッキング機能を利用する例を示します。Face AR Sample プロジェクトは Epic Games Launcher の [Learn (ラーニング)] タブからダウンロードできます。
Unreal Engine 4.20 では、Apple の ARKit によるフェイス トラッキング システムが新たにサポートされるようになりました。この API を使用すると、ユーザーは iPhone X のハードウェアを使って顔の動きをトラッキングし、その動きを Unreal Engine で使用できます。トラッキング データは、デジタルのキャラクターを動かすために使用したり、ユーザーが適切だと考える方法で再利用したりできます。Unreal Engine での ARKit の実装では、必要に応じて Live Link plugin を使ってフェイス トラッキング データを Unreal Engine に直接送信することもできます。このデータには、現在の表情と頭の回転の情報が含まれます。このように、ユーザーはスマートフォンをモーション キャプチャ デバイスとして利用して、画面上のキャラクターを操作できます。
Face AR Sample プロジェクトは完全機能のサンプルですが、プロジェクの探求を支援するために、セットアップと設定に関する情報が提供されています。Apple の ARKit と Epic の OpenXR サポートの進化に伴い、特定のプロジェクトでは実装の詳細が変更される場合があることに留意してください。
Apple の ARKit を使用したフェイス トラッキングの詳細については、Apple の公式ドキュメント フェイス ベースの AR エクスペリエンスの作成 をご覧ください。
現時点で、モバイル フェイシャル アニメーション キャプチャ システムは、フロントの TrueDepth カメラが採用された iOS デバイス (iPhone X、iPhone XS、iPhone XS Max、iPhone XR、iPad Pro (11-inch)、iPad Pro (12.9-inch、第3世代) のみで使用できます。
Face AR キャプチャの概要
簡単に説明すると、ARKit を使用したフェイシャル キャプチャ システムでは、Apple の TrueDepth カメラを使用してユーザーの顔の動きをトラッキングします。実際の処理としては、顔のポーズを 51 個の異なる顔のポーズと比較します。これらのポーズは Apple の ARKit SDK にネイティブに用意されています。また、各ポーズは、左目、右目、口の横など、顔の特定の部位を対象としています。ユーザーの顔の対象の部位がポーズの形に近づくと、そのポーズに 0.0 から 1.0 の間の値がブレンドされます。たとえば、ユーザーが左目を閉じると、LeftEyeBlink ポーズが 0.0 から 1.0 にブレンドされます。つまり、ユーザーの顔が自然に動くと、SDK によって 51 個すべてのポーズが評価され、値が割り当てられます。Unreal Engine の ARKit との連携によって、ブレンドされた 51 個の顔のポーズの値がキャプチャされ、Live Link plugin を使用してそれらの値が Unreal Engine に渡されます。その 51 個のポーズの値を使用することで、リアルタイムでキャラクターの顔を動かすことができます。そのため、顔のキャプチャを利用してキャラクターの頭のアニメーションを実現するには、それら 51 個のシェイプのデータを使用するようにキャラクターのコンテンツを設定する必要があります。それぞれのシェイプが 0.0 から 1.0 の値を個別に返すので、ブレンド シェイプのリストでキャラクターの動きを実現する場合に最適です。
Unreal のキャラクターに対して作成されたブレンド シェイプ名が、Apple 公式のシェイプの名前と完全に一致している場合は、自動的に関連付けられます。ただし、Apple のメッシュと Unreal のキャラクターとでシェイプ名が異なる場合は、アセットを再マッピングする必要があります。ブレンド シェイプ名の再マッピングの詳細については、「LiveLinkRemap アセットでカーブ名を再マッピングする」 をご覧ください。
Apple の ARKit で提供されるブレンド シェイプの完全なリストについては、Apple の公式ドキュメントARFaceAnchor.BlendShapeLocation を参照してください。
Face AR キャプチャの設定
ARKit を使ってキャラクターの顔をアニメーションさせるためにフェイス キャプチャ システムを設定する場合、次の手順を行う必要があります。
- キャラクター ブレンド シェイプを設定し Unreal Engine へキャラクターをインポートする
-
ブレンド シェイプ ベースのフェイシャル アニメーションを持つキャラクターを作成します。これは、Apple の ARKit ガイドライン で定義されている 51 個のブレンド シェイプに相当します。これらのブレンド シェイプのジオメトリは、Apple が一覧にしている関数 (eyeBlinkLeft、eyeLookDownLeft など) と同じ名前にするのが理想的です。ただし、名前は必要に応じて再マッピングできるため、異なる名前にすることもできます。
-
このキャラクターを Unreal Engine にインポートします。インポート オプションでブレンド シェイプがインポートされるようにしてください。
-
-
DefaultEngine.ini ファイルに以下の行を追加して、プロジェクトの DefaultEngine.ini ファイルでフェイス トラッキングを有効にします (DefaultEngine.ini はプロジェクトの Config フォルダにあります)。
[/Script/AppleARKit.AppleARKitSettings] bEnableLiveLinkForFaceTracking=true
- プロジェクトでデータ アセットを作成して適用し、フェイス トラッキングを有効にします。
-
コンテンツ ブラウザで右クリックし、[Miscellaneous (その他)] > [Data Asset (データアセット)] の順に選択します。
-
[Pick Data Asset Class (データ アセット クラスを選択)] ウィンドウが表示されたら、ARSessionConfig を選択して Select をクリックします。
- この新しいアセットをダブルクリックして開きます。
-
World Alignment:Camera
-
Session Type:Face
-
Horizontal Plane Detection:Off
-
Vertical Plane Detection:Off
-
Enable Auto Focus:Off
-
Light Estimation Mode:Off
-
Enable Automatic Camera Overlay:Off
-
Enable Automatic Camera Tracking:Off
-
Candidate Images:Ignore
-
Max Num Simultaneous Images Tracked:1
-
Environment Capture Probe Type:None
-
World Map Data:Ignore
-
Candidate Objects:Ignore
-
- フェイス トラッキング レベルのレベル ブループリントで、Begin Play から Start AR Session 関数を呼び出し、Session Config プロパティを先ほど作成した ARSessionConfig データ アセットに設定します。
-
- LiveLinkPose ノードを使用する Animation ブループリントを作成し、[Subject Name] を iPhoneXFaceAR に設定します。これにより、ARKit の顔の値が Unreal Engine のアニメーション システムに取り込まれ、キャラクターのブレンド シェイプの動作が実現されます。
AR Face コンポーネント
ARKit によるフェイス トラッキング システムでは内部フェイス メッシュを使用します。ユーザーの顔に内部フェイス メッシュをラップし、表情を模倣するための基盤として使用します。Unreal Engine では、このメッシュは AppleARKitFaceMesh コンポーネントによって公開されます。既存のブループリントに追加でき、ARKit SDK が参照している内容を可視化するように設定できます。これはその内容とキャラクターの顔の動きを関連付けるのに役立ちます。
以下は AppleARKitFaceMesh コンポーネントのプロパティです。
名前 | 説明 |
---|---|
Wants Collision | フェイス メッシュにコリジョン ジオメトリを追加します。パフォーマンスに大きく影響するので、アプリがメッシュをトレースする必要がある場合にのみ使用する必要があります。たとえば、顔に何かを付ける必要がある場合や、顔の位置を取得する場合です。 |
Auto Bind to Local Face Mesh | デバイス上のローカル ARKit フェイス ジオメトリにこのコンポーネントを自動的にバインドします。その後、ARKit がこのコンポーネントをティックごとに更新し、トラッキングできなくなった場合に対応します。 |
Transform Setting | Component Only::コンポーネントのトランスフォームのみを使用します。フェイス トラッキングを予定していない場合のみ、これを使用してください。 Component Location Tracked Rotation::コンポーネントの位置を使用しますが、アプリの使用中にユーザーの頭の回転をトラッキングします。 Component with Tracked::コンポーネントとトラッキングしたデータの両方のトランスフォームを連結します。 Tracking Only::コンポーネントのトランスフォームを無視し、トラッキングしたデータのみを使用します。 |
Flip Tracked Rotation | トラッキングした回転を逆にします。キャラクターに鏡像のようなエフェクトを適用する場合に便利です。 |
Face Material | AppleARKitFaceMesh コンポーネントのフェイス メッシュにマテリアルを適用します。デフォルトでは、AppleARKitFaceMesh コンポーネントは目に見えません。通常は、Face AR Sample プロジェクトで行うように、このプロパティにライティング無しワイヤーフレーム マテリアルを追加して、メッシュが簡単に見えるようにすることを推奨します。 |
Live Link Subject Name | Live Link アニメーション パイプラインの一部として、一意の識別子として使用されます。 |
フェイス キャプチャでジョイントを操作する
ゲームやリアルタイム プロジェクトでは、ほとんどの場合、キャラクターの顔はブレンド シェイプのみでアニメーションが実現されているわけではありません。通常、顔の部位の動作制御をサポートするフェイシャル スケルトンも使用されます。ARKit でのフェイス キャプチャ向けの Live Link の実装では、顔のブレンド シェイプを自動的に動かすことができますが、Pose アセットを使用して顔のジョイントを動かすこともできます。
フェイシャル アニメーション向けに ARKit を使用する場合、ボーンの設定は不要である点に注意することが重要です。顔の設定にすでにジョイントがあるか、ジョイントが必要であることが分かっている場合のために、この点をここに記載しています。
ジョイントを使用した補正ブレンド シェイプ
ジョイントで顔のアニメーションを実現する場合などの特定のケースでは、適切な動作になるように、同時にトリガーされるブレンド シェイプも必要になる場合があります。そのようなブレンド シェイプは、しばしば 補正ブレンド シェイプ と呼ばれます。
たとえば、下の画像では男の子のあごがジョイントの回転のみで開いています。また、補正ブレンド シェイプをその上にレイヤー化することでどのように改善されるかも示しています。
左側の画像では、ジョイントの回転のみで男の子の口が開いています。あごの下側が横に広く開きすぎている点に注目してください。中央の画像では、ジョイントの回転であごが開いていますが、その上に補正ブレンド シェイプが追加されています。あごが適切に伸び、より自然に見えます。右側の画像は補正ブレンド シェイプのみです。口とあごの先をつなげて伸縮の処理に対応しています。ジョイントの回転と補正ブレンド シェイプの 2 つのシステムは、常に一緒に機能します。一方だけで動作することはありません。
補正ブレンド シェイプのその他の機能
Face AR Sample の Animation ブループリントには、アニメーション グラフに補正ブレンド シェイプを追加するためだけのセクションがあります。これは、目が斜めの向き (左下など) を見ている場合などの特別な補正のためにあります。通常、そのようなポーズは、ARKit で提供される元のリストには含まれていないブレンド シェイプを追加することで処理され、標準シェイプの値に基づいてブレンドされます。
たとえば、右目が斜め左下を見る際に使用する特別な補正ブレンド シェイプがある場合、Animation ブループリントを使用して eyeLookDownRight と eyeLookInRight の値を読み取り、そのデータを使用してまったく別のブレンド シェイプを有効にできます。これは Face AR Sample の Animation ブループリントで確認できます。
フェイシャル アニメーション用の Pose アセットの作成
必要な Pose アセットを作成して ARKit データからフェイシャル アニメーションを動かすには、次の手順を実行します。
- DCC アプリで、次のようにアニメーションを作成します。
-
最初のフレームは停止のポーズでキーフレームにし、変更は加えません。
-
フレーム 2 以降は、各フレームを Apple の ARKit リストのポーズとして、異なるキーフレームのスケルタル ポーズにする必要があります。たとえば、フレーム 2 を eyeBlinkLeft、フレーム 3 を eyeLookDownLeft のようにします。
-
ARKit のリストで要求されるポーズをすべて作成する必要はありません。リグのためにジョイントが動く必要があるポーズのみを作成します。たとえば、Face AR Sample ファイルの場合、jawOpen はジョイントの回転で処理されます。ただし、あごを開く際により自然な動きになるように、少し顔をつぶすようなブレンド シェイプもあります。
-
注:Face AR Sample プロジェクトの KiteBoyHead_JointsAnim というアニメーション アセットで、このアニメーションの見え方の例を確認できます。
-
-
アニメーションに含まれるポーズと、各ポーズの出現する順番のリストを用意しておく必要があります。これはスプレッドシートで行うことを推奨します。そうすれば、あとで Unreal Engine に簡単に名前を貼り付けることができます。
-
アニメーションを Unreal Engine にインポートし、キャラクターのスケルトンに関連付けられていることを確認します。
-
Unreal Engine 内でアニメーションを右クリックし、[Create] - [Create Pose Asset] を選択します。
- アセットには、アニメーションのフレームごとにポーズのリストが含まれます。スプレッドシートから名前のリストを直接コピーして貼り付けて、名前を変更できます。
男の子の顔のリグ設定について、3Lateral のチームのご協力に感謝いたします。
LiveLinkRemap アセット内でのカーブ名の再マッピング
-
[My Blueprint] パネルの [Function] グループで、[Override] そして [Get Remapped Curve Names] を選択します。
-
入力と出力と合わせて、関数のグラフが開きます。目標は、このグラフを使用して、Apple の SDK で想定される名前リストから受け取った名前を、キャラクターのブレンド シェイプ名に対応する名前に変更することです。たとえば、キャラクターのブレンド シェイプが適切な名前であるものの、「Character_」が追加されている場合、使用するグラフは次のようになります。
Apple SDK から受け取った名前に「Character_」を追加し、結果を出力している点に注意してください。
頭の回転の操作
一部のプロジェクトでは、トラッキングされた顔の回転にアクセスする必要があります。Unreal Engine での ARKit の実装では、回転のデータを顔のシェイプの値と一緒に渡します。KiteBoyHead_JointsAndBlends_Anim Animation ブループリント内に表示されるセクションで、次のように、このデータが詳細に分割され、Modify Bone ノードで首と頭のジョイントに適用されます。
HeadYaw、HeadPitch、HeadRoll の 3 つのカーブでデータが送信されます。
iPhone X へのデプロイ
Face AR Sample プロジェクトで機能セットをすべて利用できるようにするには、プロジェクトを iPhone X にデプロイする必要があります。デプロイについてのドキュメントはすでに用意されていますが、iOS ゲーム開発 もご覧ください。プロジェクト ランチャーを使用してお使いのデバイスに Face AR Sample プロジェクトをデプロイする方が簡単かもしれません。
-
[Project Launcher (プロジェクトランチャー)] を開きます (メインのツールバーの [Launch (起動)] ボタンの右にある小さな矢印を使用します)。
-
ウィンドウの下部で、*[Custom Launch Profiles (カスタム起動プロファイル)] の横にある [+] ボタンをクリックして新しいプロファイルを作成します。
- 次のように設定します。
-
Build Configuration: Development
-
How would you like to Cook Content (コンテンツのクック方法を指定してください): By the Book (また、ビルド リストで iOS にチェックを入れてください)
-
Cooked Maps:FaceTrackingMap_Simplified (モバイルでのレンダリングに最適化されていないため、FaceTrackingMap2 のデプロイは推奨しません)
-
How would you like to package the build (ビルドのパッケージ方法を指定してください): Do not package
-
How would you like to deploy the build (ビルドのデプロイ方法を指定してください):Copy to Device: All_iOS_On_<お使いのコンピューター名> を選択。(Mac ではデバイスが具体的に表示されることがあります。その場合はそれを選択してください)
-
-
終了したら [Back (戻る)] をクリックします。
-
デバイスを接続し、iTunes から認識されることを確認します。
- 新しいプロファイルの [Launch This Profile (このプロファイルを起動する)] ボタンをクリックします。
プロジェクトの機能
Face AR Sample プロジェクトを適切に利用するには、iPhone X にデプロイする必要があります。デバイス上にデプロイすると、ユーザーは次に示すシステムの機能をすべてテストできます。
-
キャリブレーション
-
Live Link のブロードキャスト
-
デバッグと統計に関するデータの表示/非表示
-
ミラーリングの制御
キャリブレーション
デフォルトでは、キャラクターの顔はユーザーの顔に似ていない場合があります。多くの場合、想定しているポーズと最終的なポーズは多少異なる形になります。一般的には、SDK からキャラクターを作る際のデータの解釈に原因があります。これを簡単に確認できるのは、アプリの使用中にユーザーが口を閉じたニュートラルなポーズのときに男の子の唇が少し開いている場合です。
この問題に対処するために、アプリにはキャリブレーション システムが用意されています。アプリでは、左下にある設定ボタンを押すとキャリブレーション システムが開き、キャリブレーション モードになります。アプリ上でプロセスについて説明されます。
Face AR Sample プロジェクトでは、エディタでもキャリブレーション プロセスを使用できます。
-
エディタでのシミュレーション中に、シーンで男の子を選択します。
-
[Details (詳細)] パネルに In Editor Calibration イベント ボタンが表示されます。ボタンをクリックして、アプリと同じ方法でキャリブレーションを行います。
どちらの場合も、SDK で受け取った現在のフェイシャル キャプチャの値をプロジェクトが記録し、それらが新しいゼロになるようにスケーリングします。デバイスを使用しているかエディタを使用しているかによって、それらの値を収集する関数は異なる場所にあります (アプリ内ではポーンに、エディタでは Kite Boy ブループリント内にあります)。収集された値は、Modify Curve ノードで Apply Mode の設定を Remap Curve にして、Animation ブループリントで処理されます。
Live Link のブロードキャスト
Face AR Sample は、ただ楽しむだけのものではなく、デジタルのキャラクターの強力な操作手段やモーション キャプチャ デバイスとして iPhone X と ARKit を使うデモともなります。これは Live Link の標準的なワークフローではありませんが、アプリ上で簡単に行うことができます。
デバイスとコンピューターが同じ物理ネットワーク上にあることが重要です。iPhone で Wi-Fi が適切に設定されていることを確認してください。
-
アプリで、[Settings (設定)] ボタンをタップします。
-
[Live LInk Connection (Live Link 接続)] ボタンをタップします。
-
対象の行に IP アドレスを入力します。
-
画像内に自分の顔が表示されるので、リラックスした表情をします。
-
[Connect (接続)] をタップします。
IP アドレスを記録するかどうか尋ねられます。このオプションを使うと、セッション間で IP アドレスを保存できます。ただし、[Save IP Address] チェックボックスの状態は保存されないようになっています。これは意図的な挙動であり、アプリを再起動するたびにこの設定を確認する必要があります。
表示設定用チェックボックス
Face AR Sample アプリには、特定の機能の表示をオンまたはオフにするためのチェックボックスがいくつかあります。
-
Show Debug Mesh
-
Show Debug Values
-
Show Unit Stats
Show Debug Mesh
このチェックボックスでは、Apple の ARKit のデバッグ メッシュの表示と非表示を切り替えます。これは SDK がユーザーの顔の動きをトラッキングするために使用するメッシュです。アプリ内では、非常にシンプルなライティング無しワイヤーフレームのマテリアルでレンダリングされます。
フェイシャル モーション キャプチャを操作するデバイスとして Face AR Sample アプリを使用している場合、デバッグ メッシュのみを表示することを推奨します。スピードとパフォーマンスが向上し、デバイスの温度への影響が小さくなります。デバイスがオーバーヒートするとパフォーマンスが低下するので、これは重要です。
Show Debug Values
Show Debug Values を有効にすると、ARKit から Unreal Engine に渡される float 型の数値データを直接可視化できます。これらの値は、使用されているキャリブレーションのオフセットとは別のものです。これらのデバッグの数値を使用すると、受け取った ARKit データとアプリで想定されている結果に差異がある場合の診断に役立ちます。
Show Unit Stats
Show Unit Stats は、アプリのコンソールに「STAT UNIT
」と入力した場合と同じ機能です。Engine の標準的なユニット統計情報が開き、デバイスでパフォーマンスの数値を確認できます。
Help & About
[Help & About] 画面では、アプリ内で フェイス AR サンプル の概要を確認できます。このページと同じような内容が表示されます。
コンピューターへのアプリの接続
Face AR Sample プロジェクトの便利な機能の 1 つは、コンピューター上でモーション キャプチャ デバイスとして使用できることです。アプリはこのプロセスができるだけスムーズに行えるように効率化されています。ただし、開始前にデバイスとコンピューターが同じ物理ネットワーク上にあることを確認してください。
デバイスとコンピューターが同じ物理ネットワーク上にあることが重要です。iPhone で Wi-Fi が適切に設定されていることを確認してください。
-
お使いのコンピューターで Face AR Sample プロジェクトを起動します。
-
エディタで FaceTrackingMap2 マップを開き、キャラクターを正面から見られる位置に移動します。
-
エディタで S[Simulate (シミュレート)]S を押します ([Play (再生)] ボタンの横にある矢印の下にあります)。
-
お使いのデバイスで Face AR Sample アプリを起動します。
-
数秒後、左下隅に設定ボタンが表示されます。それをタップします。
-
[Settings (設定)] パネルで [LiveLink Connection (LiveLink 接続)] を選択します。
-
対象の行にお使いのコンピューターの IP アドレスを入力します。
-
[Connect (接続)] をタップします。