SceneKit:为什么添加聚光灯使地板变黑?

时间:2016-07-27 23:38:30

标签: xcode 3d scenekit scnnode scnlight

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

屏幕截图#2显示添加聚光灯后会发生什么。整个楼层变黑了。在SceneKit编辑器中添加聚光灯后,此聚光灯具有默认属性。

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

要清楚,可以理解,场景默认包含环境光。但是,在添加点/方向光之前,我们明确添加了环境光(甚至用两个测试)。因此this question中提到的默认光理论不再适用。因此混乱。

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

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

屏幕截图#1: enter image description here

屏幕截图#2: enter image description here

1 个答案:

答案 0 :(得分:3)

一个空的SceneKit场景(不添加任何灯光)具有默认的全向灯光,您可以轻松打开或关闭该灯光:

sceneView.autoenablesDefaultLighting = true

让我们看看Apple文档对此有何评论:

如果此属性的值为 false (默认值),则SceneKit用于渲染场景的唯一光源是场景图中包含的光源。如果将值更改为 true ,则在渲染c 不保持光或仅包含环境光的场景时,SceneKit会自动添加和放置全向光源。

将灯光添加到场景中时,它们的行为相应。主要原则是

  • 如果添加了新光源,默认的SceneKit光源将关闭。

  • 如果灯光为 rays are parallel to any 3D surface ,则该表面将为黑色。

    • 这种行为是定向光,有时是点光源的特征。
    • 这是因为SceneKit没有Global Illumination选项(或辅助光线)。
  • 环境光是全向的,并且没有衰减。它仅对表面法线具有阴影。

  • 点光源是全向的,并且具有衰减(光的强度随距离而变)。

这就是为什么场景中的地板变黑的原因。

请记住–您可以轻松打开或关闭任何灯光:

@IBAction func turnLight(_ sender: NSButton) {   

    if counter % 2 == 0 {
        ambientLightNode.isHidden = true
    } else {
        ambientLightNode.isHidden = false
    }
    counter += 1
}

解决方案:

在照明场景时,您需要使用多种照明类型。如果仅使用定向光,则场景中某些对象的表面将是黑色的,因此请使用低强度(200 ... 500流明)的其他环境光来照亮这些黑色表面。不要使用太多的点光源,因为每个点光源都是一组6个90度圆锥形的射灯。因此,每个具有打开阴影的点光源都需要大量计算!