首页 > 解决方案 > 如果检测到多个透明平面,延迟阴影不起作用

问题描述

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

如图所示,在#1平面上,阴影是对的,但是如果我添加另一个平面#2,平面#2的阴影是错误的,即使我移除飞机,平面#1上的阴影也会消失,但是2 号飞机上的影子还在。我不想移除飞机#2,但是如何移除飞机#2 上的错误阴影?

请帮我修一下,谢谢。

在此处输入图像描述

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

在此处输入图像描述

标签: swiftscenekitaugmented-realityarkit

解决方案


当您使用平面检测功能并希望将两个共面检测到的平面组合成更大的平面时,最好的方法是使用实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),这取决于您,但如果您跟踪像桌面这样的非无限表面,它就无效。


推荐阅读