我有一个有2个灯光的场景-omni
和directional
。 Directional
被假定为扮演Sun
的角色-它应该在地板上投射阴影并在某些物体上发光。
现在我有多个节点,其中一些节点应与太阳光发生反应并从中投射阴影,而另一些节点应被太阳光和阴影完全忽略。
所以对于阳光,我会这样做:
let light = SCNLight()
light.type = .directional
light.castsShadow = true
light.shadowMode = .deferred
light.shadowColor = SunNode.shadowColor
light.color = SunNode.lightColor
light.automaticallyAdjustsShadowProjection = true
light.categoryBitMask = 1 << 1
好,现在我可以创建将与sun反应的节点:
let node = SCNNode()
...
node.categoryBitMask = 1 << 1
此节点与太阳光线发生反应,并将shadows
落在floor
上,到目前为止效果很好。
然后我们创建另一个对象,该对象完全不应该与sun
反应。
let node2 = SCNNode()
...
node2.categoryBitMask = 1 << 0 // (Just to make it clear that bit mask is different)
这不会在shadows
上投放floor
,但是object2
存在一个问题。如果在object2
和太阳之间有object1
,则此object1
不仅在shadow
上而且在floor
上投object2
。 Object2
根本不会收到此shadow
。可以通过某种方式做到吗?