Xcode SceneKit阴影无法渲染

时间:2016-05-19 17:57:55

标签: scenekit xcode7.3

我正在使用SceneKit创建一个简单的项目,无论我尝试什么,都无法在场景编辑器或编译的应用程序中显示任何阴影。

我尝试过创建一个简单的盒子,将它放在一个平面上并添加一个聚光灯。代码如下:

    // 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]
}

如果我引入.dae字段,使用场景编辑器添加聚光灯或方向灯,我可以点亮场景,但在“属性”检查器中设置“投射阴影”属性时没有阴影。

任何人都可以解决我的问题吗?

由于

2 个答案:

答案 0 :(得分:1)

场景中的尺寸很大(在SceneKit 1单位= 1米)。您也希望相应更改灯光的zFar属性(也可能是zNear)。

答案 1 :(得分:1)

场景很大,因为3D模型是以1:1创建的,它描绘了一个大型建筑物。经过多次反复试验后,我终于找到了解决办法 - 我将光线的比例改为10,10,10,并且出现了阴影。