SceneKit在多个透明平面上延迟了阴影

时间:2019-04-23 13:47:31

标签: ios swift scenekit augmented-reality arkit

问题

我已经建立了一个最小的SceneKit项目,其中包含一个场景,其中包含默认飞机,该飞机带有一个透明的平面,用作阴影接收器。我已经复制了此设置,所以有两架飞机和两个透明的阴影平面。

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

我知道这是由于飞机的材质的.writesToDepthBuffer属性设置为true所致。但是,没有这个,延迟的阴影将不起作用。

Missing Shadow

问题

是否可以在多个重叠的平面上显示阴影?我知道我可以使用SCNFloor显示多个阴影,但我特别希望在多个平面上具有不同Y位置的阴影。考虑一下ARKit中检测到多个平面的情况。

代码

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

2 个答案:

答案 0 :(得分:0)

使阴影平面的两个Y值足够接近将解决cutoff问题。

答案 1 :(得分:0)

在SceneKit中,这是具有阴影投影的两个不同平面的常规行为。为了获得强大的阴影,仅使用一个3d对象(如果需要不同的地板高度,则可以使用平面或自定义形状的几何图形)作为阴影捕捉器。

enter image description here

如果您有多个3D对象,并且将Writes depth选项设置为On,请对每个对象使用Rendering order属性。具有更高渲染顺序的节点最后渲染。 Rendering order的默认值为零。

例如:

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

enter image description here

enter image description here

  

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

要建模自定义形状的几何图形,请在3D建模应用程序(例如Maya或3dsMax)中使用Extrude Tool

enter image description here