Отложенная тень не работает при обнаружении нескольких прозрачных плоскостей - PullRequest
2 голосов
/ 18 февраля 2020

В моем коде я определяю плоскость и показываю тень для объекта над плоскостью. Если есть одна плоскость, она работает нормально, но если она обнаруживает несколько плоскостей, появится лишняя тень.

Как показано на рисунке, на плоскости # 1 тень правильная, но если я добавлю другую плоскость № 2, плоскость № 2 имеет неправильную тень, даже если я уберу самолет, тень на плоскости № 1 исчезнет, ​​но тень на плоскости № 2 все еще там. Я не хочу удалять плоскость № 2, но как удалить неправильную тень на плоскости № 2?

Пожалуйста, помогите мне исправить это, спасибо.

enter image description here

Редактировать: Если я поменяю плоскость на пол, будет намного лучше.

enter image description here

1 Ответ

1 голос
/ 18 февраля 2020

Когда вы используете функцию обнаружения плоскостей и хотите объединить две обнаруженные в одной плоскости копланарной плоскости, лучше всего обновить обновленные обнаруженные плоскости, используя метод экземпляра 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)
    }
}

PS

Ключевым моментом этого кода является не само обновление а скорее тот факт, что вы получаете большую отдельную плоскость вместо двух разных копланарных плоскостей. Таким образом, тени, которые ловит эта единственная плоскость, должны работать так, как ожидалось.

Вам решать, хотите ли вы использовать бесконечную плоскость (SCNFloor), но это неэффективно, если вы отслеживаете бесконечную поверхность, такую ​​как столешница .

...