0
votes

I am creating a simple project using SceneKit and cannot get any shadows to appear in the Scene Editor or in the compiled application no matter what I try.

I have tried creating a simple box, placing it on a plane and adding a spot light. Code would be as follows:

    // Create some properties
var scnView: SCNView!
var scnMasterScene: SCNScene!
var boxNode: SCNNode!
var cameraPerspNode: SCNNode!
var cameraOrthNode: SCNNode!

func applicationDidFinishLaunching(aNotification: NSNotification) {
    // Insert code here to initialize your application

    setupView()
    createAndAddBoxScene()
    setupCamera()
    createAndAddSpotLight()
}

// Setup the view.
func setupView() {
    scnView = self.sceneView as SCNView

    // Set the scnView properties.
    scnView.showsStatistics = true
    scnView.autoenablesDefaultLighting = false
    scnView.allowsCameraControl = true

    // Create a Master scene.
    scnMasterScene = SCNScene()

    // Set the scene view's scene node to the master scene.
    scnView.scene = scnMasterScene
}

// Setup the scene.
func createAndAddBoxScene() {

    // Create a box of type SCNGeometry
    let boxGeometry: SCNGeometry = SCNBox(width: 2000, height: 2000, length: 2000, chamferRadius: 100)

    // Add a difuse colour to the box' first material.
    boxGeometry.firstMaterial?.diffuse.contents = NSColor.redColor()

    // Create a node of type SCNNode and attach the boxGeometry to it.
    // Note: A node can only have 1 geometry object attached to it.
    boxNode = SCNNode(geometry: boxGeometry)

    // Add the new boxNode to the scene's root node.
    scnMasterScene.rootNode.addChildNode(boxNode)


    // Create a floor plane.
    let floorGeometry: SCNGeometry = SCNPlane(width: 20000, height: 20000)
    // Add a difuse colour to the floor's first material.
    floorGeometry.firstMaterial?.diffuse.contents = NSColor.yellowColor()

    // Create a floorPlaneNode and attach the floor plane to it.
    let floorNode: SCNNode = SCNNode(geometry: floorGeometry)

    // Tilt the floorPlaneNode in x.
    let floorNodeTiltDegreesX: Double = -90
    let floorNodeTiltRadiansX: Double = floorNodeTiltDegreesX * (π/180)
    floorNode.rotation = SCNVector4Make(1, 0, 0, CGFloat(floorNodeTiltRadiansX))

    // Add the floorPlaneNode to the master scene.
    scnMasterScene.rootNode.addChildNode(floorNode)
}

// Create a camera, position it and add it to the scene.
func setupCamera() {

    // Create a camera node which will be used to contain the camera.
    cameraPerspNode = SCNNode()

    // Create a new camera.
    let cameraPersp: SCNCamera = SCNCamera()

    // Set camera properties.
    cameraPersp.name = "myPerspCamera"
    cameraPersp.usesOrthographicProjection = false
    cameraPersp.orthographicScale = 9
    cameraPersp.xFov = 30
    cameraPersp.zNear = 1
    cameraPersp.zFar = 20000

    // Assign the camera to the .camera property of the node.
    cameraPerspNode.camera = cameraPersp

    // Set the position and rotation of the camera node (NOT the camera).
    cameraPerspNode.position = SCNVector3(x: 0, y: 4000, z: 6000)
    let cameraPerspTiltDegrees: Double = -30
    let cameraPerspTiltRadians: Double = cameraPerspTiltDegrees * (π/180)
    cameraPerspNode.rotation = SCNVector4Make(1, 0, 0, CGFloat(cameraPerspTiltRadians))

    // Add the new cameraNode to the scene's root.
    scnMasterScene.rootNode.addChildNode(cameraPerspNode)
}

func createAndAddSpotLight() -> Void {

    let spot = SCNLight()
    spot.type = SCNLightTypeSpot
    spot.castsShadow = true
    spot.color = NSColor(hue: 1, saturation: 0, brightness: 0, alpha: 1)
    spot.spotInnerAngle = 30
    spot.spotOuterAngle = 60


    let spotNode = SCNNode()
    spotNode.light = spot
    spotNode.position = SCNVector3(x: 0, y: 2000, z: 2000)

    let lookAt = SCNLookAtConstraint(target: boxNode)
    spotNode.constraints = [lookAt]
}

If I bring in a .dae filed add a spot light, or directional light, using the Scene Editor I can light the scene but there are no shadows when I set the Cast Shadows property in the Attributes Inspector.

Can anyone shine any light on my problem?

Thanks

2

2 Answers

1
votes

the dimensions in your scene are huge (in SceneKit 1 unit = 1 meter). You'll want to change your light's zFar property (and probably zNear too) accordingly.

1
votes

The scene is large because the 3D model has been created at 1:1 and it depicts a large building. After much trial and error I finally found the solution - I changed the scale of the light to 10, 10, 10 and the shadows appeared.