如何将多个节点连接到iOS场景中的一个节点

时间:2017-10-10 14:24:15

标签: ios scenekit

正如我们在下面的图片中可以看到场景图中的所有多个节点。要求是我想在一个节点中添加这些节点,如image2所示。所以在场景图中,我将有一个节点(主席),它将包含多个节点

enter image description here

                      Image1

enter image description here

                    Image2

3 个答案:

答案 0 :(得分:4)

您创建父节点,然后将所有节点添加为子节点。

即:

var nodes: [SCNNode] = getMyNodes()

var parentNode = SCNNode()
parentNode.name = "chair"

for node in nodes {
    parentNode.addChildNodes(node)
}

将更新应用于节点时,更新也会下推到子节点,例如:

parentNode.transform = SCNMatrix4MakeTranslation(0, 0.5, 1.2)

会对附加到parentNode的所有子项应用相同的翻译转换。

您可以使用以下方式访问特定的孩子:

parentNode.childNode(withName: nameOfChildNode, recursively: true)

并使用以下内容获取所有孩子的父母:

myChildNode.parent

编辑:

如果要从场景文件导入,仍然可以通过编程方式轻松访问节点:

let scene = SCNScene(named: "myScene.scn")

func getMyNodes() -> [SCNNode] {
    var nodes: [SCNNode] = [SCNNode]()
    for node in scene.rootNode.childNodes {
        nodes.append(node)
    }
    return nodes
}

顺便提一句,这意味着您可以忽略上述大部分内容,并使用myScene.rootNode作为parent节点。

答案 1 :(得分:1)

我的建议是:

  • 静态:创建一个新的.scn文件,您可以在其中拖动&删除您尝试分组的每个节点
  • 动态:创建新的SCNNode。对于您尝试分组的每个节点,请使用.addChildNode方法

我使用第二个使用ARKit构建动态场景。工作就像一个魅力。

基本上,我将.dae文件的所有子节点添加到SCNNode:

var node = SCNNode()
let scene = SCNScene(named: "myScene.dae")
var nodeArray = scene.rootNode.childNodes

for childNode in nodeArray {
  node.addChildNode(childNode as SCNNode)
}

您应该使用相同的.addChildNode方法尝试使用您的文件:)

答案 2 :(得分:0)

以防万一,如果有人正在寻找这种黄黑色的棍子

class VirtualObject: SCNNode {

    enum Style {
        case anchor
        case fence
    }

    let style: Style
    var value: String?

    init(_ style: Style) {
        self.style = style
        super.init()

        switch style {
        case .anchor:
            let material = SCNMaterial()
            material.diffuse.contents = UIColor.magenta
            material.lightingModel = .physicallyBased

            let object = SCNCone(topRadius: 0.02, bottomRadius: 0, height: 0.1)  // SCNSphere(radius: 0.02)
            object.materials = [material]

            self.geometry = object

        case .fence:
            for index in 0 ... 6 {
                let material = SCNMaterial()
                material.diffuse.contents = index % 2 == 0 ? UIColor.yellow : UIColor.black
                material.lightingModel = .physicallyBased

                let node = SCNNode(geometry: SCNCylinder(radius: 0.01, height: 0.05))
                node.geometry?.materials = [material]
                node.transform = SCNMatrix4MakeTranslation(0, 0.05 * Float(index), 0)
                addChildNode(node)
            }
        }
    }

Yellow-black stivk in AR