夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

iPhoneでFaceトラッキングを行う

本日はiOS枠です。

〇環境

・Mac Minit (M2)

iPhone 12ProMax

・Unity2022.3.5

〇対応機種

ARKitでのFaceTrackingは以下のデバイスが対応しています。

・iPhoneX

・iPhoneXs

・iPhoneXs Max

・iPhoneXR

iPhone 11シリーズ以降

iPad Pro

条件としてはフロントカメラでTrueDepthもしくはA12 Bionicチップ以上を必要としています。

基本的にX以降のシリーズは対応しているとみていいでしょう。(初代を除くSEも対応 しかしご自身のデバイスが対応しているかは要確認)

iPhoneでFaceTracingを使用する。

①Unityを起動し新規のプロジェクトを立ち上げます。

②PackageManagerを起動しARのパッケージを導入します。

ARFoundationなどの構成する各パッケージをなお個別で導入しても大丈夫です。

③新規シーンを開きMainCameraを削除します。

④右クリックー>CreateコマンドからARSessionOriginAR Sessionを作成します。

⑤右クリックー>CreateコマンドからAR Default Faceをシーンに追加します。このオブジェクトはプレファブ化してください

⑥シーンから⑤で追加したAR Default Faceを削除します。

これでAssetsの中にのみプレファブとして存在するようになりました。

ARSessionオブジェクトにAR Face Managerコンポーネントをアタッチします。

またFace Prefabには⑥で作成したプレファブをアタッチします。

ARSessionOriginの子オブジェクトARCameraからARCameraManagerFacingDirectiionUserに設定します。

これによってインカメラが使用されるようになります。

ProjectSettingsXR Plug-in ManagementARKitからFace Trackingをチェックを入れ有効化します。

以上でプロジェクトの設定が完了しました。なおビルド方法及びARKitのプロジェクト設定などの一部は省略しています。

〇FaceTrackingのデータの取得

ここまでの実装でFaceTrackingによって顔が検知された場合顔をマスクするようにメッシュが張られます。

位置情報を取得するには次のようなコードを使用します。

using MessagePack;
using MessagePack.Formatters;
using MessagePack.Resolvers;
using System;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.XR.ARFoundation;

namespace ARPosSync
{
    public class FaceTrackingController : MonoBehaviour
    {
        private ARFaceManager faceManager;
        private ARSessionOrigin arSessionOrigin;

        [SerializeField]
        public TextMeshProUGUI textMeshPro;
        Vector3 relativePosition;
        void Start()
        {
            // ARFaceManagerとARSessionOriginの取得
            faceManager = FindObjectOfType<ARFaceManager>();
            arSessionOrigin = FindObjectOfType<ARSessionOrigin>();

            // ARFaceManagerのイベントにメソッドを登録
            faceManager.facesChanged += OnFacesChanged;
        }

        void OnFacesChanged(ARFacesChangedEventArgs args)
        {
            foreach (var face in args.added)
            {
                // 顔が検出されたときの処理
                UpdateFacePosition(face);
            }

            foreach (var face in args.updated)
            {
                // 顔の情報が更新されたときの処理
                UpdateFacePosition(face);
            }
        }

        void UpdateFacePosition(ARFace face)
        {
            // カメラのTransformを取得
            Transform cameraTransform = arSessionOrigin.camera.transform;

            // 顔の相対座標を取得(カメラ座標系に変換)
            relativePosition = cameraTransform.InverseTransformPoint(face.transform.position);

            // ここで取得した相対座標を利用して何かしらの処理を行うことができます
            string data = $"{relativePosition.x}, {relativePosition.y}, {relativePosition.z}";
            textMeshPro.text = data;
        }
    }
}

このスクリプトではiPhoneのカメラ座標に対しての相対的な座標としてユーザーの顔の位置を返すようになっています。

ARFaceManagerが顔のトラッキングを行っています。 この.facesChangedにイベントとして自身のメソッドを追加している形になります。

これによって顔の追跡状況の変化によってUpdateFacePositionを実行できます。

〇実機で確認

HoloLensを装着している状態でも問題なく顔を認識してました。

youtu.be

本日は以上です。