如何将两个或多个SCNGeometry / SCNNode组合成一个

时间:2016-03-23 08:22:14

标签: swift scenekit

好像我想通过组合一些SCNBox和SCNPyramid等来创建一些自定义形状,我可以通过设置正确的位置和几何形状将它们组合在一起。我怎么也找不到将它们组合成一个可以在物理世界中修改或反应的单元的方法。 下面的代码,我想创建一个简单的房屋形状SCNNode,我希望节点在受到任何碰撞和重力影响时相互连接。 任何人都可以提供一些提示吗?

let boxGeo = SCNBox(width: 5, height: 5, length: 5, chamferRadius: 0)
    boxGeo.firstMaterial?.diffuse.contents = UIColor.blueColor()

    let box = SCNNode(geometry: boxGeo)
    box.position = SCNVector3Make(0, -2.5, 0)
    scene.rootNode.addChildNode(box)

    let pyramidGeo  = SCNPyramid(width: 7, height: 7, length: 7)
    pyramidGeo.firstMaterial?.diffuse.contents = UIColor.greenColor()

    let pyramid = SCNNode(geometry: pyramidGeo)
    pyramid.position = SCNVector3Make(0, 0, 0)
    scene.rootNode.addChildNode(pyramid)

enter image description here

2 个答案:

答案 0 :(得分:2)

创建一个容器节点,只是一个没有任何几何体的空节点。我们称之为" houseNode"因为那就是你正在建造的东西。

let houseNode = SCNNode()

现在让你的另外两个节点成为孩子们。

houseNode.addChildNode(pyramid)
houseNode.addChildNode(box)

现在,只要您想对两个组合节点进行操作,就可以使用容器节点。

编辑:您可以通过枚举实现对容器中对象几何的更改:

houseNode.enumerateChildNodesUsingBlock({
       node, stop in
       // change the color of all the children
       node.geometry?.firstMaterial?.diffuse.contents = UIColor.purpleColor()
       // I'm not sure on this next one, I've yet to use "physics".
       houseNode.physicsBody?.affectedByGravity = true
    })

答案 1 :(得分:1)

谢谢bpedit!

使用childNodes方法和以下代码将其设置为physicsShape,我找到了解决方案。

        houseNode.physicsBody = SCNPhysicsBody(type: .Dynamic,
                                      shape: SCNPhysicsShape(node: houseNode,
                                        options: [SCNPhysicsShapeKeepAsCompoundKey: true]))