top.png

はじめに

先日 "ARKit"で AR と VR の切り替えを試してみた。 という記事を書きましたが、今回はもっと広く ARKit の出来ることを紹介します。

ちゃんとした AR

これまでも 拡張現実機能搭載! と謳ったようなアプリはありました。
ですが、ほとんどがカメラプレビューの上に画像や3D モデルを被せただけの なんちゃって AR でした。

ARKit で出来ることがこれまでとどう違うのかを説明していきます。

ARKit のプロセス

ARKit の大まかなプロセスです。
端末のカメラとジャイロのみで空間座標の集合(ポイントクラウド)を生成するのが、特出しているところでしょうか。

ss03.png

このポイントクラウドと、それを利用した ARKit の機能が次になります。

  1. ポイントクラウド(3次元座標の点集合)取得
  2. 平面の検出
  3. ポジショントラッキング
  4. 現実空間への当たり判定(ヒットテスト)
  5. 現実空間とのスケールの同期
  6. 環境光の推定カメラ画像の取得

1. ポイントクラウド

カメラ映像から取得した特徴点を、ジャイロや時間軸で移動距離を加味した上で三角測量で計算しているようです。

  • 現実空間の物体の位置を点座標の集合で取得できる
  • 秒間数百以上の座標を取得できる
  • セッション開始から2,3秒程度で検出

カメラ映像を利用するため、単色に近い背景ではポイントクラウドの精度が落ちるようです。

2. 平面の検出

平面検出はポイントクラウドを利用しているようです。

  • 現実の平面を3D 空間上の平面として取得できる
  • 取得できるのは机や床などの平面のみ
    (壁などの垂直面は取得不可)
  • ARKit 起動後3〜4秒程度で検出
  • 平面情報は矩形のみ
  • 複数の平面を認識、カメラのアングルを変えても維持が可能
  • 同一と判断された複数の平面は自動的に結合される

3. ポジショントラッキング

ユーザの体感として最も新鮮に感じるのは、この機能なのではないでしょうか?

  • 現実空間での自分( iOS 端末)の位置と向きが取得可能
  • カメラとセンサ情報を元に構成した3D 空間内での相対位置
  • 背面カメラで外を映す必要あり

拡張現実(AR)以外でも利用できます。

例えば、これまでの VR アプリは頭の回転(ヘッドトラッキング)しか検知できませんでした。
ですが ARKit を使えば頭の移動(ポジショントラッキング)ができるようになるのです!

4. 現実空間への当たり判定(ヒットテスト)

ポイントクラウドの点や検出した平面を利用して、擬似的に現実空間との接触を判定することができます。

  • メインカメラからレイを飛ばして現実空間との当たり判定を行える
  • 当たった先が点なのか平面なのかまで判定できる

コード上には
ARHitTestResultTypeVerticalPlane (垂直面を検出)
がある、今後対応予定なのか?

5. 現実空間とのスケールの同期

  • 現実空間とスケールが同期している
  • ポイントクラウド、平面検出、ヒットテストなどの座標が対象

そのため「床との距離」や「机の長さを測る」などといった事も可能です。
次の動画は開発者の間で話題になりました。

6. 環境光の推定カメラ画像の取得

ポイントクラウドを利用するかたちでは無いですが、カメラの写している空間の明るさを取得できます。

  • 周囲の明るさを単一の数値として取得
  • 「全体として明さ」が分かるだけで光源の位置や個数は取得不可

こちら ARCore のデモになりますが ARKit でも同様のことができます。

AR/MR 比較表

ARCore という単語が出ましたが …
ARKit をはじめ Tango や ARCore など ちゃんとした AR が出来るシステムが増えてきて、ここ最近 AR/MR 界隈が熱いです!

そこで一覧表にまとめてみました。

ss02.png

2017年11月現在、対応端末の多さからみるに ARKit で作るアプリが、最も多くのユーザに体験して貰えそうですね!

ARKit で出来ないこと

(iPhoneX や iPhone8 はともかく) 現行機種にも対応させた ARKit では出来ることに限界があります。

空間情報の保存と読み込み

同じ場所でも違う日に違う角度で連続性のあるものとして扱えません。
(ポイントクラウドの永続化と、位置情報との関連づけが出来ないということです。)

現実の物体との関連付け

空間情報はあくまでも相対的な点の集合です。
手っ取り早い実現方法は、マーカー認識と併用する方法でしょうか?

高精度なポイントクラウド取得

これまで述べた通りカメラ映像とセンサから相対的に導き出した値でしかないので精度は低いです。
( iPhone X の TrueDepth カメラ なら精度が変わる?)

ポイントクラウドから空間メッシュを作成

ポイントクラウドの精度と端末のスペックの関係からか、いまのところはその機能はありません。

マーカートラッキング

ARkit にはマーカートラッキングの機能はありません。

Unity2017.2 から Vuforia のフレームワークが内蔵されました。
Vuforia はマーカートラッキングが扱えます。

実際に開発してみて気づいたこと

開発しやすい

Unity のコンソールウィンドウから iOS 端末実機を指定して接続すると、、、

ss04.png

わざわざアプリを端末にインストールしなくてもカメラやジャイロセンサーを使った動作確認ができます!!

ss05.png

レイテンシが小さい

端末を頻繁に動かしても配置した3D モデルなどがブレませんでした。
ポイントクラウドの計測計算が優秀なのでしょうか?

ヘッドマウンドディスプレイで覗いて酔わない

ヘッドトラッキングからポジショントラッキングに入れ替えた VR アプリだと「 VR 酔い」が軽減しました。
レイテンシが小さいことによる効果なのか?
向きに加えて移動も出来るようになったことにより、体感が自然に近づいたおかげなのか?

3D サウンドをユーザが体験しやすくなる

こちらもポジショントラッキングに入れ替えた VR アプリでの話です。
ユーザが空間を移動できるようになると音源との距離に強弱が生まれやすくなったため、音量の変化が豊かになりました。

実際に作って見た

なごみの耳かき MR デモ

弊社が開発を担当した なごみの耳かき の一部のシーンを ヘッドトラッキングからポジショントラッキングに入れ替えてみました。

二眼(複眼)モード

ポジショントラッキングにしただけでもプレイ中の雰囲気はだいぶ変わるのですが、できればもっと没入したい。
そこで二眼(複眼)表示を実装しました。

体験してみないとなかなか伝わらないものなのですが、ヘッドトラッキングの頃より臨場感は5割り増しです!!

AR/VR モード切替

当然ながらカメラプレビューが前面に表示された所謂 "AR" のときもポジショントラッキングはできます。
そこで見た目を AR と VR で切り替える処理を実装してみました。

MR アクアリム?

「二眼(複眼)モード」と「 AR/VR モード切替」を使って海中を歩くアプリを作ってみました。 そんなに時間を掛けたものではないですが、意外と没入感がありました。

TrueDepth カメラの利用

先日 (11/3) Unity ARKit Plugin が更新されました。

ブログ を読むと Face Tracking 機能の追加と書かれていました。
これまでにも OpenCV を利用して FaceTrac king を実現したアセットはありました。
何か違いがあるのでしょうか?

試しにサンプルプロジェクトをビルドしてみました。

iPhoneX には TrueDepth カメラ(正面カメラ) があります。
このカメラは被写体の深度マップを リアルタイムに 取得できます。

つまりこのサンプルは、個人の顔の形状にも表情の変化にも対応してリアルタイムにメッシュを生成、更に顔の位置を正確に捉えて表示させていることになります。

凄いですね。

さいごに

いかかでしょうか?
まとめると、ちゃんとした AR とは、「数学的に空間を把握が出来るようになり、間接的ではあるがその空間に干渉もできるようになった最新の拡張現実技術」ということです。

「見る」だけではない、「感じて触れる」ことができる AR
今後は現実空間で遊ぶ、インタラクティブなARアプリが増えていくでしょう。

ワクワクしますね!!