如何从Scenekit场景中删除特定节点?

时间:2018-12-28 10:01:46

标签: swift nodes scenekit

我使用以下代码,它将检查接触点,如果接触点为空,则会添加对象或删除对象。

@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场景中删除特定节点?

2 个答案:

答案 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