如何消除灰色ARKit/SceneKit阴影平面?
How to eliminate grayish ARKit/SceneKit shadow plane?
我已经实现了将阴影平面添加到 ARKit 和 SceneKit 场景的多种方法之一。它工作得很好,阴影看起来很好。
问题是大多数时候飞机也有灰色。换句话说,它不是完全透明的。另一方面,有时灰色阴影会消失,但几秒钟后又会重新出现。我已经尝试调整几乎所有我能想到的 SCNNode 和 SCNMaterial 属性,但到目前为止,我似乎无法让灰色可靠地消失。有人对如何解决这个问题有什么建议吗?
// Make a transparent shadow plane for the Ground.
let shadowPlane = SCNPlane(width: CGFloat(self.width * 2), height: CGFloat(self.depth * 2))
shadowPlane.cornerRadius = 2
let shadowPlaneNode = SCNNode(geometry: shadowPlane)
shadowPlaneNode.name = shadowPlaneNodeName
shadowPlaneNode.eulerAngles.x = -.pi / 2
shadowPlaneNode.castsShadow = false
let material = SCNMaterial()
material.isDoubleSided = false
material.lightingModel = .constant // .shadowOnly does not show any shadows on iOS
material.colorBufferWriteMask = [.alpha]
shadowPlane.materials = [material]
node.addChildNode(shadowPlaneNode)
经过更多实验后,我找到了一个似乎运行良好的解决方案。将 material .lightingModel 设置为 .shadowOnly 实际上可以正常工作,没有任何灰色投射,但前提是您将产生阴影的直射光上的 .shadowModel 设置为 .forward 而不是 .deferred。
此外,我发现 .shadowOnly 中似乎存在一个错误,如果场景中有任何光线为 .type == .omni 或 == .spot,该错误会导致平面呈现完全黑色。
这是对我有用的代码:
let shadowPlane = SCNPlane(width: CGFloat(self.width * 1.5), height: CGFloat(self.depth * 1.5))
let shadowPlaneNode = SCNNode(geometry: shadowPlane)
shadowPlaneNode.name = shadowPlaneNodeName
shadowPlaneNode.eulerAngles.x = -.pi / 2
shadowPlaneNode.castsShadow = false
let material = SCNMaterial()
material.isDoubleSided = false
material.lightingModel = .shadowOnly // Requires SCNLight shadowMode = .forward and no .omni or .spot lights in the scene or material rendered black
shadowPlane.materials = [material]
node.addChildNode(shadowPlaneNode)
我已经实现了将阴影平面添加到 ARKit 和 SceneKit 场景的多种方法之一。它工作得很好,阴影看起来很好。
问题是大多数时候飞机也有灰色。换句话说,它不是完全透明的。另一方面,有时灰色阴影会消失,但几秒钟后又会重新出现。我已经尝试调整几乎所有我能想到的 SCNNode 和 SCNMaterial 属性,但到目前为止,我似乎无法让灰色可靠地消失。有人对如何解决这个问题有什么建议吗?
// Make a transparent shadow plane for the Ground.
let shadowPlane = SCNPlane(width: CGFloat(self.width * 2), height: CGFloat(self.depth * 2))
shadowPlane.cornerRadius = 2
let shadowPlaneNode = SCNNode(geometry: shadowPlane)
shadowPlaneNode.name = shadowPlaneNodeName
shadowPlaneNode.eulerAngles.x = -.pi / 2
shadowPlaneNode.castsShadow = false
let material = SCNMaterial()
material.isDoubleSided = false
material.lightingModel = .constant // .shadowOnly does not show any shadows on iOS
material.colorBufferWriteMask = [.alpha]
shadowPlane.materials = [material]
node.addChildNode(shadowPlaneNode)
经过更多实验后,我找到了一个似乎运行良好的解决方案。将 material .lightingModel 设置为 .shadowOnly 实际上可以正常工作,没有任何灰色投射,但前提是您将产生阴影的直射光上的 .shadowModel 设置为 .forward 而不是 .deferred。
此外,我发现 .shadowOnly 中似乎存在一个错误,如果场景中有任何光线为 .type == .omni 或 == .spot,该错误会导致平面呈现完全黑色。
这是对我有用的代码:
let shadowPlane = SCNPlane(width: CGFloat(self.width * 1.5), height: CGFloat(self.depth * 1.5))
let shadowPlaneNode = SCNNode(geometry: shadowPlane)
shadowPlaneNode.name = shadowPlaneNodeName
shadowPlaneNode.eulerAngles.x = -.pi / 2
shadowPlaneNode.castsShadow = false
let material = SCNMaterial()
material.isDoubleSided = false
material.lightingModel = .shadowOnly // Requires SCNLight shadowMode = .forward and no .omni or .spot lights in the scene or material rendered black
shadowPlane.materials = [material]
node.addChildNode(shadowPlaneNode)