ARKitとは?

ARKitは2017年6月にAppleが公開したARアプリケーション開発用のAPIです。 https://developer.apple.com/videos/play/wwdc2017/602/

ARKitで特筆すべきは、特殊なハードウェアを使わずにiPhone内のセンサと、画像解析データを元にソフトウェアベースで空間構造を認識し、AR体験を実現している点です。

その結果、Apple A9以降のプロセッサを搭載している機種(iPhone6S以降)のデバイスであれば、利用可能となり、ARKitの潜在ユーザ数は数億人にまで広がりました。現時点でAppleは世界最大のスマホARプラットフォーマーです。

発表当初はポジショントラッキング、平面検出による床認識など限定的な機能だけでしたが、ARKitはiOSのバージョンアップのタイミングで随時進化しており、実現できる事は広がってきています。

ARKit 1.0ポジショントラッキング、平面検出 etc..
ARKit 1.5垂直面検出、2D画像認識 etc..
ARKit 2.0AR空間情報の保存、AR空間情報の共有、3Dオブジェクトの認識 etc…
ARKit 3.0
[2019年秋以降]
ヒューマンオクルージョン、モーションキャプチャ etc…
※上記機能はA12プロセッサ搭載端末(iPhoneXR以降)のみで有効

ARKitの仕組み

ARKitはVIO(Visual Inertial Odometry)との技術で空間認識を行っています。

VIOとはデバイスのモーションセンシング(おそらく加速度センサやジャイロ)と、デバイスカメラから取得した 画像を解析を組み合わせて実現している技術です。

上記背景から、以下の様な環境下ではARKitはうまく動作しません。

  • 動いている電車やエレベータの中
    • → モーションセンシングによるポジショントラッキングが機能しない為
  • 特徴点が少ないオブジェクト(真っ白な壁)や、暗い環境
    • → カメラから取得した画像内の特徴点を利用した解析が機能しない為

ARKitで実現できる事

水平面、垂直面検出

ARKitの最もベーシックな機能の一つである平面検出。

現実世界の水平面を検出する事で、床やテーブルの上に3Dオブジェクトをまるでそこに存在するかの様に配置する事ができます。

ARKit1.5以降では、水平面だけでなく垂直面(壁など)や矩形以外の平面も認識できる様になりました。

ポジショントラッキング (自己位置推定)

現実空間での自分(iPhoneのカメラからの視点)の位置と向きが取得できます。

前述のVIO(Visual Inertial Odometry)をもちいて、iPhoneのカメラの位置、角度を計算する事でポジショントラッキングを行っているわけです。

ポジションは認識している現実空間内での相対的なポジションであり、現実世界での絶対的な座標情報が得られるわけではありません。

現実空間のサイズ、距離の推定

ARKitで空間認識を行う事で、現実空間のスケール(サイズや距離)を推定できます。

しっかりと、空間認識できれば数ミリ程度の誤差で測定する事ができる印象ですが、特徴量の少ない対象だとかなりズレます。

iOS12からプリインストールされているARを利用したメジャーアプリの様なユースケースが代表的ですね。

環境マッピング(環境テクスチャ)

環境マッピングとは3Dオブジェクトの表面に擬似的な周囲環境の映り込みの再現する事です。

ARKitを利用する事で、環境マッピングを適用する事が可能です。

顔認識

顔を検知して、顔の位置や向き、顔のトポロジ、表情を取得可能です。

顔に何かしらの、3Dオブジェクトを貼り付ける事でSnowや、SnapChatのフィルターっぽい事が実現できます。 ARKit3からは、複数人同時の顔認識も可能になりました。

2D画像認識

登録しておいた画像を認識する事ができます。
複数の画像、動いている画像も認識、追跡可能です。

AR空間情報の永続化、共有

認識した現実世界の情報を保存、共有が可能です。

平面情報や、設置した3Dオブジェクトなども保存可能です。

ヒューマンオクルージョン [ARKit 3.0以降]

オクルージョンとは、ARで表示された3Dオブジェクトの前に何かを置いた場合、その3Dオブジェクトがちゃんと隠れる状態の事です。

オクルージョンの例(これはARKit3の機能とは関係ないNianticのデモ)

オクルージョンを実現する為には、手前のオブジェクト(隠す側)と、奥のオブジェクト(隠れる側)の両方を認識して重なった際に、3Dオブジェクトを隠す処理する必要があります。 ARKit3では、人物に限ってオクルージョンを実現する機能が備わる様です。

モーションキャプチャ [ARKit 3.0以降]

カメラに写った人の動き(骨格)をリアルタイムで認識する、モーションキャプチャが可能になりました。 人の動きに合わせて、3Dキャラクターを重ねるなど、Vtuber的な機能のあるアプリ開発に利用できそうです。

フロント、バックカメラの同時利用 [ARKit 3.0以降]

フロント、バックカメラを両方使ってARKitの機能を利用できる様になりました。