Apple Engine

Apple, iPhone, iOS, その周辺のことについて

アプリ開発から見る ARKit 3 の新機能

f:id:x67x6fx74x6f:20190612023117p:plain

WWDC 2019 で ARKit 3 が発表された。

ARKit 3 に関する他の記事は Keynote と SwiftStrike を体験した範囲で書かれているものが多いため、アプリ開発側からどのような機能が増えたか公式ドキュメントセッション動画から調べて書いてみた。

 

ARKit 3 で端末制限がある機能 

実は以下の目玉機能が A12 / A12 X Bionic 以降でしか使えない。

  • 仮想オブジェクトで現実空間にいる人を遮蔽するピープル・オクルージョン
  • 人の骨格の動きをトレースするボディトラッキング(モーションキャプチャ)
  • 前面/背面カメラを同時に使用するマルチカム

 

iOS 13 がリリースされる時には、新しい iPhone が発売されるのである程度は増えるが、iOS 13 対応の以下の端末では使用できないこととなる。

  • iPhone X
  • 8/8 Plus
  • 7/7 Plus
  • 6s/6s Plus
  • 7世代目の iPod Touch
  • 3世代目の iPad Pro 以前の iPad

 

別に「A12 / A12 X Bionic 以降でなくても動くのでは?」と思うかもしれないが併用して機能が使用されたり、バッテリー持ちなど Apple の言い分もあると思われ。
まぁ、わからんでもない。

 

ARKit 3 での新機能

  • ピープルオクルージョン
  • ボディトラッキング
  • ARKit でのマルチカムの使用
  • フェイストラッキングの上限増加
  • イメージトラッキングの強化
  • VR 用のトラッキングモード
  • リアルタイムでの HDR テクスチャキューブマップの生成
  • カメラノイズを仮想オブジェクトへの適応
  • レイキャスト
  • AR Coaching UI
  • Multipeer AR Experience(マルチユーザー AR)

 

ピープルオクルージョン

今までの ARKit ではカメラ映像の上に仮想オブジェクトを配置していた。
机の上を認識後、仮想オブジェクトをそこに配置した時、机より前に人がいても仮想オブジェクトが人の前に表示されてしまう。

ARKit 3 からはカメラアプリのポートレートと同じような機能使用し、機械学習で映像から人の部分を切り取り合成し、この問題を解決する。

f:id:x67x6fx74x6f:20190612024028p:plain
左:オクルージョンなし 右:オクルージョンあり

 

iOS SDK 的には、人の部分を切り取るだけのモードと、Z 軸を含んだ奥行き情報(深度情報)を持つ切り取りと2つの機能あり、Metal でカスタムレンダラーを書かずに RealityKit や SceneKit を使用する場合は数行書くだけでこの機能が使用できる。

f:id:x67x6fx74x6f:20190612024606p:plain
深度情報なし

f:id:x67x6fx74x6f:20190612024647p:plain
深度情報あり

 

ボディトラッキング

f:id:x67x6fx74x6f:20190612033410p:plain f:id:x67x6fx74x6f:20190612024755p:plain

バックカメラのカメラ映像から人体を検出し、ARKit で設定されている 93 の骨(スケルトン)を割り当て、仮想キャラクタを動かしたり、モーションキャプチャデータとして使用することができる。
画面座標となる 2D 座標も同時に設定されるため、2次元のキャラにも適応可能。

予想では先のピープルオクルージョンで人体の形状を取得しそこからスケルトンを割り当てているのだと思われる。
(雑に説明すると手や足など画像領域の中間地点が骨の部分になるため、それを繰り返す)

 

iOS SDK 的には、腰骨を中心に各骨が階層構造になっており、3DCG でリグを組んだり触った人は簡単に想像がつくと思われる。
スケルトンの各ボーン(ジョイント)はローカル座標と腰骨からのモデル座標と2つある。

また、既存のワールドトラッキングのラップなので、平面認識やイメージトラッキングを併用することもできる。

 

ARKit でのマルチカムの使用

f:id:x67x6fx74x6f:20190612025145p:plain
セッションでのデモ

iOS 13 前面背面カメラを同時に使用することが可能になったが、ARKit でも使用することができる。

ARKit 3 のセッションでは背面カメラに顔のオブジェクトを置き、前面カメラのフェイストラッキングから動かすデモを行っていた。
例えば、顔や視線でコントロールする AR ゲームなど、使用できる幅は広そう。

この逆のフェイストラッキングで前面カメラ画像を使用している状態からワールドトラッキングを使用することもできる。

iOS SDK でいう ARImageTrackingConfiguration で設定する画像のみのトラッキングでは、この機能を使用することはできない。

 

フェイストラッキングの上限増加

f:id:x67x6fx74x6f:20190612031102p:plain

今までの ARKit はひとりの顔のみの認識可能だったが、iOS 13 から最大3人までの顔を認識できるようになった。

開発的な話だが、顔に対して ID が振り当てられ、途中で1人抜けても ID 保持される。
多分、カメラ画像に対して顔の位置で判別している。

 

イメージトラッキングの強化

一度に最大100枚の画像を検出するようになった。

また、画像自体の物理的なサイズの違いを自動的に判別できるようになった。

 

VR 用のトラッキングモード

VR の様なカメラ画像を使用せず、仮想コンテンツのみで構成する画面用のトラッキング設定が追加された。

カメラ画像は可能な限り荒い解像度を使用し、6DoF で端末が今どこに位置しているかなどの位置推定を行う。

平面認識を使用することは可能。

 

リアルタイムでの HDR テクスチャキューブマップの生成

ARKit 2.0 で機械学習から周囲の画像を推論しキューブマップを作成して、物体の鏡面反射や光を表現をしていた。

ARKit 3.0 ではこれを応用して HDR テクスチャを生成し、光の強さがより現実に近いものになったと思われる。

f:id:x67x6fx74x6f:20190612031739p:plain
右が HDR が適応されているマテリアル

 

カメラノイズを仮想オブジェクトへの適応

iPhone / iPad はハード上仕方ないのだが、カメラで暗い場所を撮ると多くのノイズがのる。
写真では画像調整されるため気付きにくいが、動画を撮ると割とノイズが乗っているのがわかると思う。

そのため、カメラ画像のノイズから推論しそのノイズと同等のものを仮装オブジェクトへ適応するカメラエフェクトが追加され適応できるようになった。

f:id:x67x6fx74x6f:20190612031827p:plain
分かりにくいが、右は仮想オブジェクトにノイズを加えたもの

 

レイキャスト

今までは、画像から推定するヒットテストで画面から仮想オブジェクトへのタッチを検知していたが、光線を飛ばしてぶつかった場所を調べるレイキャストが実装された。

正直、処理が軽いヒットテストでも良いと思っており、RealityKit 側にもヒットテストが実装されているため、導入された理由が次期機能のためにあるのではと思っている。

 

AR Coaching UI

ユーザー側にはあまり関係ない機能だが、 AR を始める際にデバイスを動かして周囲を検知させる状態や、平面認識を促すなどの UI が実装された。

今までは開発者が自前で実装していた。

f:id:x67x6fx74x6f:20190612031154p:plain

 

Multipeer AR Experience(マルチユーザー AR)

同じアプリを起動している複数のデバイスでの空間共有が簡単にできるようになった。
リアルタイムかつ近くにある端末同士の処理なので、2.0 で追加された空間の情報を保存/復元するものとは異なる。

かなり簡単に実装できるため、空間をリアルタイムで共有するゲームや何らかの操作をコラボレーションするアプリが今後増えると思われる。

f:id:x67x6fx74x6f:20190612033806p:plain

 

まとめ

RealityKit への対応、平面認識の高速化、物体認識の精度が上がったりなど他にも機能はあり、かなりの進化を遂げたと思われる。

日本ではオリンピックが開催される流れで日本でも早い段階でマップアプリの Look Around が使える可能性高く、オリンピックに伴い ARKit の機能も強化される可能性もある。

また、今後期待される AR グラスなど、何かあるような期待をさせてくれたのが今回のアップデートのような感じはしている。

 

ARKit で新しく追加された API に関してはこちらを参照。