有什么问题
一个空的 SceneKit 的场景(没有任何添加的灯光)有一个默认的全向灯光,您可以轻松地打开或关闭它:
sceneView.autoenablesDefaultLighting = true
让我们看看 Apple 文档是怎么说的:
如果此属性的值为false(默认值),则 SceneKit 用于渲染场景的唯一光源是场景图中包含的光源。如果将该值更改为true,则 SceneKit 在渲染不包含灯光或仅包含环境光的场景时会自动添加并放置一个全向光源。
当您将灯光添加到场景中时,它们会相应地表现。主要原则是:
如果添加了新灯光,默认 SceneKit 的灯光将关闭。
如果光是rays are parallel to any 3D surface
那个表面将是黑色的。
- 这种行为适用于定向光或具有窄光锥的聚光灯。
- 这是因为 SceneKit 没有全局照明选项(或辅助光线)。
环境光是全向的,没有衰减。它只有表面法线的着色。
点光是全向的并且具有衰减(光会根据距离而失去其强度)。
这就是你场景中的地板变黑的原因。
请记住——您可以轻松地打开或关闭任何灯:
@IBAction func turnLight(_ sender: NSButton) {
if counter % 2 == 0 {
ambientLightNode.isHidden = true
} else {
ambientLightNode.isHidden = false
}
counter += 1
}
解决方案
当您为场景照明时,您需要使用多种灯光类型。如果您只使用定向光,场景中的某些对象表面将是黑色的,因此请使用额外的低强度环境光(200 到 500 流明)来照亮这些黑色表面。不要使用过多的点光源,因为每个点光源是一组 6 个具有 90 度圆锥的聚光灯。所以每个开启阴影的点光源都是计算密集型的!
附言
如果您对 RealityKit 照明感兴趣,请阅读我在 Medium 上的故事。