Очевидно, что главная тема этого WWDC — AR/VR. На самом деле, причина, по которой я смотрю этот WWDC, в том, что я думаю о приложении с функциями дополненной реальности.

RoomPlan использует ARKit, который использует сложные алгоритмы машинного обучения для распознавания стен, окон, дверей, пустых пространств и объектов. API RoomCaptureView позволяет вам испытать опыт сканирования комнаты непосредственно через приложение. Результат можно подтвердить в виде 3D-модели или извлечь в виде файла USDZ.

Эта презентация охватывает четыре пункта.

  • Поддержка пользовательской ARSession
  • Поддержка MultiRoom (объединение нескольких комнат в одно пространство)
  • Доступность (голос за кадром)
  • Представления RoomPlan
  • Расширенная функция экспорта

осторожность! : Вышеупомянутые API-интерфейсы применяются как минимум с iOS 16. А улучшенные функции RoomPlan будут применяться с iOS 17.

Поддержка пользовательской ARSession

Первоначально использовалась только данная ARSession, но теперь можно создать и использовать ARSession с помощью ARWorldTrackingConfiguration.

/// Create previous RoomCaptureSession
public class RoomCaptureSession {
    public init() {
       ...
    }

    public func stop() {
       ...
    }
}
/// Create a new RoomCaptureSession
public class RoomCaptureSession {
    // Init: ARSession is an optional input for RoomCaptureSession
    public init(arSession: ARSession? = nil) {
       ...
  }

    // Stop: pauseARSession is used for whether to continue ARSession experience
    public func stop(pauseARSession: Bool = true) {
       ...
  }
}

Добавляйте фото и видео в сканирование RoomPlan

Поддержка мультирум

Допустим, вы просканировали гостиную, мою комнату и кухню. Что мне нужно учитывать, чтобы собрать это вместе?

Во-первых, все результаты сканирования имеют соответствующие координатные плоскости. Поскольку не все они сканируются в одном и том же пространстве, нельзя сказать, что они находятся в одной координатной плоскости. Если вы проигнорируете это и просто присоедините комнаты друг к другу на основе стены, объекты будут дублироваться.

Поэтому приходится объединять несколько одинаковых результатов сканирования в одну систему координат. Для этого Apple предлагает два метода.

  1. Сканирование с использованием той же ARSession.
  2. Используйте релокализацию ARSession.

Использовать непрерывную ARS-сессию

Когда исходный сеанс RoomCaptureSession завершился, сеанс ARS также остановился. Однако из-за изменения функции остановки, показанной выше, один и тот же сеанс ARS может использоваться повторно.

stop()На основании , сеанс ARS останавливается.

stop(pauseARSession: false)заставляет ARSession сохраняться. Он будет использовать ту же систему координат.

// Continuous ARSession

// start 1st scan
roomCaptureSession.run(configuration: captureSessionConfig)

// stop 1st scan with continuing ARSession
roomCaptureSession.stop(pauseARSession: false)

// start 2nd scan
roomCaptureSession.run(configuration: captureSessionConfig)

// stop 2nd scan(pauseARSession = true by default)
roomCaptureSession.stop()

Релокализация сеанса ARS

Вышеупомянутый метод можно использовать для повторения нескольких сканирований одновременно, но релокализацию можно использовать, если вы хотите снимать в другое время (завтра или на следующей неделе и т. д.).

Во-первых, нам нужно сохранить ARWorldMap, когда ARSession остановится.

Когда сканирование повторяется в следующий раз, новое сканирование можно запустить, вызвав ARWorldMap, хранящуюся в остановленной ARSession.

В приведенном ниже коде показан процесс сохранения ARWorldMap после выполнения начального сканирования. Для справки: поскольку ARWorldMap является NSObject, его можно сохранить как NSData с помощью NSKeyedArchiver.

// Capture with saving ARWorldMap

// start 1st scan
roomCaptureSession.run(configuration: captureSessionConfig)

// stop 1st scan (pauseARSession = true by default)
roomCaptureSession.stop()

// save ARWorldMap
roomCaptureSession.arSession.getCurrentWorldMap(completionHandler:{worldMap, error in ...})

А в приведенном ниже коде показан процесс загрузки сохраненной ARWorldMap и ее повторного сканирования.

// Capture with loading ARWorldMap

// load ARWorldMap
let arWorldMap = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, from: data)

// run ARKit relocalization
let arWorldTrackingConfig = ARWorldTrackingConfiguration()
arWorldTrackingConfig.initialWorldMap=arWorldMap
roomCaptureSession.init()
roomCaptureSession.arSession.ru(arWorldTrackingConfig, options: [])

// Wait for relocalization to complete
// start 2nd scan
roomCaptureSession.run(configuration: captureSessionConfig)
// stop 2nd scan
roomCaptureSession.stop ()

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

Мультирум API

Если вы просканировали несколько комнат, используя два вышеуказанных метода, вам необходимо объединить их в одну. Каждое сканирование может получить объект CapturedRoom с помощью API RoomBuilder.

И что делать? Объедините объекты CapturedRoom в один с помощью StructureBuilder. Объединенные пространственные данные становятся объектом CapturedStructure.

Пример кода с использованием API StructureBuilder показан ниже.

// StructureBuilder

// create structureBuilder instance
let structureBuilder = StructureBuilder (option: [.beautifyObjects])

// load multiple capturedRoom results to capturedRoomArray
var capturedRoomArray: [CapturedRoom] = []

// run structureBuilder API to get capturedStructure
let capturedStructure = try await structureBuilder.capturedStructure(from: capturedRoomArray)

// export capturedStructure to usdz
try capturedStructure.export (to: destinationURL)

Давайте кратко укажем здесь разницу между CapturedRoom и CapturedStructure.

  • CapturedRoom = Результат сканирования одной комнаты.
  • CapturedStructure = Это структура, объединяющая несколько CapturedRooms в одну.

Что касается MultiRoom API, мы планируем предоставить образец приложения. Я пытался найти официальную документацию, но пока не могу найти страницу.

Файл USDZ — это формат файла, который можно просматривать непосредственно на iOS и macOS. Файлы USDZ также можно запускать в инструментах для создания цифрового контента, таких как Blender.

Соображения

Учитывая пространство, доступное для MultiRoom, также были предоставлены наиболее подходящие варианты.

  1. Одноэтажный жилой дом с 4 кроватями, гостиной, кухней и обеденной зоной.
  2. Площадь всех объединяемых помещений составляет 2000 кв. футов или 186 кв. м.
  3. Добыча более 50 люкс

Доступность

Голосовая обратная связь с помощью VoiceOver предназначена для тех, у кого проблемы со зрением в приложениях, использующих API-интерфейсы RoomPlan.

В демонстрационном видео человек, у которого, казалось, не было никаких эмоций, прочитал «Наведите камеру на нижний край стены», «Камин», «Стена», «Окно», когда узнал их.

Представления RoomPlan

До сих пор результаты сканирования RoomPlan охватывали только ограниченное количество объектов. На этот раз говорят, что RoomPlan может сканировать наклонные стены, круглые стены и вогнутые пространства, такие как духовки.

Он также предоставляет более подробные результаты для предметов, которые можно сканировать, и в качестве примера был приведен диван. Это по-новому собрать одноместные диваны, Г-образные диваны и прямые диваны.

Причина, по которой это возможно, заключается в том, что количество типов данных, собираемых при сканировании, увеличилось. Большинство категорий, которые CapturedRoom может сканировать, как упоминалось выше, выражаются в виде внутренних структур, называемых Surface и Object.

Вот некоторые дополнительные данные.

  • Раздел = представляет пространство внутри комнаты.
  • Поверхность -> Многоугольник = Теперь стены можно выразить с помощью многоугольника, который не является правильной формой. (изогнутые стены, стены с прикрепленными балками и т. д.)
  • Это одна из категорий, которая может быть выражена как Поверхность -> Категория -> Пол = Полигон.
  • Объект -> Атрибут = Добавлено для более точного сканирования объекта.

Кроме того, к Поверхностям и Объектам добавлен Родитель, который ссылается на их родителя (например, родителем окна является стена, родителем стула является стол).

Давайте внимательнее посмотрим на код.

Как видите, все пространства разделены, и к каждому разделу прикреплена одна метка. Гостиная, Столовая и Неопределенное — это одно пространство, но они разделены на Секции.

public struct CapturedStructure: Codable, Sendable {
 public struct Section: Codable, Sendable {
  public enum Label: String, Codable, Sendable {
   case livingRoom
   case bedroom 
            case bathroom 
            case kitchen 
            case diningRoom 
            case unidentified
  }
  
        public var label: Label { get }
  
        // The center position of the section
  public var center: simd_float3 { get }
  
  // Indicator for which story, level, or floor
  public var story: Int { get }
 }
}

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

// Floors for Surfaces in CapturedRoom

public struct CapturedRoom: Codable, Sendable {

 // A 2D area in a room identified as a surface
 public struct Surface: Codable, Sendable {
 
  // A 2D polygon to represent walls and floors
  // in local plan coordinates
  public var polygonCorners: [sim_float3] { get }

  // classifications of a surface in a captured room
  public enum Category: Codable, Sendable {
   case floor
  }
 }
}

Многоугольник с использованием стены

Многоугольник с использованием пола

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

// Parent identifiers for surfaces and objects in CapturedRoom
public struct CapturedRoom: Codable, Sendable {
 // A 2D area in a room identified as a surface
 public struct Surface: Codable, Sendable {

  // A unique UUID to indicate surface's parent
        public var parentIdentifier: UUID? { get }
 }

 // A 3D area in a room identified as an obiect
 public struct Object: Codable, Sendable {

  // A unique UUID to indicate object's parent
  public var parentIdentifier: UUID? { get }
 }
}

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

Расширенная функция экспорта

При экспорте возникла необходимость отразить вышеуказанные дополнения.

Недавно добавленный метод — это метод сопоставления каждого объекта с использованием строкового значения UUID.

Раньше при экспорте CapturedRoom предоставлялись только файлы USDZ, а также могли предоставляться файлы JSON, но теперь можно получить файл, содержащий информацию о сопоставлении, в файлах USDZ.

Эта информация о сопоставлении полезна. Поскольку каждый элемент сопоставляется с объектом, измените его на URL-адрес модели, который воплощает объект, через поставщика модели, добавленного на этот раз.

Подробную информацию о сканировании можно получить с помощью информации о сопоставлении файла USDZ для всего пространства, а не только для одного объекта выше.

Каталог 3D-моделей можно создать с использованием этих URL-адресов модели.

Прежде всего, создайте файловую структуру, используя категорию и атрибут модели.

Теперь создайте файл index. Ниже представлена ​​структура индексного файла (RoomPlanCatalogCategoryAttribute). Он включает Категорию и Атрибут, а также показано название модели ниже.

Создайте каталог для хранения моделей.

Создайте поставщика модели, используя созданный каталог.

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

Я это почувствовал

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

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

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

Ссылка



От Ганеша | ЛинкедИн | Средний | Гитхаб