4

屏幕截图 #1 显示了一个简单的 SceneKit 场景,其中只有一个环境光(明确添加,不是默认的)。

屏幕截图 #2 显示了添加聚光灯后发生的情况。整个地板都变黑了。在 SceneKit 编辑器中添加聚光灯后,此聚光灯具有默认属性。

定向光也会发生这种情况。

需要明确的是,场景默认包含环境光。但是,我们在添加聚光灯/定向光之前明确添加了环境光(甚至测试了两个) 。所以这个问题中提到的默认光理论不再适用。因此混乱。

聚光灯和定向灯应该为场景的特定区域添加光,这是可以理解的。但他们不应该把他们范围之外的区域变黑,对吧?

3D 图形和 SceneKit 的新手,因此非常感谢任何建议。

截图#1: 在此处输入图像描述

截图#2: 在此处输入图像描述

4

1 回答 1

5

有什么问题

一个空的 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 上的故事。

于 2020-03-04T16:50:23.553 回答