見出し画像

SceneKitでnodeを選択する

今晩もぽっ活して行きます。
このスタックオーバーフローを訳して行きたいと思います。

URLhttps://stackoverflow.com/questions/28006040/tap-select-node-in-scenekit-swift

< 質問の答え >

sceneViewのhitTestメソッドで可能であり(例えば、タップしたところの位置など)、hitTstのリストとして結果が取得できるでしょう。
それぞれの結果からnodeが取得できます。(その他の情報も)

let location: CGPoint = // 例えば、tap gesture recognizer(タップの位置情報)から

let hits = self.sceneView.hitTest(location, types: nil)

if let tappedNode = hits?.first?.node {
   // タップしたnodeで何かをする
}

~~~~~~~~~ここまで~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

< 補足 >

scenekit の hittestメソッドはsceneViewに対し当たり判定を簡単に行えるメソッドです。
hittestの第一引数には、2D座標(今回の場合はtap座標)を割当て、第2引数には "ヒットテスト結果のタイプ"を入力します。(今回はnil)
タイプに関しては以下の通りです。

・featurePoint (特徴点)
平面に限らず最も近い検出した特徴点の位置を返す
・estimatedHorizontalPlane (推定の水平面)
推定した水平面の位置を返す。検出時間は短いメリットはあるが、あくまで推定なので精度が高くない。
・estimatedVerticalPlane (推定の垂直の平面)
推定した垂直面の位置を返す。検出時間は短いメリットはあるが、あくまで推定なので精度が高くない。
・existingPlane (検出した平面 + 平面サイズを考慮しない)
検出した平面の位置を返す。平面サイズを考慮しない為、検出した平面の延長線上であれば、現実世界で平面でなくとも対象となる。
・existingPlaneUsingExtent (検出した平面 + 平面サイズを考慮する)
検出した平面の位置を返す。平面サイズを考慮するので、現実世界の平面のみ対象にできる。
・existingPlaneUsingGeometry (検出したジオメトリ + 平面サイズとカタチを考慮する)
検出したジオメトリを対象とする

ただ自分も調べて気づいたのですが,
hitTest(_:types:)は, deprecated(非推奨)となっており
hitTest(_:options:)を使用するように推奨されているみたいですね。

めちゃめちゃ業務で使ってる~~~~~~~~~~~~~~~~~泣
気づけただけでもよかったです !!

< ひとこと >

エンジニアになりたいと思っている人や、新人の方にこの記事が届けばいいです。

最後まで読んでくださり、ありがとうございました。


この記事が気に入ったらサポートをしてみませんか?