这是 RealityKit 的东西构思不佳还是我遗漏了什么?

Is this RealityKit stuff poorly conceived or am I missing something?

我正在尝试使用 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

一个适合我需要的锚定类型。我创建了三个具有以下锚点类型的“场景”:horizontalverticalimage.

创建 ARCoachingOverlayView

指导用户使检测正常工作。

这些是问题:

  1. ARWorldTrackingConfiguration对于planeDetection只有两个选项:horizontalvertical.

  2. Experience.rcproject里面的场景,只能是3种:horizontalverticalimage.

  3. ARCoachingOverlayView.goal 的选项是:tracking(如果没有适当的文档很难弄清楚)、horizontalPlaneverticalPlaneanyPlane.

问题:

  1. 如何配置 ARWorldTrackingConfigurationARCoachingOverlayView.goal 以使应用仅检测 horizontal、仅检测 verticalhorizontal and verticalimages 如果他们没有这四个选项?

  2. 我在Experience.rcproject里面有3个场景,一个用于horizontal,一个用于vertical,一个用于image检测。那是怎么做到的?

假设我们在 Reality Composer 中创建了三个名为 BoxScene 的场景,用于水平面检测(世界跟踪),StarScene 分别用于垂直平面检测(世界跟踪)和 PrismScene 分别用于图像检测(图像跟踪)。在每个场景中,我们都为我们的模型命名——这些名称会自动生成变量——goldenBoxplasticStarpaintedPrism.

要在 RealityKit 中从 World Tracking 配置切换到 Image Tracking 配置,我们必须使用在按钮的 @IBActions 中编写的明确的 AnchorEntity 初始化程序 – .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)
        }           
    }
}

P。 S.

目前我没有电脑,我已经在iPhone上写了。所以不知道这段代码有没有错误...