ARKit от начального до профессионального (1) -- display Cube (реализация нативного метода)

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


Предпосылки

1. В этой части руководства используется нативная разработка для iOS, в настоящее время не используется Unity и в основном используется SceneKit.

2. Используемая версия программного обеспечения: Xcode 9.

3. Используемая версия языка разработки: Swift 4.

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

Шаг 1: Создайте проект

Откройте Xcode и нажмитеФайл > Создать > Проект…, выберите приложение Single View, нажмите «Далее», чтобы создать проект, назовите егоARKitDemo. Операция показана на следующем рисунке:


Настройка представлений SceneKit

Откройте Main.storyboard, перетащите представление ARKit SceneKit на контроллер представления.


Затем заполните ограничения представления ARKit SceneKit всем контроллером представления.


Шаг 2. Отредактируйте код для реализации открытой камеры.

Подключить IBOutlet

существуетViewController.swiftДобавьте оператор импорта в начало файла, чтобы импортировать ARKit:

import ARKit

Затем, удерживая нажатой клавишу управления, перетащите из представления ARKit SceneKit в файл ViewController.swift. При появлении запроса назовите IBOutlet sceneView. Метод didReceiveMemoryWarning() можно было бы удалить, сейчас он нам не нужен.


Настройка сеанса ARSCNView

Наше AR-приложение наблюдает за миром и окружением через камеру. Итак, далее нам нужно настроить камеру:

Настройте представление ARKit SceneKit. Вставьте следующий код в класс ViewController:

override func viewWillAppear(_ animated: Bool) {    
super.viewWillAppear(animated)    
let configuration = ARWorldTrackingConfiguration()    
sceneView.session.run(configuration)
}

существуетviewWillAppear(_:)метод, мы инициализируемARWorldTrackingConfigurationконфигурация АР. В основном используется для реализации функции World Tracking.

Конфигурация World Tracking отслеживает ориентацию и положение устройства, а также может обнаруживать поверхности реального мира через камеру устройства.

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

Теперь добавьте еще один метод в ViewController:

override func viewWillDisappear(_ animated: Bool) {    
super.viewWillDisappear(animated)    
sceneView.session.pause()
}

Основная обработка в методе viewWillDisappear(_:): остановка отслеживания и изображение содержимого представления.

Авторизация камеры

Прежде чем мы сможем запустить приложение, нам нужно сообщить пользователю, что мы будем реализовывать дополненную реальность с помощью камеры его устройства. Это было требованием с момента выпуска iOS 10.

Откройте Info.plist. Щелкните правой кнопкой мыши пустое место и выберите Добавить строку. Установите ключ инструкции камеры конфиденциальности. Значение может быть установлено на дополненную реальность. Как показано ниже:


Далее мы заранее проверяем, может ли камера вызываться плавно. Подключите тестовый телефон к Mac. Соберите и запустите проект в Xcode. Приложение должно предложить вам разрешить вход камеры. Как показано ниже:


Шаг 3: Добавьте 3D-объекты

Вставьте следующий код в свой класс ViewController:

func addBox() {
    let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
    
    let boxNode = SCNNode()
    boxNode.geometry = box
    boxNode.position = SCNVector3(0, 0, -0.2)
    
    let scene = SCNScene()
    scene.rootNode.addChildNode(boxNode)
    sceneView.scene = scene
}

  • Создайте ящик, 1 поплавок = 1 метр.

  • Создайте узел. Узел представляет положение и координаты объекта в трехмерном пространстве. Сам узел не имеет видимого содержимого.

  • Задайте форму (Box) для узла.

  • Задайте положение коробки. Это положение относительно камеры, X положительное справа, а X отрицательное слева. Верх означает, что Y положителен, вниз означает, что Y отрицателен. Назад означает положительное значение Z, вперед означает отрицательное значение Z.

  • Создайте сцену (сцена SceneKit) и добавьте в сцену коробку.

  • будетsceneViewСцена настроена на отображение только что созданной сцены.

override func viewDidLoad() {
    super.viewDidLoad()
    addBox()
}

Next Build, открываем камеру, появляется белое поле, эффект следующий:


addBox()Метод также можно записать так:

func addBox() {
    let box = SCNBox(width: 0.05, height: 0.05, length: 0.05, chamferRadius: 0)
    
    let boxNode = SCNNode()
    boxNode.geometry = box
    boxNode.position = SCNVector3(0, 0, -0.2)
    
    sceneView.scene.rootNode.addChildNode(boxNode)
}

Шаг 4: Добавьте жест (нажмите, чтобы удалить 3D-объект)

Вставьте следующий метод в файл ViewController.swift:

@objc func didTap(withGestureRecognizer recognizer: UIGestureRecognizer) {
    let tapLocation = recognizer.location(in: sceneView)
    let hitTestResults = sceneView.hitTest(tapLocation)
    guard let node = hitTestResults.first?.node else { return }
    node.removeFromParentNode()
}

Создан метод didTap (с распознаванием жестов:). Получите позицию щелчка пользователя относительно sceneView, а затем проверьте, были ли нажаты какие-либо узлы. Затем найдите первый узел из hitTestResults. Если результат содержит хотя бы один узел, мы удаляем первый узел из его родителя.

Перед проверкой удаления объекта обновите метод viewDidLoad(), чтобы добавить вызов метода addTapGestureToSceneView():

override func viewDidLoad() {
    super.viewDidLoad()
    
    addBox()
    addTapGestureToSceneView()
}

Шаг 5: Добавьте несколько 3D-объектов

Создайте расширение в конце класса ViewController:

extension float4x4 {
    var translation: float3 {
        let translation = self.columns.3
        return float3(translation.x, translation.y, translation.z)
    }
}

расширение преобразует матрицу в float3. Измените метод addBox():

func addBox(x: Float = 0, y: Float = 0, z: Float = -0.2) {
    let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
    
    let boxNode = SCNNode()
    boxNode.geometry = box
    boxNode.position = SCNVector3(x, y, z)
    
    sceneView.scene.rootNode.addChildNode(boxNode)
}

Измените метод didTap (используя распознаватель жестов:) внутри оператора guard let и перед оператором return. Добавьте следующий код:

let hitTestResultsWithFeaturePoints = sceneView.hitTest(tapLocation, types: .featurePoint)
 
if let hitTestResultWithFeaturePoints = hitTestResultsWithFeaturePoints.first {
    let translation = hitTestResultWithFeaturePoints.worldTransform.translation
    addBox(x: translation.x, y: translation.y, z: translation.z)
}

Следующая реализация использует x, y и z для добавления нового поля при обнаружении щелчка. Код метода didTap(withGestureRecognizer:) выглядит следующим образом:

@objc func didTap(withGestureRecognizer recognizer: UIGestureRecognizer) {
    let tapLocation = recognizer.location(in: sceneView)
    let hitTestResults = sceneView.hitTest(tapLocation)
    guard let node = hitTestResults.first?.node else {
        let hitTestResultsWithFeaturePoints = sceneView.hitTest(tapLocation, types: .featurePoint)
        if let hitTestResultWithFeaturePoints = hitTestResultsWithFeaturePoints.first {
            let translation = hitTestResultWithFeaturePoints.worldTransform.translation
            addBox(x: translation.x, y: translation.y, z: translation.z)
        }
        return
    }
    node.removeFromParentNode()
}

Эффект операции следующий:


Ссылка на ссылку: https://www.appcoda.com/arkit-introduction-scenekit/


------ Аранжировано AR Portal (сообщество разработчиков дополненной реальности)

Следите за официальной учетной записью WeChat (сообщество обмена разработчиками дополненной реальности, предоставление сухих товаров для разработки дополненной реальности, продвижение разработки контента дополненной реальности): сообщество разработчиков дополненной реальности