Используйте 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
источнике света, созданном вручную:
Иногда вы получаете некоторые преимущества, если подключаете источник света к камере.В этом случае освещаются поверхности объекта с нормалями, параллельными лучам света.