Отбрасывать тени от дальнего света - PullRequest
0 голосов
/ 04 октября 2018

У меня есть приложение AR, в котором я вычислил текущее положение солнца от пользователя.Я уменьшил эту позицию до расстояния 10,000 meters, так что она как бы "остается" на месте, когда я двигаюсь внутри сцены.Теперь я хотел бы отбрасывать тени от этого узла на другие узлы в моей сцене.Я пробовал несколько видов молний, ​​но ни один не удался.Некоторые вообще не падают на тень, другие ведут себя странно.Как лучше всего создать источник света из такого удаленного узла, чтобы отбрасывать тени на невидимое floor node?Должен ли я также добавить ambient свет на сцену?Может ли он быть добавлен к узлу камеры или должен быть где-то еще?

1 Ответ

0 голосов
/ 04 октября 2018

Используйте directional свет для имитации Солнца (Солнце имеет параллельные лучи, которые для нас являются первичными лучами от очень удаленного источника света) и используйте ambient свет для имитации поддельных вторичных лучей (если вы не используете Глобальное освещение).

// DIRECTIONAL LIGHT for `primary light rays` simulation
let lightNode = SCNNode()
lightNode.light = SCNLight()
lightNode.light!.type = .directional
lightNode.light!.castsShadow = true
lightNode.light!.shadowMode = .deferred
lightNode.light!.categoryBitMask = -1
lightNode.light!.automaticallyAdjustsShadowProjection = true
//lightNode.light!.maximumShadowDistance = 11000
lightNode.position = SCNVector3(x: 0, y: -5000, z: 0)
lightNode.rotation = SCNVector4(x: -1, y: 0, z: 0, w: .pi/2)
scene.rootNode.addChildNode(lightNode)

Совет : Положение directional света может быть любым (в следующем коде оно даже под плоскостью y:-5000), самое важное направление из directional света!

Также directional light не имеет параметра falloff или, так называемый, quadratic light decay.

// AMBIENT LIGHT for `fake secondary light rays` simulation
let ambientLightNode = SCNNode()
ambientLightNode.light = SCNLight()
ambientLightNode.light!.type = .ambient
ambientLightNode.light!.intensity = 1000
ambientLightNode.light!.color = NSColor.white
scene.rootNode.addChildNode(ambientLightNode)

Не используйте это логическое значение по ошибке:

lightNode.castsShadow = true

вместо этого:

lightNode.light!.castsShadow = true

Логическое значение lightNode.castsShadow определяет, будет ли SceneKit отображать содержимое узла в карты теней.

А вот скриншот, если вы хотитевключить тени в directional источнике света, созданном вручную:

enter image description here

Иногда вы получаете некоторые преимущества, если подключаете источник света к камере.В этом случае освещаются поверхности объекта с нормалями, параллельными лучам света.

...