iOS 11から追加された、AR機能を実装するためのフレームワーク「ARKit」についてWWDCのラボ(Appleのデベロッパに直接質問できるコーナー)で聞いたことのメモです。注目のフレームワークなので行列ができてましたが、丁寧に色々と教えてくれたので、忘れないうちに書いておこうと思います。
(WWDCセッションスライドより)
既存実装とどう共存させるか?
先日の記事にも書いたのですが、今働いている会社のアプリ「Fyuse」はスマホで3D的な写真を撮るアプリで、その撮影を補助するために、撮影対象の周囲に3Dの「ARガイド」を表示するという機能をAVFoundation+Metal+SceneKit+独自の画像処理ライブラリ(トラッキング等)で実装しました。
ARKitを使うとなると、要iOS 11以上、要A9以上のプロセッサという条件を満たす必要があるわけですが、当然2017年現在では多くのアプリはこれよりもっと広いiOSバージョン、iOSデバイスをサポートしたいはずです。
で、まず聞いたのは、そういう既存実装とARKitを共存させるのに、
if <# iOS 11以上 #> && <# A9以上 #> { // ARKitを使う実装 } else if <# 既存実装を使う条件 #> { // 既存実装 } else { // それ以外 }
みたいなのを避ける方法があったりしませんか?と。
→ 回答:ない。ARKitを使うにはiOS 11以上、A9以上が必要だ。
・・・はい。そりゃそうですね。変な質問してすみません。でもせっかく来たので食い下がって聞いてみました。
「他のAR利用アプリもiOS 10以下はまだ切れないと思うけどみんなどうしてるの?たとえばポケモンGoとか」
→ 回答:知らない。
・・・はい。そりゃそうですよね。(もし知ってても言えないですしね)
既存実装と比較したARKitのアドバンテージは何だと思うか?
質問が悪かったので、「じゃあ既に実装が済んでいて、ARKitを使うとなると既存実装にプラスしてバージョンわけが必要というデメリットがありつつ、それでもARKitを使う理由はあるのか」という観点から、我々の既存実装と比較したARKitを使うメリットについて聞いてみました。
→ 回答:
- Appleの純正フレームワークは公開APIよりもっと下のレイヤーを利用した実装ができるので、サードパーティ製の実装よりもハードウェアに最適化されている。よってバッテリー消費量や処理速度の面で優れていると考えられる
- ユーザーがタップしなくても、ARのセッションを開始した時点でシーンの解析が完了している(これは厳密には我々の用途にとってはアドバンテージではないが、「違い」ではある)
- デバイスの姿勢も考慮してキーポイントを抽出してるので、デバイスを動かすと云々(すみません、実はこのへんちょっとよくわかりませんでした)
結局のところ、ARのシーンとしてはどういうものが検出できるのか
我々の要件としては、水平面に何かを置きたいわけじゃなくて、対象オブジェクトを囲むように3Dノードを表示したいわけです。
ところがARKitは検出した床やテーブル等の水平面に何かを置く実装しか見当たらないので、「こういうのってARKitでできるの?」ということを聞いてみました。
で、回答としては、今のところ「水平方向」(horizontal)の「平面」(plane)しか検出しないそうです。
`ARPlaneAnchor.Alignment` というenumがありますが、実はまだ `horizontal` という要素ひとつしかなくて、`vertical` というのはまだありません。つまり壁のような「垂直方向の平面」を検出したり、我々のアプリのように人間や銅像や動物といった任意のオブジェクトを検出したり、そういうことは現状ではサポートしてないようです。
なので、ポケモンGoのようにキャラクターの3Dモデルを表示するタイプのARにはいいですが、我々のアプリのような用途や、実世界のものに合わせて何か情報を表示したり、みたいなタイプのARにも現状では向いてなさそうです。
どういう水平方向の平面が認識されるかについても教えてくれたのですが、ある程度の大きさが必要で、たとえばイスの座面は十分な広さがあるので水平面として検出されるが、背もたれの上(伝わりますかね?)みたいな狭いものは水平面としては検出されないと。
ただもう一つ提案として言ってくれたのは、検出したキーポイントはAPIから取れるので、それらを使って自分で垂直方向の面なり何なりを再構成することならできる、と言ってました。これはありかもしれません。
深度情報は使用しているのか?
たとえばiPhone 7 PlusのようにDepth(デプス/深度)を取れるようなデバイスの場合、それを使ってより精度良く検出するような処理を内部でやってたりするのか?ということを聞きました。
→ 回答:使ってない
普通のカメラだけで精度良く動くようなアルゴリズムになっていて、デバイスによる処理の差異はないそうです。
おわりに
結論としては、我々の用途には今のところは合ってなさそうです。が、今後のアプリ開発の可能性を広げてくれる非常におもしろいフレームワークであることには代わりはないので、プライベートでは引き続き触っていこうと思っています。