ARKit 2.0では、「画像トラッキング」という新機能が加わりました。既知の2次元画像を検出・トラッキングできるので、ポスター等の現実世界に存在する2D画像を基盤にしてAR体験を開始することができるようになる、というものです。これを聞いて「あれ、その機能、既になかったっけ」と思った方もいたのではないでしょうか。
その既視感はある意味では正しく、ARKit 1.5で既に「画像検出」という機能が追加されています。
では、これらはどう違うのでしょうか?ARKit 1.5の画像検出機能を強化したものが2.0の画像トラッキングで、リプレースされたのでしょうか。それとも別々の機能として共存しているのでしょうか。
結論としては後者で、それぞれ強みを持つ別々の機能として共存しています。
コンフィギュレーションの違い
まず実装面でみると、ARKit 1.5で搭載された画像検出は、検出対象とするリファレンス画像をARKit 1.0から存在するコンフィギュレーションであるARWorldTrackingConfiguration
(平面検出を行うのもこれ)の検出対象の一種として指定することで実装します。
let configuration = ARWorldTrackingConfiguration()
configuration.detectionImages = [referenceImage]
一方ARKit 2.0で追加された画像トラッキングは、新たなコンフィギュレーションARImageTrackingConfiguration
を使用します。
let configuration = ARImageTrackingConfiguration()
configuration.trackingImages = [referenceImage]
どちらの実装もリファレンス画像のセットをコンフィギュレーションのプロパティに渡すところは共通で、コンフィギュレーションだけが違っています。
実は、ここに両者の違いが大きく表れています。
ARWorldTrackingConfiguration
は、現実世界を検出・トラッキングするコンフィギュレーションです。現実世界の面(Surface)を検出し、そこにある画像やオブジェクトも検出します。
一方でARImageTrackingConfiguration
は、既知の2D画像だけをトラッキングします。その周囲の面は検出しません。
パフォーマンスの違い
上のコンフィギュレーションの違いにより、パフォーマンスに大きな差が出てきます。ARWorldTrackingConfiguration
はカメラに映る世界の面を全て見ているのでパフォーマンスコストが高く、対象画像は静止している必要があります。
一方でARImageTrackingConfiguration
は対象画像しか見ないので60fpsでその画像の位置と向きを推定します。そして対象画像が移動しても追従します。
また、同じ理由から、一度に復数の対象画像を検出する場合も、ARImageTrackingConfiguration
の方がよりより多くの画像をより確実に処理できます。
実際に同じデバイスで両コンフィギュレーションによる画像検出/トラッキングを試してみると(NDA期間中につきスクリーンキャプチャ動画は載せられませんが)、次のような結果になりました。
-
ARWorldTrackingConfiguration
-
trackingState
がnormal
になるまでが遅い - 検出した画像の位置・向きの更新が遅い
-
-
ARImageTrackingConfiguration
- 一瞬で
trackingState
がnormal
になる - 検出した画像の位置・向きを毎フレーム正確に追従する
- 一瞬で
それぞれのユースケース
画像への追従性、パフォーマンス面だけで見ると画像トラッキングの方が圧倒的に利点がありそうですが、こちらはワールド自体は見ていないので、たとえばその対象画像がカメラの視野から外れた場合に、その画像に仮想コンテンツを固定し続けることができません。一方で(ARWorldTrackingConfiguration
)の画像検出では、対象画像が見えなくなった後でもワールド空間におけるそのコンテンツの位置を追跡し続けることができます。
画像検出は、美術館の絵画や映画のポスターのような静的画像にARコンテンツを連携させるようなケースに適しているとされ、また画像トラッキングは、卓上でのカードゲームやボードゲームのように移動する物体上の画像に対してARコンテンツを連携させるようなケースに適しているとされています。1