Почему угол прожектора SceneKit влияет на тень? - PullRequest
3 голосов
/ 19 марта 2019

Я пытаюсь использовать прожектор в моей сцене и добавлять тени к объекту.Однако я заметил, что когда я увеличиваю spotInnerAngle, тень от объекта значительно меняется.Вот пример:

enter image description here

Обе тени на этих изображениях выглядят совершенно по-разному - кто-нибудь знает, почему увеличение угла пятна приводит к уменьшению тениочевидный?

Это код, который я использую для создания прожектора / добавления теней к моей сцене:

    let spotLight = SCNNode()
    spotLight.light = SCNLight()
    spotLight.light?.type = SCNLight.LightType.spot
    spotLight.light?.spotInnerAngle = 120
    spotLight.light?.spotOuterAngle = 120
    spotLight.light?.color = UIColor.white
    spotLight.light?.castsShadow = true
    spotLight.light?.automaticallyAdjustsShadowProjection = true
    spotLight.light?.shadowSampleCount = 32
    spotLight.light?.shadowRadius = 8
    spotLight.light?.shadowMode = .deferred
    spotLight.light?.shadowMapSize = CGSize(width: 2048, height: 2048)
    spotLight.light?.shadowColor = UIColor.black.withAlphaComponent(1)
    spotLight.position = SCNVector3(x: 0,y: 5,z: 0)
    spotLight.eulerAngles = SCNVector3(-Float.pi / 2, 0, 0)

1 Ответ

0 голосов
/ 14 апреля 2019

Движок SceneKit вычисляет тени немного иначе, чем 3D-приложения, как Maya или 3dsMax.В рамках SceneKit position и scale вашего Spotlight, а также его значение cone angle имеют решающее значение для генерации теней.Основное правило таково: когда площадь луча прожектора в SceneKit становится больше, края тени становятся более неясными (или размытыми).

Вот свойства, которые необходимо учитывать при использовании прожектора:

let lightNode = SCNNode()
lightNode.light = SCNLight()
lightNode.light!.type = .spot
lightNode.rotation = SCNVector4(x: 0, y: 0, z: 0, w: 1)
lightNode.castsShadow = true

/* THESE SEVEN SPOTLIGHT PROPERTIES AFFECT SHADOW'S APPEARANCE */
lightNode.position = SCNVector3(0, 10, 0)
lightNode.scale = SCNVector3(7, 7, 7)
lightNode.light?.spotOuterAngle = 120
lightNode.light?.shadowRadius = 10
lightNode.light?.zNear = 0
lightNode.light?.zFar = 1000000
lightNode.light?.shadowSampleCount = 20

lightNode.light?.shadowColor = UIColor(write: 0, alpha: 0.75)
lightNode.light?.shadowMode = .deferred
scene.rootNode.addChildNode(lightNode)

Кроме того, я рекомендую использовать Ambient Light с очень низким Intensity для освещения темных областей на ваших 3D-моделях .

Надеюсь, это поможет.

...