使用SCNAction移动SCNLight

时间:2016-02-23 20:41:30

标签: ios scenekit

我有一个聚光灯,使用下面的代码创建,在我的所有节点上投射阴影:

 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,但闪烁仍然存在。有方向性,我实际上放弃了大部分阴影。如果我稍后创建一个新的光节点,我似乎有两个"太阳",这当然是不可能的。最终目标只是让一个无限的光线从左边平行于场景照射,将所有阴影投射到右边。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

构建节点树以同时保存聚光灯和相机。

将cameraRigNode创建为没有几何体的SCNNode。以与现在相同的方式创建cameraContainerNode和spotlightNode。但要让他们成为cameraRigNode的子项,而不是场景的根节点。

将moveAction应用于cameraRigNode。相机和灯光现在都会一起移动。