Перемещение 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. И камера, и свет теперь будут двигаться вместе.

Другие вопросы по тегам