我有一个聚光灯,使用下面的代码创建,在我的所有节点上投射阴影:
spotLight.type = SCNLightTypeSpot spotLight.spotInnerAngle = 50.0 spotLight.spotOuterAngle = 150.0 spotLight.castsShadow = true spotLight.shadowMode = SCNShadowMode.Deferred spotlightNode.light = spotLight spotlightNode.eulerAngles = SCNVector3(x: GLKMathDegreesToRadians(-90),y: 0,z: 0) spotlightNode.position = levelData.coordinatesForGridPosition(column: 0,row: playerGridRow) spotlightNode.position.y = 1.5 rootNode.addChildNode(spotlightNode)
场景沿z轴移动,相机有一个无限动画使其移动:
let moveAction = SCNAction.moveByX(0.0,y: 0.0,z: CGFloat(-GameVariables.segmentSize / 2),duration: 2.0) cameraContainerNode.runAction(SCNAction.repeatActionForever(moveAction))
当相机移动时,光线不会,所以过了一会儿,整个场景都是黑暗的.我想用相机移动灯光,但是如果我将相同的移动动画应用于灯光节点,则所有阴影都会开始闪烁.我试图将SCNShadowMode更改为Forward,将灯光类型更改为Directional,但闪烁仍然存在.有方向性,我实际上放弃了大部分阴影.如果我稍后创建一个新的光节点,似乎我有两个“太阳”,这当然是不可能的.最终目标只是让一个无限的光线从左边平行于场景照射,将所有阴影投射到右边.有任何想法吗?
解决方法
@H_403_24@ 构建节点树以保持聚光灯和相机.比如,将cameraRigNode创建为没有几何体的SCNNode.以与现在相同的方式创建cameraContainerNode和spotlightNode.但是让他们成为cameraRigNode的孩子,而不是场景的根节点.
将moveAction应用于cameraRigNode.相机和灯光现在都会一起移动.