Home > other >  How to show WorldOrigin axis in SceneKit scene for macOS?
How to show WorldOrigin axis in SceneKit scene for macOS?

Time:01-16

I am building a macOS SwiftUI app. I want to show the world axis such that the user is aware of the orientation of objects. I've looked at the enter image description here

SwiftUI mac version

import SwiftUI
import SceneKit

struct ContentView : View {
    
    @State private var scene = SCNScene()
    @State private var axis = SCNNode()
    var options: SceneView.Options = [.allowsCameraControl]
    
    var body: some View {
        ZStack {
            SceneView(scene: scene, options: options).ignoresSafeArea()
            let _ = scene.background.contents = NSColor.black
            let _ = createWorldAxis()
            let _ = axis.opacity = 0.1          // you can hide world axis
        }
    }
    
    func createWorldAxis() {
            
        let colors: [NSColor] = [.systemRed, .systemGreen, .systemBlue]

        for index in 0...2 {
            
            let box = SCNBox(width: 0.200, height: 0.005,
                            length: 0.005, chamferRadius: 0.001)
            
            let material = SCNMaterial()
            material.lightingModel = .constant
            material.diffuse.contents = colors[index]
            box.materials[0] = material
            
            let node = SCNNode(geometry: box)
            
            switch index {
                case 0:
                    node.position.x  = 0.1
                case 1:
                    node.eulerAngles = SCNVector3(0, 0, Float.pi/2)
                    node.position.y  = 0.1
                case 2:
                    node.eulerAngles = SCNVector3(0, -Float.pi/2, 0)
                    node.position.z  = 0.1
                default: break
            }    
            axis.addChildNode(node)
            axis.scale = SCNVector3(1.5, 1.5, 1.5)
            scene.rootNode.addChildNode(axis)                
        }
        print(axis.position)
    }
}

Cocoa version

import Cocoa
import SceneKit

class ViewController : NSViewController {
    
    var axis = SCNNode()
    var sceneView = SCNView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        sceneView = self.view as! SCNView
        sceneView.scene = SCNScene()
        sceneView.allowsCameraControl = true
        sceneView.backgroundColor = .black
      
        self.createWorldAxis()
        axis.opacity = 0.1                     // you can hide world axis
    }
    
    func createWorldAxis() {
        
        let colors: [NSColor] = [.systemRed, .systemGreen, .systemBlue]

        for index in 0...2 {
            
            let box = SCNBox(width: 0.200, height: 0.005, 
                            length: 0.005, chamferRadius: 0.001)
            
            let material = SCNMaterial()
            material.lightingModel = .constant
            material.diffuse.contents = colors[index]
            box.materials[0] = material
            
            let node = SCNNode(geometry: box)

            if index == 0 {
                node.position.x  = 0.1    
            } else if index == 1 {
                node.eulerAngles = SCNVector3(0, 0, Float.pi/2)
                node.position.y  = 0.1    
            } else if index == 2 {
                node.eulerAngles = SCNVector3(0, -Float.pi/2, 0)
                node.position.z  = 0.1
            }
            axis.addChildNode(node)
            axis.scale = SCNVector3(1.5, 1.5, 1.5)
            sceneView.scene?.rootNode.addChildNode(axis)                
        }
        print(axis.position)
    }
}

CodePudding user response:

I found what i wanted using the UI. First, ensure you enable controls for your scene:

myscene.showsStatistics = true

Then, click the configuration button on the bottom of your screen.

enter image description here

In the options dropdown select World Origin.

enter image description here

I am puzzled why all debug options can be invoked programmatically except the World Origin. None the less, that allows you to see axis.

  • Related