【问题标题】:How to eliminate grayish ARKit/SceneKit shadow plane?如何消除灰色 ARKit/SceneKit 阴影平面?
【发布时间】:2020-09-25 06:12:21
【问题描述】:

我已经实现了向 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)

【问题讨论】:

    标签: scenekit arkit


    【解决方案1】:

    经过更多的实验,我找到了一个似乎运作良好的解决方案。将材质 .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)
    

    【讨论】:

      猜你喜欢
      • 2019-08-05
      • 2021-02-19
      • 2021-07-08
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 2019-09-12
      • 2018-03-21
      相关资源
      最近更新 更多