我使用以下代码,它将检查接触点,如果接触点为空,则会添加对象或删除对象。
@objc func didTap(withGestureRecognizer recognizer: UIGestureRecognizer) {
let tapLocation = recognizer.location(in: sceneView)
let hitTestResults = sceneView.hitTest(tapLocation)
guard let node = hitTestResults.first?.node else {
let hitTestResultsWithFeaturePoints = sceneView.hitTest(tapLocation, types: .featurePoint)
if let hitTestResultWithFeaturePoints = hitTestResultsWithFeaturePoints.first {
let translation = hitTestResultWithFeaturePoints.worldTransform.translation
guard let carScene = SCNScene(named: "car.dae") else { return }
let carNode = SCNNode()
let carSceneChildNodes = carScene.rootNode.childNodes
for childNode in carSceneChildNodes {
carNode.addChildNode(childNode)
}
carNode.position = SCNVector3(translation.x, translation.y, translation.z)
carNode.scale = SCNVector3(0.5, 0.5, 0.5)
sceneView.scene.rootNode.addChildNode(carNode)
}
return
}
node.removeFromParentNode()
}
但是我的对象是由DAE文件创建的,它包含许多childNodes。
如果我使用node.removeFromParentNode()
,它将仅删除一个节点
如果我使用以下代码,它将删除屏幕上的所有对象。
sceneView.scene.rootNode.enumerateChildNodes { (existingNode, _) in
existingNode.removeFromParentNode()
}
如何从Scenekit场景中删除特定节点?
答案 0 :(得分:0)
您应该命名节点,然后可以使用该名称将其过滤掉。
sceneView.scene.rootNode.childNodes.filter({ $0.name == "yourName" }).forEach({ $0.removeFromParentNode() })
答案 1 :(得分:0)
您可以使用:
func childNode(withName name: String,
recursively: Bool) -> SCNNode?
前往文档https://developer.apple.com/documentation/scenekit/scnnode/1407951-childnode