UnityでARkitでFaceTracking
Facial AR Remote
Unity公式ブログにて「Facial AR Remote」なるものが公開されており、とても簡単にiPhoneXシリーズを使ってUnityでリアルタイムFaceTrackingすることが可能。
動かし方
ソースもGithubに公開されておりセットアップもReadMeに丁寧に書いてある。
環境
・Unity 2018.2.1 (2018.1でも動くが、2018.2にしておくとTextMeshProを後から追加する必要がないので楽。)
・iPhoneX iOS12 .1
・XCode10.1
クライアントアプリケーション(iOS)
1. プロジェクトをクローンまたはダウンロードしてきたらUnityで開きビルドターゲットをiOSに指定、Player Settingsを開く。
2. Other Settings > Camera Usage Descriptionのとこになんでもいいから適当に入れとく「AR Face Track」とか
3. Client.sceneを開きヒエラルキー、ClientオブジェクトのClientコンポーネントStreamSetting部分からARKitのVerを指定してシーンをビルド
4. ビルドされたXCodeのプロジェクトもビルドする。Automatically manage signing にチェックを入れて登録してあるTeamを指定してiPhoneXにビルド今回自分の環境ではサクッと行けた。
ホストアプリケーション(Mac)
1. さっきと同じプロジェクトのSlothBlendShapes.sceneを開く。ビルドターゲットは各々のにしておく。
2. ヒエラルキー、StreamReaderのNetworkStreamコンポーネントのStreamSettingでiOSのクライアントアプリとARkitのverを合わせる。
3. 受信用のポートを設定しておく。(デフォルト9000)
動かしてみる。
それぞれのアプリを立ち上げ、iOS側からIPアドレスとポートを指定してCONNECTを押せば動くはず。クオリティが高いです。
それぞれの値にアクセスする。
クライアントアプリからは51箇所のブレンドシェイプの値や顔やカメラの3次元の位置や角度がきてる。
飛んできたままの値はStreamReader.csのとこみれる。
//頭の位置
Vector3 headPosition = m_HeadPose.position;
//頭の角度
Quaternion headRotation = m_HeadPose.rotation;
//各ブレンドシェイプ値
for (var i = 0; i < blendShapesBuffer.Length; i++){
float blendShapeTarget = blendShapesBuffer[i];
}
ブレンドシェイプのリストはBlendShapeUtils.csにバーっと書いてある。
他の機能
・StreamReaderではRec機能やプレイバック機能がある。便利げ。
・BlendShapesController.csにてブレンドシェイプ値にてスレッショルドからスムージングやら値の上書きなどの設定が可能、便利げ。