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

Cra*_*lot 4 xcode scenekit swift virtual-reality arkit

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

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

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

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

据了解,聚光灯和定向灯应该向场景的特定区域添加光线。但他们不应该把范围之外的区域涂黑,对吗?

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

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

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

ARG*_*Geo 6

有什么问题

\n
\n

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

\n
\n
sceneView.autoenablesDefaultLighting = true\n
Run Code Online (Sandbox Code Playgroud)\n

让我们看看苹果文档是如何描述的:

\n
\n

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

\n
\n

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

\n
    \n
  • 如果添加新灯光,默认 SceneKit 的灯光会关闭。

    \n
  • \n
  • 如果有光,rays are parallel to any 3D surface表面就会是黑色的。

    \n
      \n
    • 对于具有窄光锥的定向光聚光灯来说,这种行为是正确的。
    • \n
    • 发生这种情况是因为 SceneKit 没有全局照明选项(或辅助光线)。
    • \n
    \n
  • \n
  • 环境光是全向的并且没有衰减。它仅具有表面法线的阴影。

    \n
  • \n
  • 点光是全向的并且具有衰减(光根据距离而失去其强度)。

    \n
  • \n
\n

这就是场景中地板变黑的原因

\n

请记住 \xe2\x80\x93 您可以轻松打开或关闭任何灯:

\n
@IBAction func turnLight(_ sender: NSButton) {   \n\n    if counter % 2 == 0 {\n        ambientLightNode.isHidden = true\n    } else {\n        ambientLightNode.isHidden = false\n    }\n    counter += 1\n}\n
Run Code Online (Sandbox Code Playgroud)\n

解决方案

\n

当您照亮场景时,您需要使用多种灯光类型。如果仅使用定向光,场景中的某些对象表面将为黑色,因此请使用低强度 \xe2\x80\x93 200 至 500 流明 \xe2\x80\x93 的附加环境光来照亮这些黑色表面。不要使用太多点光源,因为每个点光源都是一组 6 个具有 90 度锥体的聚光灯。因此,每个打开阴影的点光源都是计算密集型的!

\n

聚苯乙烯

\n

如果您对 RealityKit 光照感兴趣,请阅读我在 Medium 上的故事。

\n