【问题标题】:Deferred Shadow doesn't work if detecting Multiple Transparent Planes如果检测到多个透明平面,延迟阴影不起作用
【发布时间】:2020-06-02 14:42:07
【问题描述】:

在我的代码中,我检测平面并显示平面上方物体的阴影。如果有一个平面,它可以正常工作,但如果它检测到多个平面,则会显示冗余阴影。

如图所示,在#1平面上,阴影是正确的,但是如果我添加另一个平面#2,平面#2的阴影是错误的,即使我移除飞机,平面#1上的阴影消失了,但 2 号平面上的阴影仍然存在。我不想移除#2 平面,但是如何移除#2 平面上的错误阴影?

请帮我解决,谢谢。

编辑:如果我把飞机换成地板,会好很多。

【问题讨论】:

  • 你绝对需要延迟阴影吗?如果是,为什么?

标签: swift scenekit augmented-reality arkit


【解决方案1】:

当您使用平面检测功能并希望将两个共面检测到的平面组合成一个更大的平面时,最好的方法是使用renderer(_:didUpdate:for:) 实例方法更新检测到的平面,以获得一个中心有一个ARPlaneAnchor 的联合平面。

您的代码如下所示:

extension ViewController: ARSCNViewDelegate {

    func renderer(_ renderer: SCNSceneRenderer, 
              didUpdate node: SCNNode, 
                  for anchor: ARAnchor) {

        guard let planeAnchor = anchor as? ARPlaneAnchor,
              let planeNode = node.childNodes.first,
              let myPlane = planeNode.geometry as? SCNPlane
        else { return }

        let width = CGFloat(planeAnchor.extent.x)
        let height = CGFloat(planeAnchor.extent.z)
        myPlane.width = width
        myPlane.height = height

        let x = CGFloat(planeAnchor.center.x)
        let y = CGFloat(planeAnchor.center.y)
        let z = CGFloat(planeAnchor.center.z)
        planeNode.position = SCNVector3(x, y, z)
    }
}

附言

此代码的关键点不是更新本身,而是您获得更大的单个平面而不是两个不同的共面平面这一事实。因此,这架飞机捕捉到的阴影必须按预期工作。

是否要使用无限平面 (SCNFloor) 由您决定,但如果您跟踪非无限表面(如桌面)则无效。

【讨论】:

  • 谢谢@andy,我有代码,这不是重点。现在,我将平面更改为地板,#2 楼的阴影仍然存在,但它与 #1 楼的外观相同。现在好多了。再次感谢。
猜你喜欢
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 2014-05-17
  • 2018-02-13
  • 2012-07-17
  • 1970-01-01
相关资源
最近更新 更多