ios - SceneKit 在多个透明平面上延迟阴影
问题描述
问题
我已经设置了一个最小的 SceneKit 项目,其中包含一个包含默认飞机的场景,该飞机具有一个充当阴影接收器的透明平面。我已经复制了这个设置,所以有两个飞机和两个透明的阴影平面。
有一个可以投射阴影的定向光,其shadowMode
属性设置为.deferred
。当两个阴影平面重叠时,离相机较近的平面会“切掉”离相机较远的平面上的阴影。
我知道这是因为飞机的材质将其.writesToDepthBuffer
属性设置为 true。然而,没有这个,延迟的阴影就不起作用。
问题
有没有办法在多个重叠平面上显示阴影?我知道我可以SCNFloor
用来显示多个阴影,但我特别希望在具有不同 Y 位置的多个平面上产生阴影。想想 ARKit 中检测到多个平面的场景。
编码
我在GitHub 上建立了一个最小的项目。
解决方案
在 SceneKit 中,这是两个具有阴影投影的不同平面的常规行为。为了获得强大的阴影,只需使用一个 3d 对象(平面或自定义形状的几何体,如果您需要不同的楼层)作为阴影捕捉器。
如果您有多个带有Writes depth
选项的 3D 对象,请On
使用Rendering order
每个对象的属性。具有较大渲染顺序的节点最后渲染。默认值为Rendering order
0。
例如:
geoNodeOne.renderingOrder = -1 /* Rendered first */
geoNodeTwo.renderingOrder = 50 /* Rendered last */
但是在您的情况下,
Rendering order
属性is useless
是因为一个阴影投影平面阻挡了另一个。
Extrude Tool
要在 3D 建模应用程序(如 Maya 或 3dsMax)中使用自定义形状几何体建模:
推荐阅读
- laravel - 产品图片更新
- c# - 什么相当于 ASP.NET Core 3.0 端点的“MapSpaFallbackRoute”?
- flow-project - 为 rllib 流运行绿波示例脚本时出错
- go - 您可以防止创建无效的自定义类型吗?
- microcontroller - 尝试以无头模式构建我的项目但收到警告:没有项目匹配
- java - 在专用网络中用于单元测试的内存 mongo 数据库
- javascript - 有没有办法优化“addEventListener”代码块?
- .net-core - 使用 Azure DevOps 对 Dotnet 核心项目的 Sonarcloud 分析显示“主分支没有代码行”。
- roku - 如何在 Roku 上的视频中设置上面的文本
- jsf - javax.servlet.ServletException:UT010016:不是多部分请求