Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift ARKit中三维模型的交换节点_Swift_Parent Child_Arkit_Ios12 - Fatal编程技术网

Swift ARKit中三维模型的交换节点

Swift ARKit中三维模型的交换节点,swift,parent-child,arkit,ios12,Swift,Parent Child,Arkit,Ios12,我有一个汽车模型。此模型包含许多组(门、轮胎、窗、车身)。我想按一下按钮改变轮胎的型号。但是我很难找到正确的节点。 我目前的想法是搜索汽车的所有子节点,当我找到轮胎时,更换它们 我的代码: func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { guard anchor is ARImageAnchor else { return } guard let

我有一个汽车模型。此模型包含许多组(门、轮胎、窗、车身)。我想按一下按钮改变轮胎的型号。但是我很难找到正确的节点。 我目前的想法是搜索汽车的所有子节点,当我找到轮胎时,更换它们

我的代码:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    guard anchor is ARImageAnchor else { return }

    guard let carNode = sceneView.scene.rootNode.childNode(withName: "Car", recursively: false) else { return }
    node.addChildNode(carNode)

@IBAction func tireChangePressed(_ sender: UIButton) {
var exchangeTires = sceneView.scene.rootNode.childNode(withName: "Tires 2")
    self.sceneView.scene.rootNode.enumerateChildNodes { (node, _) in
        if node.name == "Tires"{
// here I try to exchange the node namend "Tires" with the optional node named "Tires 2"
            node = exchangeTires
        }
    }
}

但它不断抛出节点是let常量的错误。我是否应该使用其他方法来迭代所有子节点,或者会出现什么问题?

SCNNode和节点树的工作方式类似于UIView和视图树,因此,与其尝试将现有节点设置为其他节点,不如:

  • 使用获取目标的父节点
  • 使用以下命令删除目标节点:
  • 将新的子节点添加到具有

  • 我打算在几分钟内试试这个!到目前为止,说明是清楚的,但我不理解您指出SCNNode和节点树与UIView和view树的工作方式类似的意思。您能解释一下吗?您在CoreGraphics、UIKit、SceneKit和SpriteKit中使用相同的模式。要删除节点,请告诉它删除自身。要添加在父节点上调用addChild的节点。它们都是苹果的API,有很多共同的设计模式,所以若你们用过一个,和其他人一起工作应该是很熟悉的。谢谢你。但是,父节点如何知道,它应该将新的子节点准确地放置在移除的节点所在的位置?在我的示例中:当我删除旧轮胎时,我希望在之后将新轮胎添加到完全相同的位置。在SCNNode的情况下,子项本质上是无序的,因此只要它是同一父项的子项,它就有效地位于同一位置。对于其他事情,比如UIView或CALayer,它们的顺序很重要,它们有insert:before:和insert:after:methods。@JoshHomann,我尝试过这个方法,但没有用。我没有达到我错的地方。请检查我放置代码的链接,让我知道是否有任何遗漏或错误。