Как использовать карту окружения в ARKit? - PullRequest
0 голосов
/ 09 июня 2018

ARKit 2.0 добавил новый класс с именем AREnvironmentProbeAnchor.Читая его инструкции, кажется, что ARKit может автоматически собирать текстуру окружения (cubemap?).Я считаю, что теперь мы можем создавать некоторые виртуальные объекты, отражающие реальную среду.

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

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Довольно просто внедрить environmentTexturing в ваш проект AR.

  1. Установите свойство environmentTexturing в вашей конфигурации трекинга на автоматическое (ARKit берет видео с вашей камеры, чтобы автоматически создать текстурукарта. Чем больше вы перемещаете камеру, тем точнее становится карта текстуры. Машинное обучение используется для заполнения пробелов)

    configuration.environmentTexturing = .automatic
    
  2. Окружающая среда Для текстурирования требуются физические материалы, чтобыРабота.Создайте простую блестящую сферу, чтобы проверить отражения

    let sphere = SCNSphere(radius: 0.1)
    sphere.firstMaterial?.diffuse.contents = UIColor.white
    sphere.firstMaterial?.lightingModel = .physicallyBased
    sphere.firstMaterial?.metalness.intensity = 1.0
    sphere.firstMaterial?.roughness.intensity = 0.0
    let sphereNode = SCNNode(geometry: sphere)
    sceneView.scene.rootNode.addChildNode(sphereNode)
    
0 голосов
/ 09 июня 2018

AREnvironmentProbeAnchor (работает в iOS 12 и выше) является якорем для технологии освещения на основе изображений.Шейдер вашей 3D-модели в сцене может отражать свет от ее окружения (конечно, в зависимости от типа поверхности в этом шейдере, поэтому пусть это будет отражающий хром).Принцип прост: 6 квадратных изображений с 6 фотоаппаратов поступают в канал отражения от затенения материала.Эти шесть камер (буровая установка) имеют следующие направления: +x / -x, +y / -y, +z / -z.Эта операция ARKit делает для вас абсолютно бесплатной.Изображение ниже иллюстрирует 6 направлений установки:

enter image description here

Плоскости zFar соседних камер выглядят как Cubeне так ли?

И шесть камер имеют объем этой Cube.

enter image description here

Патчи текстуры будутбыть доступным в определенных местах, где ваша камера сканирует поверхность.Или вы можете использовать усовершенствованные алгоритмы машинного обучения (это более надежно и проще для пользователя), чтобы покрыть куб с полными 360-градусными текстурами.

AREnvironmentProbeAnchor служит для позиционирования этой фото-установки в определенную точку сцены.Вам необходимо включить генерацию карты текстур для сеанса AR.Для этого есть два варианта:

ARWorldTrackingConfiguration.EnvironmentTexturing.manual 

При текстурировании среды manual вы определяете точки на сцене, для которых вы хотите карты текстур светового зонда, создавая AREnvironmentProbeAnchor объекты и добавляя их в сеанс.

ARWorldTrackingConfiguration.EnvironmentTexturing.automatic 

При текстурировании среды automatic ARKit автоматически создает, размещает и добавляет объекты AREnvironmentProbeAnchor в сеанс.

В обоих случаях ARKit автоматически генерирует текстуры среды какСессия собирает снимки камеры.Используйте метод делегата, такой как session(_:didUpdate:), чтобы узнать, когда текстура доступна, и получите доступ к ней из свойства environmentTexture якоря.

Если вы отображаете AR-содержимое с помощью ARSCNView и опции automaticallyUpdatesLighting, SceneKitавтоматически извлекает AREnvironmentProbeAnchor текстурные карты и использует их для освещения сцены.

Вот как должен выглядеть ваш код в ViewController.swift:

sceneView.automaticallyUpdatesLighting = true

let torusNode = SCNNode(geometry: SCNTorus(ringRadius: 2, pipeRadius: 1.5))
sceneView.scene.rootNode.addChildNode(torusNode)

let reflectiveMaterial = SCNMaterial()
reflectiveMaterial.lightingModel = .physicallyBased
reflectiveMaterial.metalness.contents = 1.0
reflectiveMaterial.roughness.contents = 0
reflectiveMaterial.diffuse.contents = UIImage(named: "brushedMetal.png")
torusNode.geometry?.firstMaterial = [reflectiveMaterial]

let configuration = ARWorldTrackingConfiguration()
if #available(iOS 12.0, *) {
    configuration.environmentTexturing = .automatic      // WHERE A MAGIC HAPPENS
}
sceneView.session.run(configuration)

func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
    print(anchors)
}

Вот и все.Надеюсь, это поможет.

PS Любая камера в 3D может действовать не только как фото / видеокамера, но и как проектор (для проецирования текстур на объекты).

...