Как можно реализовать вертикальное определение плоскости (т.е. для стенок)?
let configuration = ARWorldTrackingSessionConfiguration()
configuration.planeDetection = .horizontal //TODO
Как можно реализовать вертикальное определение плоскости (т.е. для стенок)?
let configuration = ARWorldTrackingSessionConfiguration()
configuration.planeDetection = .horizontal //TODO
Изменить: теперь это поддерживается с ARKit 1.5 (iOS 11.3). Просто используйте .vertical
. Я сохранил предыдущий пост ниже в исторических целях.
Обнаружение вертикальной плоскости не является (пока) функцией, которая существует в ARKit. .horizontal
предполагает, что эта функция может быть разработана и может быть добавлена в будущем. Если бы это было просто булево значение, это означало бы, что оно является окончательным.
Это подозрение подтвердил мой разговор с инженером Apple на WWDC17.
Вы могли бы утверждать, что создание реализации для этого было бы сложно, поскольку существует гораздо больше ориентаций для вертикальной плоскости, чем для горизонтальной, но, как сказал Родэмн, это, вероятно, не тот случай.
Из комментария rodamns: Самой простой плоскостью считается три копланарные точки. У вас есть кандидат на поверхность, если на поверхности обнаружено достаточное количество обнаруженных копланарных элементов (вертикальных, горизонтальных или под любым произвольным углом). Просто нормаль для горизонталей будет вдоль оси вверх/вниз, в то время как нормали будут параллельны плоскости земли. Проблема заключается в том, что неокрашенный гипсокартон имеет тенденцию генерировать немного визуальных особенностей, а простые стены часто могут остаться незамеченными. Я сильно подозреваю, что именно поэтому .vertical
функция еще не выпущена.
Однако этому есть контраргумент. Смотрите комментарии от Рикстер для получения дополнительной информации.
Поддержка этого идет с 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
Apple выпустила iOS 11.3 с различными обновлениями для AR, включая ARKit 1.5. В этом обновлении ARKit включает в себя возможность ARKit распознавать и размещать виртуальные объекты на вертикальных поверхностях, таких как стены и двери.
Поддержка вертикали теперь поддерживается в ARWorldTrackingConfiguration
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal, .vertical]
sceneView.session.run(configuration)
Поскольку iPhone X оснащен фронтальной камерой глубины, мое подозрение заключается в том, что обратная сторона будет следующей версией, и, возможно, функция .vertical
будет делегирована до тех пор.
Я сделал это с Unity, но мне нужно сделать математику.
Я использую случайный выборочный консенсус, чтобы обнаружить вертикальную плоскость из облака точек, возвращенного ARkit. Это похоже на цикл, который случайным образом выбирает 3 точки, чтобы создать плоскость, и подсчитывает точки, которые соответствуют ей, и посмотреть, какая попытка является лучшей.
Это работает. Но потому что ARkit не может вернуть много очков, когда стена в цвете. Так что это не работает во многих ситуациях.
Говорят, что 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
В Аркыте 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)")
}
}
Вот небольшой демонстрационный код для поиска горизонтальной поверхности. В # Swift5 Github