UnityFaceCaptureで遊ぶ

本記事は[Craft Egg Advent Calendar 2021](https://qiita.com/advent-calendar/2021/craftegg)の12/20の記事です。投稿が遅れてしまい申し訳ございません！
12/19の記事は@ryousangataさんの[UnityのCoroutineのつまづきやすいところまとめ](https://qiita.com/ce_suzuki_ryohei/items/0da15f23d92156fe9375)
でした。

# はじめに

株式会社Craft EggでUnityクライアントエンジニアをしている中垣です。
@arumaniさんの[iPhoneで3D空間に入って撮影できる『Unity Virtual Camera』](https://qiita.com/arumani/items/4b8c3058425031aa4d2f)でも紹介されているLiveCaptureのパッケージサンプルにUnityFaceCaptureというものがあるということを知ったので、できることやその精度を確かめてみようと思いました。

※Unity 2021.2.6.f1,MacおよびiPhone12を使用しています。

# UnityFaceCaptureとは

UnityおよびUnityFaceCaptureアプリをインストールしたFaceId対応iPhoneを用いてリアルタイムで表情の変化を3Dモデルに反映させることができます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">併せてFace Captureも良い感じ・・ほっぺたふくらますことができた・・。あと舌が若干前後動く！！(笑）<br>こちらもマニュアルに記載されています。<br>ARKit Face Sampleで試すことができました。<a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a> <a href="https://twitter.com/hashtag/FaceCapture?src=hash&amp;ref_src=twsrc%5Etfw">#FaceCapture</a> <a href="https://twitter.com/hashtag/HDRP?src=hash&amp;ref_src=twsrc%5Etfw">#HDRP</a> <a href="https://t.co/6YFkM50Z7w">pic.twitter.com/6YFkM50Z7w</a></p>&mdash; ぽこぽん丸。@2021年もお世話になりました (@x_pokoponmaru_x) <a href="https://twitter.com/x_pokoponmaru_x/status/1420924421326327810?ref_src=twsrc%5Etfw">July 30, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

また、キャプチャ中の動作を録画することによってアニメーションアセットとして出力することができます。
![スクリーンショット 2021-12-28 16.42.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301970/fc146707-1c73-6806-5d66-c796d65e3ead.png)

(キーフレームの量が多いので修正して使うのは大変かもしれません)


# 導入方法と動作
前述の通り、LiveCaptureのパッケージサンプルですので
https://qiita.com/arumani/items/4b8c3058425031aa4d2f
こちらと同様の導入手順をご参照いただき、加えてLiveCaptureのSamplesプルダウンからARKit Face Sampleをインポートします。
![スクリーンショット 2021-12-26 21.36.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301970/8403ace1-ae52-2fe3-a250-9ac7aefbbee3.png)

インポートしたアセット内のFaceCaptureSampleシーンを開いておきます。

FaceIDに対応したiOS端末にて
https://apps.apple.com/us/app/unity-face-capture/id1544159771
こちらをダウンロードします。

iOSでアプリを起動しUnityと通信接続するとシーン内の3DモデルがiOSでキャプチャした顔と同期して表情を変化させます。


# 精度を確かめる

色々な表情をしてみますがかなり正確にトラッキングできています。特にほっぺたを膨らませたりするような動きにも対応できているので対応している表情は多数存在しそうです。


できなかった表情は唇が前後する状態、鼻を動かす状態、舌を左右に動かす状態は表現できませんでした。舌に関しては前後のみ対応しています。
![iOS の画像 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301970/13a19af6-4ce2-a6fe-6912-7fa1349001c8.jpeg)

アプリ側の開閉メニューからワイヤーフレーム表示をONにしてみるとどのようにキャプチャしているかが分かりやすいですが、口はカメラでその差を捉えきれていません。鼻は少しワイヤフレームに変化があるものの、その差を表現するブレンドシェイプがないものと推測されます。


# VRMモデルを使って遊んでみる

折角のトラッキング精度を他のモデルなどで利用できないか試してみました。
今回使用したモデルはVRoidのサンプルデータです。
VRMのインポートはこちらを参考にさせていただきました。
https://miyagame.net/vroid-unity-unity/

VRMのインポート時に生成されたPrefabにARKitFaceActorをAddします。
![スクリーンショット 2021-12-27 10.04.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301970/643ee5e2-158b-15de-1c48-6e9ba2de051a.png)

SampleHeadMapperを参考にMapperを作成します。
![スクリーンショット 2021-12-27 10.47.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301970/6ffcdbf4-21b6-4798-1d22-a964dc722632.png)


TakeRecorderの子のNew FaceDeviceのActorにインポートしたVRMPrefabを指定すると顔のトラッキングにモデルが反応します。
![スクリーンショット 2021-12-27 10.53.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301970/ef786baa-1bb1-090f-51ff-07d2e73b6e8a.png)
![スクリーンショット 2021-12-28 16.48.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301970/1a537c06-1822-cb71-ae2f-47d6ca4546b7.png)


ただ、ブレンドシェイプが対応していないためか関係のない箇所が動作したり動きすぎてしまったりとそのまま使用することはできないようでした。改良やSampleアセットを参考にモデルを制作することでVTuber的な使用方法も考えられそうではありました。





# まとめ
今回はサンプルを触ってみただけの内容ではありましたが、派生した使い方についても考えることができました。
ここまで記事をご覧いただき、ありがとうございました。