如何在 SceneKit 的场景视图中为阴影正确添加定向光?

Posted

技术标签:

【中文标题】如何在 SceneKit 的场景视图中为阴影正确添加定向光?【英文标题】:How to add directional light for shadows properly in sceneView of SceneKit? 【发布时间】:2018-03-22 17:52:19 【问题描述】:

我正在学习 ARKit。我将虚拟对象放置在增强现实场景中并努力解决这些问题!

I am using this demo project from github

1- 如何在 SceneKit 的 SceneView 中为所有(单独的)节点仅添加一个定向灯并随相机位置移动定向灯?这样我添加的阴影也可以随着光线方向移动。

如果我翻译对象阴影,它应该是正常工作的。但是如果我现在旋转对象,阴影不应该在计划上移动。它们正在移动,因为光线处于固定位置。

2- 只有在我只在平面上添加一个对象的情况下,阴影才会看起来不错。但是,如果我添加两个或更多对象,则会在 SceneView 中添加更多定向灯。现在每个物体都有不止一个阴影。我希望它只限制一个影子。

我在 sceneKit 编辑器中添加了光影平面。 (不是以编程方式)。这是我的场景工具包编辑器的屏幕截图。

3- 我已阅读并确认仅当我将定向光属性设置为 deffered 时才会添加阴影。但在这种情况下,如果我调用从场景视图的根节点中删除所有节点,应用程序就会崩溃。我的删除节点代码是。

self.sceneView.scene.rootNode.enumerateChildNodes  (node, stop) -> Void in
    node.removeFromParentNode()
    print("removed ", node.name as Any)

您可以观看我的应用视频以获得更多许可。 Apps video, How it is working now

我的要求是只为每个对象添加一个阴影。当我旋转和平移对象时,阴影应该看起来很真实。

我也尝试过从花瓶的 scn 文件中删除光,并添加一个单独的 light.scn 文件,其中只有光。在场景视图中添加了这两个(花瓶和灯)节点。但是没有影子出现。

【问题讨论】:

【参考方案1】:

    方向灯仅从着色器解释为它们的方向(从 Xcode 中的节点出来的一个浅红色矢量)。光的位置在哪里都没有关系。定向光通常用于模仿太阳光。

    我实施了一个类似的项目,所以这是我的尝试。 当我初始化SCNScene 时,我从一个单独的 SCN 文件向场景添加了一个定向光。 我的设置:

    castsShadow: true mode: deferred(如果我从场景中移除我的对象,我的应用程序不会崩溃:/)

实际上就是为了让它在我的项目中工作。 关于你的飞机的一件事:我认为你没有在飞机上禁用castsShadow。因此用户可以看到平面。

编辑: 我可以重现崩溃。移除定向光时确实会发生这种情况。这就是为什么该应用程序在我的项目中没有崩溃的原因。所以你可以像我一样做,例如在viewDidLoad() 中添加定向光。

【讨论】:

以上是关于如何在 SceneKit 的场景视图中为阴影正确添加定向光?的主要内容,如果未能解决你的问题,请参考以下文章

在 viewDidLoad 期间应用的 SceneKit 节点旋转无效

如何在 SceneKit 中正确点亮自定义网格而不显示网格的不规则性?

SceneKit 阴影电锯像粗糙的边缘

SceneKit - 具有 DAE 文件格式的动画

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

如何同时使用 SwiftUI 和 SceneKit?