我在SCNode碰撞檢測中遇到了一些麻煩。我需要檢測具有SCNNode的場景中的哪個對象被觸摸,我已經實現了這段代碼,但是當我觸摸對象時看起來崩潰,但是當我觸摸sceneView的其餘部分時工作正常。如何檢測哪個SCNNode已被觸摸ARKit
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = touches.first as! UITouch
if(touch.view == self.sceneView){
print("touch working")
let viewTouchLocation:CGPoint = touch.location(in: sceneView)
guard let result = sceneView.hitTest(viewTouchLocation, options: nil).first else {
return
}
if (bottleNode?.contains(result.node))! { //bottleNode is declared as SCNNode? and it's crashing here
print("match")
}
}
}
1。事實上在問題中沒有提到,但是如果你真的想假設在針對該節點執行命中測試之前它可能爲零,那麼在進行命中測試之前實際執行該檢查將是有意義的。 – Xartec
P2。除了無效的contains方法,沒有理由假設bottleNode具有childnodes,但是如果是這種情況,是否有任何增加值使用自定義擴展來遍歷結果節點的父母,而不是簡單地檢查bottlenode childnodes是否包含結果節點? (即瓶子節點上的enumerateHierarchy將避免檢查結果節點的所有父母)。我確信在複製並粘貼代碼後,結果會是由於擴展名爲self == node部分,所以我不認爲這應該是被接受的答案。 – Xartec
@Xartec好點。不知道所討論的節點層次結構,我選擇了一種通常在算法上高效的解決方案。向上移動父層次由節點樹的高度限制,但是搜索目標節點的子子樹受該子樹的整個寬度限制。對於任意大樹中的任何點,最壞情況下的子樹大小可能遠大於回到根的高度。但是值得考慮一下你期望在你的應用中使用的節點層次結構 - 如果它非常平坦,那麼對測試節點進行簡單的指針相等測試就足夠了。 – rickster