【问题标题】:SceneKit Deferred Shadows On Multiple Transparent PlanesSceneKit 在多个透明平面上延迟阴影
【发布时间】:2019-09-12 17:31:03
【问题描述】:

问题

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

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

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

问题

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

代码

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

【问题讨论】:

  • 如果您移动 ship 或 ship2 而不是 shipMesh,您将始终看到两个阴影。这是在回答你的问题吗?
  • @E.Coms 的问题是第二个阴影被最靠近相机的阴影平面剪裁了。您可以看到它有部分阴影,但有一个角被切掉。
  • 让两个阴影平面的 Y 值略有不同如何?

标签: ios swift scenekit augmented-reality arkit


【解决方案1】:

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

【讨论】:

  • 然后我可以使用单个阴影平面或SCNFloor。我想要的是两个独立的平面,它们的 y 值明显不同。想象一下 ARKit 中检测到多个平面的场景:一个在地板上,一个在桌子上。在这种情况下,我需要两个具有不同 Y 值的独立阴影平面。
【解决方案2】:

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

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

例如:

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

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

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

【讨论】:

  • 非常感谢您的建议。但是,如果我从这两个阴影平面创建单个几何体,我仍然会遇到同样的问题。除非我遗漏了一些重要的东西,否则拥有一个几何图形并不能真正解决这个问题。如果您想查看,我已经根据您的建议更新了 GitHub 存储库。
  • @andy,你能帮我解决这个问题吗stackoverflow.com/questions/60283239/…,谢谢。
猜你喜欢
  • 2020-06-02
  • 2019-03-10
  • 2018-01-12
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 2017-10-13
  • 2021-07-08
  • 2018-12-06
相关资源
最近更新 更多