Перемещение SCNLight с помощью SCNAction
У меня есть прожектор, созданный с помощью кода, отбрасывающего тени на все мои узлы:
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 ответ
Создайте дерево узлов, чтобы держать и центр внимания и камеру.
Создайте, скажем, cameraRigNode как SCNNode без геометрии. Создайте cameraContainerNode и spotlightNode таким же образом, как сейчас. Но сделайте их потомками cameraRigNode, а не корневым узлом сцены.
Примените moveAction к cameraRigNode. И камера, и свет теперь будут двигаться вместе.