RealityKit и ARKit - что ищет AR-проект при запуске приложения? - PullRequest
1 голос
/ 18 июня 2020

Вы поймете этот вопрос лучше, если откроете Xcode, создадите новый проект дополненной реальности и запустите этот проект.

После запуска проекта на устройстве вы увидите изображение с задней камеры, снимающее ваша комната.

Через 3 или 4 секунды появляется куб.

Мои вопросы:

  1. что делало приложение до появления куба ? Я имею в виду, я предполагаю, что приложение искало точки отслеживания на сцене, чтобы оно могло привязать куб, верно?

  2. если это правда, какие элементы ищет приложение?

  3. Предположим, меня не устраивает точка, в которой появился куб. Есть ли какая-либо функция, которую я могу вызвать касанием экрана, чтобы отслеживание могло снова искать новые точки рядом с местом, которое я коснулся на экране?

Я знаю, что мой вопрос общий c, поэтому, пожалуйста, просто дайте мне правильное направление.

Ответы [ 2 ]

3 голосов
/ 19 июня 2020

Этапы ARKit и RealityKit

При запуске приложения AR в ARKit и RealityKit есть три этапа:

  • Отслеживание
  • Понимание сцены
  • Рендеринг

Каждый этап может значительно увеличить время, необходимое для размещения модели (+1 ... + 4 секунды, в зависимости от устройства). Давайте поговорим о каждом этапе.

Отслеживание

Это начальное состояние для вашего приложения AR. Здесь iPhone смешивает визуальные данные, поступающие через заднюю камеру RGB со скоростью 60 кадров в секунду, и преобразует данные, поступающие от датчиков IMU (акселерометр, гироскоп и компас) со скоростью 1000 кадров в секунду. Автоматически генерируемые Feature Points помогают ARKit и RealityKit отслеживать окружающую среду и строить карту отслеживания (будь то World Tracking или, например, Face Tracking). Feature Points спонтанно генерируются на жестких границах реальных объектов и текстур в хорошо освещенной среде. Если у вас уже есть ранее сохраненная карта мира, это сокращает время размещения модели в сцене. Также вы можете использовать ARCoachingOverlayView для полезных визуальных инструкций, которые помогут вам во время инициализации и восстановления сеанса.

Понимание сцены

Второй этап может включать в себя обнаружение горизонтальной и вертикальной плоскости, Ray-Casting ( или Hit-Testing) и легкой оценки. Если вы активировали функцию обнаружения плоскости, потребуется некоторое время, чтобы обнаружить самолет с соответствующим ARPlaneAnchor (или AnchorEntity(.plane)), который должен привязать виртуальную модель - в вашем случае куб. Также есть Расширенное понимание сцены , позволяющее использовать функцию Реконструкция сцены . Вы можете использовать реконструкцию сцены в гаджетах с помощью сканера LiDAR, и это дает вам улучшенный канал глубины для составления элементов в сцене и People Occlusion. Вы всегда можете включить функцию обнаружения изображения / объекта, но вы должны учитывать, что она построена на алгоритмах машинного обучения, которые увеличивают время размещения модели в сцене.

Рендеринг

Последний этап выполняется для рендеринга виртуальной геометрии в вашей сцене. Сцены могут содержать модели с шейдерами и текстурами на них, трансформацию или анимацию ресурсов, динамику и звук. Окружающие HDR-отражения для шейдеров Metalli c рассчитываются нейронными модулями. ARKit не может визуализировать сцену AR. Для 3D-рендеринга необходимо использовать такие фреймворки, как RealityKit, SceneKit или Metal. У этих фреймворков есть свои собственные механизмы рендеринга.

По умолчанию в RealityKit есть высококачественные эффекты рендеринга, такие как «Размытие в движении» или тени с трассировкой лучей, которые требуют дополнительных вычислительных мощностей. Примите это во внимание .

Подсказка

Чтобы значительно сократить время размещения объекта в сцене AR, используйте сканер LiDAR, который работает со скоростью наносекунды. Если в вашем гаджете нет LiDAR, то отслеживайте только окружающую среду, где условия освещения хорошие, все объекты реального мира четко различимы, а текстуры на них богаты и не имеют повторяющихся узоров. Кроме того, старайтесь не использовать в полигональной геометрии вашего проекта с более чем 10K + полигонами и текстурами высокого разрешения (jpeg или png с размером 1024x1024 считается нормальным).

Кроме того, в RealityKit 1.0 по умолчанию включено несколько heavy параметров - Depth channel Compositing, Motion Blur и Ray-traced Contact Shadows (на A11 и более ранних версиях есть проецируемые тени). Если вам не нужны все эти функции, просто отключите их. После этого ваше приложение будет намного быстрее.


Практическое решение I

(тени, размытие в движении, компенсация глубины и т. Д. c отключены)

Используйте следующие свойства для отключения эффектов, интенсивно использующих процессор:

override func viewDidLoad() {
    super.viewDidLoad()
    
    arView.renderOptions = [.disableDepthOfField,
                            .disableHDR,
                            .disableMotionBlur,
                            .disableFaceOcclusions,
                            .disablePersonOcclusion,
                            .disableGroundingShadows]
    
    let boxAnchor = try! Experience.loadBox()
    arView.scene.anchors.append(boxAnchor)
}


Практическое решение II

(тени, размытость при движении, глубина comp, et c. включены по умолчанию)

При использовании следующего кода в RealityKit:

override func viewDidLoad() {
    super.viewDidLoad()

    let boxAnchor = try! Experience.loadBox()
    arView.scene.anchors.append(boxAnchor)
}

вы получаете предварительно сконфигурированную сцену Reality Composer, содержащую свойство обнаружения горизонтальной плоскости, и AnchorEntity со следующими настройками:

AnchorEntity(.plane(.horizontal,
                classification: .any,
                 minimumBounds: [0.25, 0.25]) 

Проблема, с которой вы столкнулись, заключается в задержке во времени, которая возникает в в момент запуска вашего приложения. В этот же момент запускается отслеживание мира (первый этап), затем приложение пытается одновременно определить горизонтальную плоскость (второй этап), а затем визуализирует металлический c шейдер куба (третий этап). Чтобы избавиться от этого запаздывания, используйте очень простой подход (при запуске приложения вам нужно отслеживать комнату, а затем нажимать на экран):

override func viewDidLoad() {
    super.viewDidLoad()
    
    let tap = UITapGestureRecognizer(target: self,
                                     action: #selector(self.tapped))
    arView.addGestureRecognizer(tap) 
}

@objc func tapped(_ sender: UITapGestureRecognizer) {

    let boxAnchor = try! Experience.loadBox()
    arView.scene.anchors.append(boxAnchor)
}

Таким образом вы уменьшаете одновременную нагрузку на ЦП и GPU. Таким образом, ваш куб загружается быстрее.

PS

Кроме того, в качестве альтернативы вы можете использовать метод типа loadModelAsync(named:in:), который позволяет асинхронно загружать объект модели из файла в пакете:

static func loadModelAsync(named name: String, 
                            in bundle: Bundle?) -> LoadRequest<ModelEntity>
1 голос
/ 19 июня 2020

В проекте Experience.rc по умолчанию куб имеет AnchoringComponent с горизонтальной плоскостью . Таким образом, куб не будет отображаться, пока ARSession не найдет горизонтальную плоскость в вашей сцене (например, пол или стол). Как только он обнаружит, что куб появится.

Если вы хотите вместо этого создать и привязать и установить его в качестве цели при захвате события касания, вы можете выполнить raycast . Используя результат raycast, вы можете захватить worldTransform и установить AnchoringComponent куба на это преобразование:

Примерно так:
boxAnchor.anchoring = AnchoringComponent(.world(transform: raycastResult.worldTransform))

...