是否可以在 ARKit 中的透明 SCNFloor 上投射光线?

问题描述

我想放置一个 SCNLight 节点并将光投射到透明的 SCNFloor 上?这将在真实表面上产生光投射的效果。类似于 shadowOnly 投射阴影的光照模型。这可能吗?

解决方法

是的,您可以通过投射白色(或渗色)阴影而不是黑色阴影来实现。为此,您必须使用在后处理过程中呈现的 deferred 阴影类型。

考虑一下,您必须在场景中使用两个单独的灯光——第一个用于投射白色阴影,第二个用于投射这些白色阴影的照明对象。您可以在实现 categoryBitMask 属性的照明方案中包含和排除对象。

// SETTING A SHADOW CATCHER
let plane = SCNPlane(width: 10,height: 10)
plane.firstMaterial?.isDoubleSided = true
plane.firstMaterial?.lightingModel = .shadowOnly
let planeNode = SCNNode(geometry: plane)
planeNode.eulerAngles.x = -.pi / 2
scene.rootNode.addChildNode(planeNode)

// SETTING A LIGHT
let lightNode = SCNNode()
lightNode.light = SCNLight()
lightNode.light?.type = .directional
lightNode.light?.intensity = 50
lightNode.light?.color = UIColor.black
lightNode.eulerAngles.x = -.pi / 2
scene.rootNode.addChildNode(lightNode)
    
// DEFERRED SHADOWS
lightNode.light?.castsShadow = true
lightNode.light?.shadowMode = .deferred          // important
lightNode.light?.forcesBackFaceCasters = true    // important
lightNode.light?.shadowRadius = 10
lightNode.light?.shadowColor = UIColor.white
,

这创造了我想要的效果。我在材质混合模式设置为屏幕模式的平面上添加了 IES 类型的光节点。

Touchable Opacity

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...