SceneKit中的SCNNode父子关系?

5

根据我以前的问题,我认为克隆SCNNode是解决加载多个对象问题的方法。然而,我意识到有些问题。

我做了类似于下面的事情:

arrow = scnScene.rootNode.childNode(withName: "arrow", recursively:true)
arrow.rotation = SCNVector4(0, 0, 1, M_PI_2)
arrow.position = SCNVector3(x: 0, y: 0, z: -3);
let sign = SCNNode()
for i in 0..<10{
    let node = arrow.clone()
    node.position = SCNVector3(i+1,0,0)
    sign.addChildNode(node)
}
arrow.addChildNode(sign)

我期望会有一排箭头显示,但实际上出现的是一列箭头(在x轴上翻译,但实际上影响了y轴,似乎克隆节点的坐标系已经改变),所有子对象都旋转了180度。为什么?

Karl Sigiscar 在之前告诉我要使用 SCNReferenceNode,但我不确定该如何使用它,以及它是否能实现我的目标。

更新:

我尝试过这样使用 SCNReferenceNode:

    let scnScene = SCNScene()

    if let filePath = Bundle.main.path(forResource: "arrowsign", ofType: "dae", inDirectory: "art.scnassets") {
        // ReferenceNode path -> ReferenceNode URL
        let referenceURL = NSURL(fileURLWithPath: filePath)


        if #available(iOS 9.0, *) {
            arrow = SCNReferenceNode(url: referenceURL as URL!)!
            arrow.load()
            arrow.rotation = SCNVector4(0, 0, 1, -M_PI_2)
            arrow.position = SCNVector3(0,0,-5)

            // Create reference node
            for i in 0..<10{
                let referenceNode : SCNReferenceNode = SCNReferenceNode(url: referenceURL as URL)!
                referenceNode.load()
                referenceNode.position = SCNVector3(i+1, 0, 0);
                arrow.addChildNode(referenceNode)
            }
        }
    }
    scnScene.rootNode.addChildNode(arrow)

我没有旋转子节点,但当我运行时,它们自动旋转了(-M_PI_2度)。而且我在x轴上进行了平移,但实际上显示了一列箭头,而不是一行箭头。这是否是子父节点的一个特性?

1个回答

3
使用SCNReferenceNode后,我发现如果将一个节点作为子节点添加到另一个节点中,则子节点的位置将设置为父节点的位置。例如,如果有一个位于位置(3,4,5)的父节点,那么它的所有子节点在最初将位于(3,4,5)(稍后可以进行修改)。因此,如果您想要一排箭头,只需修改子节点的x值,并使y和z值等于零即可。 如果父节点应用了旋转,则旋转也将应用于子节点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接