【问题标题】:Is this RealityKit stuff poorly conceived or am I missing something?这个 RealityKit 的东西是构思不好还是我错过了什么?
【发布时间】:2020-11-25 16:26:39
【问题描述】:

我正在尝试使用 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种:horizontalvertical或者image

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

问题:

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

  2. Experience.rcproject 内部有 3 个场景,一个用于horizontal,一个用于vertical,一个用于image 检测。是这样的吗?

【问题讨论】:

  • 我没有使用过它,但似乎.planeDetectionSet .. 这个编译没有任何抱怨,所以它可以回答你的一个问题:config.planeDetection = [.vertical, .horizontal] ...除此之外,我希望您知道您可以通过一次提出一个问题来获得更好的答案。
  • 好的,它是一个集合,它解决了水平,垂直或两者的问题,但是没有图像的选项。
  • 这三个元素也必须有相同的选项......问题是没有关于如何做的解释。
  • 我刚刚抓住了这两个教程:appcoda.com/arkit-image-recognitionappcoda.com/arkit-horizontal-plane ...同时设置 configuration.detectionImages = referenceImagesconfiguration.planeDetection = [.vertical, .horizontal] ...“合并”这两个 renderer 功能...我有一个视图控制器,可以检测水平和垂直平面和图像。显然,根据您的应用目标,还有更多工作要做,但我希望这可能是一个很好的起点(我花了大约 5 分钟)。
  • 这是我在 GitHub 上的分叉仓库的链接:github.com/DonMag/ARKitImageRecognition

标签: swift augmented-reality arkit realitykit reality-composer


【解决方案1】:

假设我们在 Reality Composer 中创建了三个场景,名为 BoxScene 用于水平平面检测(世界跟踪),StarScene 用于垂直平面检测( world tracking) 和 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 上写了。所以不知道这段代码有没有错误...

【讨论】:

  • 抱歉耽搁了,但就在今天,我能够深入测试你的答案,我遇到了几个问题:(1) 像这样的行 cubeScene.goldenBox! 有时会为零并导致应用程序崩溃。这很奇怪。这些行在 10 次中有 8 次没有崩溃,但突然间它们为零。 (漏洞?)。 (2) if 行完全一样?那里出了点问题。 (3) 选择水平后,例如物体没有出现在场景中。 (4) 教练没有从横向转变为纵向。
  • 嗨@Duck。 (1) 是的,这是错误。 (2) 是的,我肯定需要重写if 语句。 (3) 我没有检查它,因为我没有伴奏,对不起((和 (4) 我没有尝试在这样的场景中使用教练视图。
猜你喜欢
  • 2018-01-09
  • 2012-10-24
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 2020-04-09
相关资源
最近更新 更多