首页 > 解决方案 > SceneKit 在多个透明平面上延迟阴影

问题描述

问题

我已经设置了一个最小的 SceneKit 项目,其中包含一个包含默认飞机的场景,该飞机具有一个充当阴影接收器的透明平面。我已经复制了这个设置,所以有两个飞机和两个透明的阴影平面。

有一个可以投射阴影的定向光,其shadowMode属性设置为.deferred。当两个阴影平面重叠时,离相机较近的平面会“切掉”离相机较远的平面上的阴影。

我知道这是因为飞机的材质将其.writesToDepthBuffer属性设置为 true。然而,没有这个,延迟的阴影就不起作用。

失踪的影子

问题

有没有办法在多个重叠平面上显示阴影?我知道我可以SCNFloor用来显示多个阴影,但我特别希望在具有不同 Y 位置的多个平面上产生阴影。想想 ARKit 中检测到多个平面的场景。

编码

我在GitHub 上建立了一个最小的项目。

标签: iosswiftscenekitaugmented-realityarkit

解决方案


在 SceneKit 中,这是两个具有阴影投影的不同平面的常规行为。为了获得强大的阴影,只需使用一个 3d 对象(平面或自定义形状的几何体,如果您需要不同的楼层)作为阴影捕捉器。

在此处输入图像描述

如果您有多个带有Writes depth选项的 3D 对象,请On使用Rendering order每个对象的属性。具有较大渲染顺序的节点最后渲染。默认值为Rendering order0。

例如:

geoNodeOne.renderingOrder = -1    /* Rendered first */
geoNodeTwo.renderingOrder = 50    /* Rendered last */

在此处输入图像描述

在此处输入图像描述

但是在您的情况下,Rendering order属性is useless是因为一个阴影投影平面阻挡了另一个

Extrude Tool要在 3D 建模应用程序(如 Maya 或 3dsMax)中使用自定义形状几何体建模:

在此处输入图像描述


推荐阅读