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はアンカーの検出を待たずにヒットテストができるメリットがある反面、精度にかける部分も出てくるので、用途に応じた使い分けをしてください。