見出し画像

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空間における任意の点へのヒットテストはどうやるのかというと・・・自分で実装するしかない。

ここから先は

1,992字
文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/