iOS
Swift
ARKit

[ARKit] HitTestで使うタイプをうまく使い分ける

ARアプリを作成する際に必要となってくるHitTestですが、ヒットテストで使うタイプの特徴を知っておくだけで開発が楽になります。

hitTest(_:types:)

ARSCNViewにはヒットテストと呼ばれるものがあり、このヒットテストを用いて現実世界の座標を取得する

func hitTest(_ point: CGPoint, 
       types: ARHitTestResult.ResultType) -> [ARHitTestResult]

ARHitTestResult

どのように検出するかを設定する
- featurePoint
- estimatedHorizontalPlane
- existingPlane
- existingPlaneUsingExtent

featurePoint

一番特徴点が近い点の結果を返す

一番自由に結果を取得できるタイプ。
垂直面もいけるが、特徴点次第なので空中の座標が取れたり、思った箇所にオブジェクトが置けない印象がある
例)平面に限らずタップした位置がどこかしらの位置にオブジェクトを配置したい時

estimatedHorizontalPlane

現在のフレームに対して水平面だと推定される位置の結果を返す

existingPlane

存在する平面のアンカーの位置の結果を返す

机の上を最初に認識してそのあとに床を測定しようとすると机の上の高さの延長線上の座標が取得されてしまうので注意
例)認識した平面の延長線上にもオブジェクトを配置したい

existingPlaneUsingExtent

平面アンカーのフレームを考慮した位置を返す

例)認識したアンカーの平面の枠内の内でオブジェクトを配置したい

[ARHitTestResult]

取得した結果は、カメラからの距離が近い順にソートされた配列となっている
y座標が一番小さいものを採用したりすることもできる

感想

個人的にはしっかり水平面に何かしらのオブジェクトを配置したいのであれば、
existingPlaneかexistingPlaneUsingExtentを用いて検出済みのアンカーに対してヒットテストを行うことをオススメしたい。
featurePointやestimatedHorizontalPlaneはアンカーの検出を待たずにヒットテストができるメリットがある反面、精度にかける部分も出てくるので、用途に応じた使い分けをしてください。