投射远处光线的阴影

问题描述 投票:1回答:1

我有一个AR应用程序,其中我已经计算了用户当前的太阳位置。我将这个位置缩小到10,000 meters的距离,所以当我进入场景时它有点“停留”。现在我想在场景中的其他节点上投射阴影。我试过几种类型的闪电,但都没有成功。有些人根本没有投下阴影,有些人表现得很奇怪。从这样的远程节点创建光源以在不可见的floor node上投射阴影的最佳方法是什么?我还应该在场景中加入ambient灯吗?它可以添加到摄像机节点,还是应该在其他地方?

swift scenekit augmented-reality arkit shadow
1个回答
2
投票

使用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

有时,如果您将一盏灯连接到相机,您将获得一些好处。在这种情况下,对象的法线与光线平行的表面会被点亮。

© www.soinside.com 2019 - 2024. All rights reserved.