我有一个AR
应用程序,其中我已经计算了用户当前的太阳位置。我将这个位置缩小到10,000 meters
的距离,所以当我进入场景时它有点“停留”。现在我想在场景中的其他节点上投射阴影。我试过几种类型的闪电,但都没有成功。有些人根本没有投下阴影,有些人表现得很奇怪。从这样的远程节点创建光源以在不可见的floor node
上投射阴影的最佳方法是什么?我还应该在场景中加入ambient
灯吗?它可以添加到摄像机节点,还是应该在其他地方?
使用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
灯中启用阴影,则此处为屏幕截图:
有时,如果您将一盏灯连接到相机,您将获得一些好处。在这种情况下,对象的法线与光线平行的表面会被点亮。