![見出し画像](https://assets.st-note.com/production/uploads/images/33216260/rectangle_large_type_2_ea0118e3853d0b2fd316dea586989167.jpeg?width=1200)
SceneKitでnodeを選択する
今晩もぽっ活して行きます。
このスタックオーバーフローを訳して行きたいと思います。
URL: https://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:)を使用するように推奨されているみたいですね。
めちゃめちゃ業務で使ってる~~~~~~~~~~~~~~~~~泣
気づけただけでもよかったです !!
< ひとこと >
エンジニアになりたいと思っている人や、新人の方にこの記事が届けばいいです。
最後まで読んでくださり、ありがとうございました。