SceneKit - 为啥添加聚光灯会使地板变黑?

Posted

技术标签:

【中文标题】SceneKit - 为啥添加聚光灯会使地板变黑?【英文标题】:SceneKit – Why does adding spot light blacken the floor?SceneKit - 为什么添加聚光灯会使地板变黑? 【发布时间】:2016-12-02 04:01:51 【问题描述】:

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

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

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

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

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

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

屏幕截图 #1:

屏幕截图 #2:

【问题讨论】:

当您没有自己的灯时,这是默认照明。 ***.com/questions/24697574/…你应该添加自己的全向光。 @JamesP 在屏幕截图 1 中不清楚的是已经明确添加了环境光,因此造成了混乱。因此,添加聚光灯有效地“减少”了光线而不是增加了光线。你可以自己测试一下。添加环境光(甚至两个),然后添加聚光灯。 您说得对,在您添加另一种类型的光源之前,似乎仍有默认照明。我发现这篇文章似乎可以解释它***.com/questions/36705733/… 【参考方案1】:

有什么问题

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

sceneView.autoenablesDefaultLighting = true

让我们看看 Apple 文档是怎么说的:

如果此属性的值为 false(默认值),则 SceneKit 用于渲染场景的唯一光源是场景图中包含的光源。如果您将该值更改为 true,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 度圆锥的聚光灯。所以每个开启阴影的点光源都是计算密集型的!

附言

如果您对 RealityKit 照明感兴趣,请在 Medium 上read my story。

【讨论】:

以上是关于SceneKit - 为啥添加聚光灯会使地板变黑?的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发之SceneKit框架--SCNLight.h

在SceneKit / ARKit中出现隐形阴影平面问题

使聚光灯静止

为啥苹果拍的照片发到安卓上变黑了

为啥 webView.setWebChromeClient(new WebChromeClient());导致屏幕变黑?

为啥我的“initwithframe”变黑了? CGRect圆角绘图与initwithframe