How to Duplicate Geometry from .DAE Files in SceneKit (Swift)

January 11, 2015

The important part of this code is that every duplicated object has it’s own color. Different from the color of the source object.

// Import .dae source
let scene = SCNScene(named: "art.scnassets/chess.dae")!

// Find layer with "queen" name of the figure
let queenNode = scene.rootNode.childNodeWithName("queen", recursively: true)
queenNode?.scale = SCNVector3Make(100, 100, 100)

// Set up scene view
let sceneView = SCNView()
sceneView.frame = self.view.frame
sceneView.scene = scene
sceneView.autoenablesDefaultLighting = true
sceneView.allowsCameraControl = true
sceneView.backgroundColor = UIColor(red: 237/255, green: 229/255, blue: 211/255, alpha: 1)
self.view = sceneView

// Set up camera
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
scene.rootNode.addChildNode(cameraNode)
cameraNode.position = SCNVector3(x: -30, y: 0, z: 100)
cameraNode.camera?.automaticallyAdjustsZRange = true

// Create simple for loop
for i in 1...5 {
    let box2 = queenNode?.clone() as! SCNNode
    let box2Geometry = box2.geometry?.copy() as! SCNGeometry
    let box2GeometryNode = SCNNode(geometry: box2Geometry)
    box2GeometryNode.scale = SCNVector3Make(100, 100, 100)
    box2GeometryNode.position = SCNVector3(x: -20 * Float(i), y: 0, z: 0)
    
    let newMaterial2 = SCNMaterial()
    newMaterial2.diffuse.contents = UIColor.yellow
    box2GeometryNode.geometry?.firstMaterial = newMaterial2
    
    if i == 2 {
        newMaterial2.diffuse.contents = UIColor.red
    } else if i < 2 {
        newMaterial2.diffuse.contents = UIColor.purple
        box2GeometryNode.rotation = SCNVector4Make(0, 1, 0, 1.5)
    } else if i > 3 {
        newMaterial2.diffuse.contents = UIColor.brown
    } else if i == 4 {
        newMaterial2.diffuse.contents = UIColor.blue
    }
    
    scene.rootNode.addChildNode(box2GeometryNode)
}

Result