Этот материал RealityKit плохо продуман или мне что-то не хватает? - PullRequest
2 голосов
/ 05 августа 2020

Я пытаюсь поиграть с дополненной реальностью с помощью Reality Kit.

Я хочу, чтобы моя программа выполняла одно из следующих действий, выбирается пользователем :

  1. Обнаруживать только горизонтальные поверхности.
  2. Обнаруживать только вертикальные поверхности.
  3. Обнаруживать как горизонтальные, так и вертикальные поверхности.
  4. Обнаруживать изображения, как будто я печатаю цель, прикрепите к объекту в реальном мире, и приложение его обнаруживает.

Для этого мне нужно, насколько я понимаю, настроить 3 вещи:

ARWorldTrackingConfiguration

выполнение чего-то вроде

func initSession() {

    let config = ARWorldTrackingConfiguration()
    config.planeDetection = .vertical
  
    arView.session.delegate = self
    arView.session.run(config)
}

Создание сцен внутри Experience.rcproject

Один для нужного мне типа привязки. Я создал три «сцены» со следующими типами привязок: horizontal, vertical и image.

Создайте ARCoachingOverlayView

Чтобы проинструктировать пользователя, как заставить обнаружение работать правильно .

Вот проблемы:

  1. ARWorldTrackingConfiguration имеет только два варианта для planeDetection: horizontal или vertical.

  2. Сцены внутри Experience.rcproject могут быть только трех видов: horizontal, vertical или image.

  3. Опции для ARCoachingOverlayView.goal являются: tracking (это сложно понять без надлежащей документации), horizontalPlane, verticalPlane и anyPlane.

Вопросы:

  1. Как настроить ARWorldTrackingConfiguration и ARCoachingOverlayView.goal, чтобы приложение обнаруживало * только 1070 *, только vertical, horizontal and vertical и images, если у них нет всех этих четырех параметров?

  2. У меня есть 3 сцены внутри Experience.rcproject одна для horizontal, одна для vertical и одна для image обнаружения. Вот как это сделать?

1 Ответ

1 голос
/ 06 августа 2020

Предположим, что мы создали три сцены в реальности Composer с именем BoxScene для обнаружения в горизонтальной плоскости (отслеживание мира), StarScene для обнаружения в вертикальной плоскости ( world tracking) и PrismScene для обнаружения изображений (отслеживание изображений) соответственно. В каждой сцене мы дали имена нашим моделям - из этих имен автоматически создаются c переменные - goldenBox, plasticStar и paintedPrism.

Для переключения с World Tracking config на Image Tracking config в RealityKit мы должны использовать определенные инициализаторы AnchorEntity, написанные внутри кнопок @IBActions - .image и .plane.

Посмотрите на следующий код, чтобы узнать, как делать то, что вы хотите.

import RealityKit
import UIKit

class ViewController: UIViewController {

    @IBOutlet var arView: ARView!
    
    let cubeScene = try! Experience.loadBoxScene()
    let starScene = try! Experience.loadStarScene()
    let prismScene = try! Experience.loadPrismScene()



    // IMAGE TRACKING
    @IBAction func image(_ button: UIButton) {
        
        arView.scene.anchors.removeAll()
        
        let anchor = AnchorEntity(.image(group: "AR Resources", 
                                          name: "image"))
        
        let prism = prismScene.paintedPrism!
        anchor.addChild(prism)
        arView.scene.anchors.append(anchor)
    }

    
    // WORLD TRACKING
    @IBAction func verticalAndHorizontal(_ button: UIButton) {
        
        arView.scene.anchors.removeAll()
        
        let trackingAnchor = AnchorEntity(.plane([.vertical, .horizontal],
                                  classification: .any,
                                   minimumBounds: [0.1, 0.1]))
         
        let cube = cubeScene.goldenBox!
        let star = starScene.plasticStar!
        
        if trackingAnchor.anchor?.anchoring.target == .some(.plane([.vertical, 
                                                                    .horizontal], 
                                                    classification: .any, 
                                                     minimumBounds: [0.1, 0.1])) {
            
            let anchor1 = AnchorEntity(.plane(.horizontal,
                              classification: .any,
                               minimumBounds: [0.1, 0.1]))
            
            anchor1.addChild(cube)
            arView.scene.anchors.append(anchor1)
        }
        
        if trackingAnchor.anchor?.anchoring.target == .some(.plane([.vertical, 
                                                                    .horizontal], 
                                                    classification: .any, 
                                                     minimumBounds: [0.1, 0.1])) {
            
            let anchor2 = AnchorEntity(.plane(.vertical,
                              classification: .any,
                               minimumBounds: [0.1, 0.1]))


            anchor2.addChild(star)
            arView.scene.anchors.append(anchor2)
        }           
    }
}

PS

Компьютера с собой пока нет, написал на iPhone. Так что я не знаю, есть ли в этом коде ошибки ...

...