4

我正在尝试使用 Reality Kit 玩增强现实。

我想让我的程序执行以下操作之一,用户可选择

  1. 仅检测水平表面。
  2. 仅检测垂直表面。
  3. 检测水平和垂直表面。
  4. 检测图像,例如打印目标,附加到现实世界中的对象,然后应用程序检测到它。

据我所知,为了做到这一点,我需要调整三件事:

ARWorldTrackingConfiguration

做类似的事情

func initSession() {

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

在 Experience.rcproject 中创建场景

一种用于我需要的锚定类型。我创建了三个具有以下锚类型的“场景” horizontalverticalimage

创建一个 ARCoachingOverlayView

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

这些是问题:

  1. ARWorldTrackingConfigurationplaneDetection:horizontal或.只有两个选项vertical

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

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

问题:

  1. 如何配置ARWorldTrackingConfiguration并使ARCoachingOverlayView.goal应用程序仅检测horizontalvertical仅检测,horizontal and vertical如果images它们没有所有这四个选项?

  2. 我有 3 个场景,一个用于Experience.rcproject,一个用于检测,一个用于检测。那是怎么做的?horizontalverticalimage

4

1 回答 1

2

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

要在 RealityKit 中从World Tracking配置切换到Image Tracking配置,我们必须使用明确的 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)
        }           
    }
}

附言

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

于 2020-08-06T11:29:20.443 回答