首页 > 解决方案 > 如何从 SCNNode 父节点中删除或取消子节点?

问题描述

我使用 Apple 的 ARKit 扫描仪来扫描一个项目,这样我就可以在它周围放置物体以获得设置某些东西的说明。我使用渲染器函数将其作为我的节点来锚定对象。我想为用户创建说明,因此当用户单击“下一步”按钮时,会弹出一个使用 .scn 文件的新节点。我将 ARKit Scanned 对象称为 baseNode,并将 .scn 对象添加到“objectNodes”中。

问题是当用户按下上一个或下一个按钮时,我正在向我不想要的 objectNodes 添加另一个孩子。我希望能够从 objectNodes 中删除一个子节点。我的问题是如何从 SCNNode 中删除子节点。

我尝试使用 let temp = objectNodes.childNods, temp.removeAll() 但不允许我将 objectNodes 重新分配给 temp,因为 temp 使用 .childNodes 变成了一个数组。我希望能够使用相同的节点,但只是覆盖它。

@objc func nextStep() {
        switch numberOfStep {
        case 0:
            nextStep.text = "Next Step"
            previousStep.text = ""
            addBattery()
            numberOfStep += 1
        case 1:
            nodeObjects.removeFromParentNode()
            addLANObject()
}

func addBattery () {
        let battery = insertBattery(objectName: "art.scnassets/object/screwdriver.scn")
        let battery2 = insertSecondBattery(objectName: "art.scnassets/object/screwdriver.scn")
        nodeBatteryAnimation(scene: battery)
        nodeBatteryAnimation(scene: battery2)
        objectsNodes.addChildNode(battery2)
        objectsNodes.addChildNode(battery)
        baseNode.addChildNode(nodeObjects)
}

func addLANObject () {
        let etherCord = ethernet1(objectName: "art.scnassets/object/box.scn")
        nodeAnimation(scene: etherCord)
        objectsNodes.addChildNode(etherCord)
        baseNode.addChildNode(nodeObjects)
}

我添加了一些打印语句,我看到我正在向 objectNodes 添加更多子节点。当我使用 objectNodes.removeFromParent() 时,它会将其从 baseNode 中删除,但是当我进入下一步时,我将一个子节点添加到 objectNodes 并将其重新添加到 baseNode。我只想在 objectNodes 上再次有零子节点。

标签: swiftarkit

解决方案


如果要删除所有孩子。

Node.children.map{$0.removeFromParentNode()}

否则,先过滤得到childNode。


推荐阅读