Подтвердить что ты не робот

Как обнаружить вертикальные плоскости в ARKit?

Как можно реализовать вертикальное определение плоскости (т.е. для стенок)?

let configuration = ARWorldTrackingSessionConfiguration()
configuration.planeDetection = .horizontal //TODO
4b9b3361

Ответ 1

Изменить: теперь это поддерживается с ARKit 1.5 (iOS 11.3). Просто используйте .vertical. Я сохранил предыдущий пост ниже в исторических целях.


TL; DR

Обнаружение вертикальной плоскости не является (пока) функцией, которая существует в ARKit. .horizontal предполагает, что эта функция может быть разработана и может быть добавлена в будущем. Если бы это было просто булево значение, это означало бы, что оно является окончательным.

подтверждение

Это подозрение подтвердил мой разговор с инженером Apple на WWDC17.

объяснение

Вы могли бы утверждать, что создание реализации для этого было бы сложно, поскольку существует гораздо больше ориентаций для вертикальной плоскости, чем для горизонтальной, но, как сказал Родэмн, это, вероятно, не тот случай.

Из комментария rodamns: Самой простой плоскостью считается три копланарные точки. У вас есть кандидат на поверхность, если на поверхности обнаружено достаточное количество обнаруженных копланарных элементов (вертикальных, горизонтальных или под любым произвольным углом). Просто нормаль для горизонталей будет вдоль оси вверх/вниз, в то время как нормали будут параллельны плоскости земли. Проблема заключается в том, что неокрашенный гипсокартон имеет тенденцию генерировать немного визуальных особенностей, а простые стены часто могут остаться незамеченными. Я сильно подозреваю, что именно поэтому .vertical функция еще не выпущена.

Однако этому есть контраргумент. Смотрите комментарии от Рикстер для получения дополнительной информации.

Ответ 2

Поддержка этого идет с iOS 11.3:

static var vertical: ARWorldTrackingConfiguration.PlaneDetection

Сеанс обнаруживает поверхности, параллельные гравитации (независимо от другой ориентации).

https://developer.apple.com/documentation/arkit/arworldtrackingconfiguration.planedetection https://developer.apple.com/documentation/arkit/arworldtrackingconfiguration.planedetection/2867271-vertical

Ответ 3

Apple выпустила iOS 11.3 с различными обновлениями для AR, включая ARKit 1.5. В этом обновлении ARKit включает в себя возможность ARKit распознавать и размещать виртуальные объекты на вертикальных поверхностях, таких как стены и двери.

Поддержка вертикали теперь поддерживается в ARWorldTrackingConfiguration

let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal, .vertical]
sceneView.session.run(configuration)

Ответ 4

Поскольку iPhone X оснащен фронтальной камерой глубины, мое подозрение заключается в том, что обратная сторона будет следующей версией, и, возможно, функция .vertical будет делегирована до тех пор.

Ответ 5

Я сделал это с Unity, но мне нужно сделать математику.

Я использую случайный выборочный консенсус, чтобы обнаружить вертикальную плоскость из облака точек, возвращенного ARkit. Это похоже на цикл, который случайным образом выбирает 3 точки, чтобы создать плоскость, и подсчитывает точки, которые соответствуют ей, и посмотреть, какая попытка является лучшей.

Это работает. Но потому что ARkit не может вернуть много очков, когда стена в цвете. Так что это не работает во многих ситуациях.

Ответ 6

Говорят, что Apple работает над дополнительными возможностями AR для нового iPhone. Кроме того, дополнительные датчики для камеры. Возможно, это будет функция, когда эти возможности устройства известны. Некоторые спекуляции здесь. http://uk.businessinsider.com/apple-iphone-8-rumors-3d-laser-camera-augmented-reality-2017-7 и еще один источник https://www.fastcompany.com/40440342/apple-is-working-hard-on-an-iphone-8-rear-facing-3d-laser-for-ar-and-autofocus-source

Ответ 7

В Аркыте 1.0 был только .horizontal перечисления случая для обнаружения горизонтальных поверхностей, как стол или пол. В ARKit 1.5 и выше есть .horizontal и .vertical типа структуры PlaneDetection которая соответствует протоколу OptionSet.

Для реализации обнаружения вертикальной плоскости в ARKit 2.0 используйте следующий код:

configuration.planeDetection = ARWorldTrackingConfiguration.PlaneDetection.vertical

Или вы можете использовать обнаружение для обоих типов самолетов:

private func configureSceneView(_ sceneView: ARSCNView) {

    let configuration = ARWorldTrackingConfiguration()
    configuration.planeDetection = [.horizontal, .vertical]    //BOTH TYPES
    configuration.isLightEstimationEnabled = true
    sceneView.session.run(configuration)
}

Также вы можете добавить расширение в ARSceneManager для обработки вызовов делегатов:

extension ARSceneManager: ARSCNViewDelegate {

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        guard let planeAnchor = anchor as? ARPlaneAnchor else { 
            return 
        }
        print("Found plane: \(planeAnchor)")
    }
}

Ответ 8

Вот небольшой демонстрационный код для поиска горизонтальной поверхности. В # Swift5 Github