ARKitの 「点」に対するヒットテストについておさらいする
特徴点に対するヒットテスト
ARKitでのヒットテストといえば、まずARSCNViewのhitTestメソッドがある。
func hitTest(_ point: CGPoint, types: ARHitTestResult.ResultType) -> [ARHitTestResult]
で、この第2引数に渡すARHitTestResult.ResultType型のバリエーションとしてfeaturePointがあり、
static var featurePoint: ARHitTestResult.ResultType
これを指定すれば特徴点とのヒットテストが行われる。
この特徴点とは、ワールドトラッキングセッションにおいてARKitがカメラ画像から抽出した"surface"の一部を成す特徴点のこと。
During a world-tracking AR session, ARKit builds a coarse point cloud representing its rough understanding of the 3D world around the user (see rawFeaturePoints). Individual feature points represent parts of the camera image likely to be part of a real-world surface, but not necessarily a planar surface.
これらの特徴点のうち、ヒットテストのレイから一番近いものを見つけ、その特徴点にもっとも近い「レイ上の点」を返す。(特徴点の座標そのものを返すわけではない)
When you search using this hit-test option, ARKit finds the feature point nearest to the hit-test ray (the extension of the 2D hit-test point into 3D world space), then returns the point on the ray nearest to that feature point.
SCNSceneRendererプロトコルのhitTestメソッド
SCNSceneRendererプロトコルで定義されているhitTestメソッドもある。
func hitTest(_ point: CGPoint, options: [SCNHitTestOption : Any]? = nil) -> [SCNHitTestResult]
このプロトコルに準拠しているクラスとしては以下のようなものがある。
・SCNLayer
・SCNRenderer
・SCNView
・WKInterfaceSCNScene
ちなみにARSCNViewはSCNViewを継承しているので、このプロトコルにも準拠していることになる。
で、このメソッドの第2引数optionsの型であるSCNHitTestOptionには(ノード等ではなく)頂点とのヒットテストを行えるオプション、みたいなものはない。
というわけでこのメソッドは「点」とのヒットテストには使えない。
任意の点へのヒットテスト
では特徴点に限らない、3D空間における任意の点へのヒットテストはどうやるのかというと・・・自分で実装するしかない。
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/