Search code examples
swiftaugmented-realityscenekitarkitvirtual-reality

Arrange SCNNodes in Circle


I'm creating multiple nodes automatically and I want to arrange them around me, because at the moment I'm just increasing of 0.1 the current X location.

capsuleNode.geometry?.firstMaterial?.diffuse.contents = imageView
capsuleNode.position = SCNVector3(self.counterX, self.counterY, self.counterZ)
capsuleNode.name = topic.name
self.sceneLocationView.scene.rootNode.addChildNode(capsuleNode)
self.counterX += 0.1

So the question is, how can I have all of them around me instead of just in one line?

Did someone of you have some math function for this? Thank you!


Solution

  • Use this code (macOS version) to test it:

    import SceneKit
    
    class GameViewController: NSViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            let scene = SCNScene()
            let scnView = self.view as! SCNView
            scnView.scene = scene
            scnView.allowsCameraControl = true
            scnView.backgroundColor = NSColor.black
    
            for i in 1...12 {  // HERE ARE 12 SPHERES
    
                let sphereNode = SCNNode(geometry: SCNSphere(radius: 1))
                sphereNode.position = SCNVector3(0, 0, 0)
    
                // ROTATE ABOUT THIS OFFSET PIVOT POINT
                sphereNode.simdPivot.columns.3.x = 5
                sphereNode.geometry?.firstMaterial?.diffuse.contents = NSColor(calibratedHue: CGFloat(i)/12, 
                                                                                  saturation: 1, 
                                                                                  brightness: 1,                
                                                                                       alpha: 1)
    
                // ROTATE ABOUT Y AXIS (STEP is 30 DEGREES EXPRESSED IN RADIANS)
                sphereNode.rotation = SCNVector4(0, 1, 0, (-CGFloat.pi * CGFloat(i))/6)
                scene.rootNode.addChildNode(sphereNode)
            }
        }
    }
    

    enter image description here

    enter image description here

    P.S. Here's a code for creating 90 spheres:

    for i in 1...90 {
    
        let sphereNode = SCNNode(geometry: SCNSphere(radius: 0.1))
        sphereNode.position = SCNVector3(0, 0, 0)
        sphereNode.simdPivot.columns.3.x = 5
        sphereNode.geometry?.firstMaterial?.diffuse.contents = NSColor(calibratedHue: CGFloat(i)/90, saturation: 1, brightness: 1, alpha: 1)
        sphereNode.rotation = SCNVector4(0, 1, 0, (-CGFloat.pi * (CGFloat(i))/6)/7.5)
        scene.rootNode.addChildNode(sphereNode)
    }
    

    enter image description here