Введение в создание опыта дополненной реальности с помощью RealityKit

Дополненная реальность (AR) накладывает цифровой контент на физический мир, создавая интерактивные впечатления, которые сочетают реальность с виртуальными объектами. Рамка Apple RealityKit предоставляет разработчикам высокоуровневый, эффективный API для создания приложений AR для iOS. Эта статья расширяет основы, охватывая настройку, архитектуру компонентов, взаимодействие с пользователем, анимацию, физику, сотрудничество и оптимизацию. К концу у вас будет практическое понимание того, как создавать полированные AR-опыты с использованием Swift и RealityKit.

Начало работы: настройка проекта и требования

Для разработки приложений AR с RealityKit вам понадобится Xcode 13 или более поздний, физическое устройство iOS с чипом A9 или более новым (iPhones SE, 6s и более поздний; iPads 5-го поколения и более поздний), а также учетная запись Apple Developer для тестирования.

Создайте новый проект Xcode и выберите шаблон Augmented Reality App. Выберите SwiftUI или UIKit в зависимости от ваших предпочтений — RealityKit работает бесшовно с обоими. Шаблон обеспечивает и базовую настройку сцены.

Кроме того, вы можете вручную добавить RealityKit в существующий проект, импортируя фреймворк:

import RealityKit
import ARKit

Убедитесь, что NSCameraUsageDescription установлен в вашей — удобная для пользователя строка, объясняющая, почему приложение нуждается в доступе к камере.

Для более подробной информации обратитесь к документации Apple RealityKit и ARKit .

Понимание системы Entity-Component

RealityKit использует архитектуру Entity-Component, которая является фундаментальной для построения сцен. — это контейнер, который содержит компоненты. Компоненты определяют поведение, внешний вид, физику и другие свойства объекта. Например, определяет 3D-сеть, обрабатывает положение/вращения/масштаб, а позволяет имитировать физику.

Этот модульный подход позволяет легко составлять сложные объекты. Вы создаете объекты, прикрепляете компоненты и распоряжаетесь иерархией. Корень сцены - (обычно ), который связывает виртуальный контент с реальным местоположением, обнаруженным ARKit.

Создание якоря и добавление контента

Наиболее распространенным якорем является якорь плоскости, который прикрепляет содержимое к горизонтальным или вертикальным поверхностям. Вот как разместить 3D-модель на любой распознанной плоскости:

// Load a USDZ model
guard let model = try? ModelEntity.load(named: "robot") else { return }

// Create an anchor on any horizontal plane
let anchor = AnchorEntity(plane: .horizontal, classification: .any, minimumBounds: [0.2, 0.2])

// Attach the model to the anchor
anchor.addChild(model)

// Add the anchor to the ARView’s scene
arView.scene.addAnchor(anchor)

Вы также можете создавать якоря на определенных мировых позициях, используя или прикреплять контент к обнаруженным изображениям или лицам, используя или .

Создание базовой AR-сцены с помощью RealityKit

Помимо простого размещения модели, вам нужно управлять жизненным циклом просмотра AR. В приложении UIKit добавьте к контроллеру просмотра:

class ViewController: UIViewController {
 @IBOutlet var arView: ARView!

 override func viewDidLoad() {
 super.viewDidLoad()
 arView.session.delegate = self
 // Configure session
 let config = ARWorldTrackingConfiguration()
 config.planeDetection = [.horizontal, .vertical]
 arView.session.run(config)
 loadContent()
 }

 func loadContent() {
 // Create and add anchors
 }
}

Для SwiftUI вставьте , который соединяет в иерархию SwiftUI.

Взаимодействие с пользователем: жесты и Hit-Testing

Чтобы сделать ваше приложение AR интерактивным, вам нужно обрабатывать пользовательские краны, перетаскивания и вращения. RealityKit обеспечивает тестирование на попадание, чтобы определить, к какой сущности прикоснулся пользователь.

Нажмите, чтобы разместить или взаимодействовать

Добавить . В обработчике жестов позвоните , чтобы получить сущность под пальцем:

arView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))))

@objc func handleTap(_ sender: UITapGestureRecognizer) {
 let location = sender.location(in: arView)
 if let entity = arView.entity(at: location) {
 // Scale the entity
 var transform = entity.transform
 transform.scale *= 1.2
 entity.move(to: transform, relativeTo: entity.parent, duration: 0.3, timingFunction: .easeInOut)
 } else {
 // Place a new object at the tapped location
 placeObject(at: location)
 }
}

func placeObject(at screenPoint: CGPoint) {
 let results = arView.raycast(from: screenPoint, allowing: .estimatedPlane, alignment: .any)
 guard let result = results.first else { return }
 let anchor = AnchorEntity(world: result.worldTransform)
 let box = ModelEntity(mesh: .generateBox(size: 0.1), materials: [SimpleMaterial(color: .blue, isMetallic: false)])
 anchor.addChild(box)
 arView.scene.addAnchor(anchor)
}

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

Драги и вращайтесь жестами

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

let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
arView.addGestureRecognizer(panGesture)

@objc func handlePan(_ sender: UIPanGestureRecognizer) {
 let location = sender.location(in: arView)
 guard let entity = arView.entity(at: location) else { return }
 guard let parent = entity.parent as? HasAnchoring else { return }
 // Translate the entity in the anchor’s local plane
 let translation = sender.translation(in: arView)
 // ... (convert to 3D movement)
}

Для надежной реализации рассмотрите возможность использования из пакета RealityKit или свойства жестов в iOS 16+.

Расширенные возможности: анимации, физика и сотрудничество

Анимация

RealityKit поддерживает как скелетную анимацию (из файлов USDZ), так и анимацию на основе свойств. Чтобы запустить встроенную анимацию на модели с анимационными ресурсами:

guard let model = try? ModelEntity.load(named: "dancing_character") else { return }
model.playAnimation(model.availableAnimations[0].repeat(duration: .infinity), transitionDuration: 0.5, startsPaused: false)

Вы также можете анимировать преобразования, непрозрачность или пользовательские параметры, используя метод , который был замечен ранее. Для сложных последовательностей используйте или .

Физика симуляций

Прикрепите a , чтобы включить гравитацию, столкновения и силы:

let box = ModelEntity(mesh: .generateBox(size: 0.1), materials: [SimpleMaterial(color: .red, isMetallic: false)])
box.position = [0, 0.5, 0] // above a plane

let physicsBody = PhysicsBodyComponent(
 massProperties: .default,
 material: .generate(staticFriction: 0.8, dynamicFriction: 0.5, restitution: 0.3),
 mode: .dynamic
)
box.components.set(physicsBody)

let collision = CollisionComponent(shapes: [.generateBox(size: [0.1, 0.1, 0.1])])
box.components.set(collision)
// Add box to anchor anchor.addChild(box)

Коробка упадет на плоскость и отреагирует на столкновения.Статические объекты (как стены) должны иметь .

Совместные AR-сессии

С помощью совместных сессий ARKit несколько устройств могут совместно использовать один и тот же мир AR. Включите сотрудничество, установив параметры совместной работы сессии:

config.collaborationEnabled = true
arView.session.run(config)

Отправляйте другим сверстникам через сетевую структуру (например, Multipeer Connectivity). Сцена RealityKit каждого устройства остается синхронизированной. Это идеально подходит для многопользовательских игр или общих обзоров дизайна.

Оптимизация производительности для плавного AR-опыта

AR-приложения требуют высокой частоты кадров (60 кадров в секунду), чтобы избежать укачивания.

  • Используйте модели с низкими полигонами и оптимизированные файлы USDZ. Держите вершины на низком уровне и используйте сжатые текстуры (KTX или PNG).
  • Ограничьте количество объектов в сцене. Используйте для отладки подсчетов.
  • Минимизируйте вызовы на рисование , используя инстансинг — разделяйте одну и ту же модель на несколько объектов.
  • Настройка качества рендеринга с на более старых устройствах.
  • Использовать модель загрузки, чтобы предотвратить блокировку основной нити.Загрузить модели в фоновую очередь и представить их, когда они будут готовы.
  • Управляйте жизненным циклом сеанса AR : звоните , когда приложение переходит в фоновый режим, и повторно запускайте конфигурацию на переднем плане.

Для получения подробной информации см. Apple Создание погружения в AR Опыт и Проверка и устранение неполадок в вашем AR Опыт .

Проектирование интуитивных AR-интерфейсов

Пользовательский опыт в AR отличается от традиционных приложений.Следуйте этим принципам:

  • Обратная связь обнаружения поверхности : Визуализируйте обнаруженные плоскости с сеткой или контуром, чтобы пользователи знали, где размещать объекты.
  • Жесты должны чувствовать себя естественными: Используйте прямые манипуляции (нажатие, перетаскивание, щипки), а не абстрактные элементы управления.
  • Предоставьте визуальные подсказки: Выделите интерактивные объекты или покажите перекрестный прицел, когда пользователь указывает на действительную плоскость.
  • Освещение с помощью рукоятки: RealityKit может автоматически оценивать свет реального мира и применять его к виртуальным объектам. Используйте для настройки интенсивности.
  • Испытание в различных средах: Различные освещение, текстуры и размеры помещений влияют на отслеживание AR.

Отладка и тестирование AR-приложений

Тестирование реального устройства не подлежит обсуждению. Используйте функции отладки ARKit Xcode :

  • Позволяет показать точки признаков, происхождение мира и физические каркасы.
  • Используйте журналы, чтобы увидеть, когда поверхности обнаружены.
  • Добавьте для мониторинга состояния отслеживания и ошибок.
  • Тестирование на нескольких поколениях устройств (например, iPhone 8 против iPhone 14 Pro) для измерения производительности.

Для автоматизированного тестирования пользовательского интерфейса можно высмеивать данные AR, но ручное тестирование остается необходимым для точности.

Заключение

RealityKit абстрагирует большую часть сложности разработки AR, но создание отполированного опыта требует внимания к архитектуре сущности, взаимодействию с пользователем, производительности и дизайну. Объединив охватываемые методы - от настройки сцены и обработки жестов до физики и совместной работы - вы можете создавать приложения AR, которые привлекают пользователей и используют весь потенциал аппаратного обеспечения iOS. Оставайтесь в курсе эволюционирующих AR-фреймворков Apple и всегда тестируйте на реальных устройствах, чтобы обеспечить бесшовный, захватывающий опыт.