ARKitのまとめ(実装2)

概要

WWDC2017で発表されたARKitの実装についてのまとめ2

ARKitではARSession実行後の状況をARSessionDelegateの通知で取得できる

トラッキング状態

ARSession実行時のデバイスのトラッキング状態は、

func session(ARSession, cameraDidChangeTrackingState: ARCamera)

で通知される。 このARCameraの中のtrackingStateでトラッキング状態を取得できる

ステータスの種類は以下のとおり

セッション開始時はNot Availableである。 まだ、トラッキングできるだけのデータが入ってきていない状態で、デバイス位置は初期状態となっている

しばらく経過して、必要なデータが取得できて、デバイスの位置や姿勢をトラッキングできる様になると、Normalへと変わる。Normalの間はデバイス位置の利用が可能である

何らかの原因でトラッキングがうまくできなくない状態になると、Limitedになる。Limitedの場合は、enumAssociated Valueで理由が渡されてくる

AR情報の取得

※以下はSceneKitSpriteKitを使わない場合の前提である

ARFrame

ARSessionを実行すると、ARKitが検出したデバイスや空間の状況は、ARFrameのオブジェクトとして取得できる。 つまり、ARFrameARKitが現在認識している状況そのものといえる

このARFrameの取得は、

の2通りがある

ARFrameには以下の情報が含まれる

ARCamera

ARCameraは空間上に配置された仮想のカメラで、デバイスの位置や向きと一致している(デバイスのカメラを表しているとみなせば良い)

ARFrameには1つだけ含まれる

主な中身はトランスフォーム(変換行列)である。これは、セッション開始時のデバイスの位置を原点とし、どれだけ移動や回転したかの行列となっている

他には、トラッキングの状態やレンダリング時に使用出来る各種行列(ビュー行列やプロジェクション行列)も提供されている

ARAnker

AR空間上にあるオブジェクトの位置や向きを表している。 その実体はトランスフォーム(変換行列)である

このオブジェクトは、検出された水平面の様にARKitによって自動で追加されるほか、任意に追加や削除することができる。 例えば、画面上に仮想の物体を配置した場合は、対応するARAnkerをセッションに追加することができる。 つまり、現実空間に実在するオブジェクトを表す場合もあれば、存在しない仮想のオブジェクトを表す場合もある

ARFrameはその空間に含まれる全てのARAnkerを配列として保持している。 このアンカーが追加や削除、更新された場合は、ARSessionDelegateで通知を受信できる

ARPlaneAnchor

ARPlaneAnchorARAnkerのサブクラスで、ARKitが検出した平面を表す

平面なのでセンター位置と面の範囲を持っている。 ARKitは常に空間の状況を検出、更新するので、これらは動的に変化する場合がある。 更新された場合は、デリゲートで通知される

例えば、デバイスを動かすことにより床の範囲がさらに検出されて広くなった場合は、センター位置と範囲が更新される。 また、最初は2つの別々の面として認識されていたものが、実際には一つの大きな面だと認識された場合には、それらの面はマージされて後から検出された面の方が削除される

ARPointCloud

ARPointCloudARKitが検出した特徴点一式を表す

通常はこれを直接使うことはないが、空間のオブジェクトの輪郭とある程度一致する

ARLightEstimate

ARLightEstimateは現在の空間の環境光(照明)の強度を表す

この値を利用してレンダリング時のライトを調整することで、よりリアルな描画ができる

確認環境