揚げログ

更新休止中・Karaageの活動報告とメモ

AR kit で顔面キャスアプリを作る (その2 ARFaceAnchorを理解してみる)

前回、SwiftでSocketIOをアプリに実装するところまで終わりました。

今回は、ソケットで送る内容について検討していきます。

まず大前提として、ソケットで送れるのはStringのみですので、必要な情報を適当なJSON配列にしていきたいと思います。

f:id:en0qi:20190124224051j:plain

ARFaceAnchor

英語ドキュメントを読み込む

ちょっと気力が入りますが、頑張って読みましょう。

developer.apple.com

必要な情報を絞り込むために、ARFaceAnchorについて詳しく見ていきます。

let anchor: ARFaceAnchor!

anchor.* Class 説明
.transform simd_float4x4 世界座標における現在の顔の位置と向き これを原点に顔座標系が作られる
.geometry ARFaceGeometry 現在の顔の寸法、形状 これで顔の形に沿ってコンテンツを被せられる
.blendShapes [NSNumber] 顔の各部位の開き具合、角度等の様々なパラメータ
.leftEyeTransform simd_float4x4 左目の位置と向き Z軸は眼球の奥から瞳孔を正の向きとした軸
.rightEyeTransform simd_float4x4 右目の位置と向き 左目と同様
lookAtPoint simd_float3 視線の方向と見ている位置(焦点距離)をベクトルで表す

simd_float4x4は4行4列の行列、simd_float3は3次元ベクトルです。

考察

試しにこれらをprintして中身を見てみました。

blendShapesの中身は結構すごいです。20箇所近い顔の部位の値が取れます。

そして視線も取れちゃうし、どこに焦点が合っているかも推測できるんですねー

これだけ色々顔の情報が取れたら、これをもとに感情推定とか出来そうですね。喜怒哀楽の顔を機械学習させて、ユーザーの感情を…みたいなこと、誰かやってるのかな?

どこみてるか分かるなら、同時に表のカメラ+AR kitの距離推定で、目で見つめてるものだけクロップするとか、出来そう。

うーん色々アイデアは思いつきますね!

実装

オプションを確認した結果、最低限blendShapesがあれば表情が、geometryもあれば顔の形状が、さらにEyeTransform, lookAtPointもあれば目の動きが取れることがわかりました。

前回も付け加えましたが、あくまで実験的実装として、まずは最低限のblendShapesのみを扱ってみたいと思います。

次回に続きます