Предпосылки
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 (сообщество обмена разработчиками дополненной реальности, предоставление сухих товаров для разработки дополненной реальности, продвижение разработки контента дополненной реальности): сообщество разработчиков дополненной реальности