将 SCNNode 放置在平面上并检测节点是否被点击
Placing a SCNNode on a plane and detecting that the node is tapped
我正在开发一个应用程序,它首先检测到有一个垂直平面,然后,如果用户触摸该平面,我将一个 SCNNode 添加到 rootNode。在那之后,我想检测用户是否触摸节点来做更多的事情,但我无法检测到那个点击,它只检测平面点击。现在我又回到了这个方法:
@objc func tapped(sender: UITapGestureRecognizer) {
let sceneView = sender.view as! ARSCNView
let tapLocation = sender.location(in: sceneView)
let hitTest = sceneView.hitTest(tapLocation, types: .existingPlaneUsingExtent)
if !hitTest.isEmpty {
addItem(hitTestResult: hitTest.first!)
hideTip()
}
}
哪个是在平面上点击时添加一个节点,但是现在我想检测节点何时被点击,我使用了这个代码:
let sceneView = sender.view as! ARSCNView
let tapLocation = sender.location(in: sceneView)
let hitTouchTest = sceneView.hitTest(tapLocation)
if !hitTouchTest.isEmpty {
let results = hitTouchTest.first!
let node = results.node
}
它进入了if,但是节点的名称总是为nil,当我创建节点将它添加到平面时我给它起了一个名字......我如何检测到节点被点击了?
此解决方案的问题是您获取了被触及的节点数组的第一个值。
我建议阅读下一个主题:
https://developer.apple.com/documentation/scenekit/scnhittestoption
以及您可以实施的解决方案:
func registerGestureRecognizer() {
let tap = UITapGestureRecognizer(target: self, action: #selector(search))
self.sceneView.addGestureRecognizer(tap)
}
@objc func search(sender: UITapGestureRecognizer) {
let sceneView = sender.view as! ARSCNView
let location = sender.location(in: sceneView)
let results = sceneView.hitTest(location, options: [SCNHitTestOption.searchMode : 1])
guard sender.state == .began else { return }
for result in results.filter( { [=10=].node.name != nil }) {
if result.node.name == "Your node name" {
// do manipulations
}
}
}
P.S。此方法可帮助您通过名称获取特定节点。
希望对您有所帮助!
我正在开发一个应用程序,它首先检测到有一个垂直平面,然后,如果用户触摸该平面,我将一个 SCNNode 添加到 rootNode。在那之后,我想检测用户是否触摸节点来做更多的事情,但我无法检测到那个点击,它只检测平面点击。现在我又回到了这个方法:
@objc func tapped(sender: UITapGestureRecognizer) {
let sceneView = sender.view as! ARSCNView
let tapLocation = sender.location(in: sceneView)
let hitTest = sceneView.hitTest(tapLocation, types: .existingPlaneUsingExtent)
if !hitTest.isEmpty {
addItem(hitTestResult: hitTest.first!)
hideTip()
}
}
哪个是在平面上点击时添加一个节点,但是现在我想检测节点何时被点击,我使用了这个代码:
let sceneView = sender.view as! ARSCNView
let tapLocation = sender.location(in: sceneView)
let hitTouchTest = sceneView.hitTest(tapLocation)
if !hitTouchTest.isEmpty {
let results = hitTouchTest.first!
let node = results.node
}
它进入了if,但是节点的名称总是为nil,当我创建节点将它添加到平面时我给它起了一个名字......我如何检测到节点被点击了?
此解决方案的问题是您获取了被触及的节点数组的第一个值。 我建议阅读下一个主题: https://developer.apple.com/documentation/scenekit/scnhittestoption
以及您可以实施的解决方案:
func registerGestureRecognizer() {
let tap = UITapGestureRecognizer(target: self, action: #selector(search))
self.sceneView.addGestureRecognizer(tap)
}
@objc func search(sender: UITapGestureRecognizer) {
let sceneView = sender.view as! ARSCNView
let location = sender.location(in: sceneView)
let results = sceneView.hitTest(location, options: [SCNHitTestOption.searchMode : 1])
guard sender.state == .began else { return }
for result in results.filter( { [=10=].node.name != nil }) {
if result.node.name == "Your node name" {
// do manipulations
}
}
}
P.S。此方法可帮助您通过名称获取特定节点。 希望对您有所帮助!