【问题标题】:Exchange nodes of 3D Model in ARKitARKit中3D模型的交换节点
【发布时间】:2018-11-29 03:04:07
【问题描述】:

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

我的代码:

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
        }
    }
}

但它不断抛出 node 是一个 let 常量的错误。我应该使用其他方法遍历所有子节点还是有什么问题?

【问题讨论】:

    标签: swift parent-child arkit ios12


    【解决方案1】:

    SCNNode 和节点树的工作方式类似于 UIView 和视图树,因此您应该尝试将现有节点设置为其他值,而不是:

    1. parent获取目标的父节点
    2. removeFromParentNode()删除目标节点
    3. addChildNode(_:)将新的子节点添加到父节点

    【讨论】:

    • 过几次就试试这个!到目前为止说明很清楚,但我不明白您指出 SCNNode 和节点树的工作方式类似于 UIView 和视图树的意思。你能解释一下吗?
    • 您在 CoreGraphics、UIKit、SceneKit 和 SpriteKit 中使用相同的模式。要删除一个节点,你告诉它删除自己。添加一个在父节点上调用 addChild 的节点。它们都是 Apple API 并共享许多共同的设计模式,因此如果您使用过其中的一种,那么与其他人一起使用应该很熟悉。
    • 哦,好的,知道了。感谢到目前为止。但是父节点怎么知道它应该把新的子节点准确地放在被删除节点的位置上呢?在我的示例中:当我删除旧轮胎时,我想在之后将新轮胎添加到完全相同的位置。
    • 在 SCNNode 的情况下,子节点本质上是无序的,因此只要它是同一个父节点的子节点,它就有效地位于同一个位置。对于其他事情,比如 UIView 或 CALayer,他们有 insert:before: 和 insert:after: 方法。
    • @JoshHomann,我试过了,但它不起作用。我没有得到我错的地方。请检查我放置代码的链接,让我知道是否有任何遗漏或错误。 stackoverflow.com/questions/57291659/…
    猜你喜欢
    • 2019-03-06
    • 2018-01-31
    • 2018-03-15
    • 2018-05-30
    • 2018-11-17
    • 2014-04-22
    • 2021-01-13
    • 2018-07-13
    • 1970-01-01
    相关资源
    最近更新 更多