Swift RealityKit和ARKit–;应用程序启动时AR project在寻找什么?

Swift RealityKit和ARKit–;应用程序启动时AR project在寻找什么?,swift,augmented-reality,arkit,realitykit,arcamera,Swift,Augmented Reality,Arkit,Realitykit,Arcamera,如果您打开Xcode,创建一个新的增强现实项目并运行该项目,您将更好地理解这个问题 项目开始在设备上运行后,您将看到后摄像头拍摄房间的图像 3或4秒后,将出现一个立方体 我的问题是: 在立方体出现之前,应用程序在做什么?我的意思是,我想应用程序正在寻找场景中的跟踪点,这样它就可以锚定立方体,对吗 如果这是真的,那么应用程序需要哪些元素 假设我对立方体出现的点不满意。是否有任何功能可以通过点击屏幕触发,以便跟踪可以在屏幕上点击的位置附近再次搜索新点 我知道我的问题是一般性的,所以请给我正确的方向。

如果您打开Xcode,创建一个新的增强现实项目并运行该项目,您将更好地理解这个问题

项目开始在设备上运行后,您将看到后摄像头拍摄房间的图像

3或4秒后,将出现一个立方体

我的问题是:

  • 在立方体出现之前,应用程序在做什么?我的意思是,我想应用程序正在寻找场景中的跟踪点,这样它就可以锚定立方体,对吗

  • 如果这是真的,那么应用程序需要哪些元素

  • 假设我对立方体出现的点不满意。是否有任何功能可以通过点击屏幕触发,以便跟踪可以在屏幕上点击的位置附近再次搜索新点

  • 我知道我的问题是一般性的,所以请给我正确的方向。

    ARKit和RealityKit阶段 启动AR应用程序时,ARKit和RealityKit分为三个阶段:

    • 追踪
    • 场景理解
    • 渲染
    每个阶段可能会显著增加放置模型所需的时间(+1…+4秒,具体取决于设备)。让我们谈谈每个阶段

    追踪 这是AR应用程序的初始状态。在这里,iPhone以60 fps的速度混合来自RGB后置摄像头的视觉数据,并以1000 fps的速度转换来自IMU传感器(加速计、陀螺仪和指南针)的数据。自动生成的特征点有助于ARKit和RealityKit跟踪周围环境并构建跟踪地图(无论是世界跟踪还是面部跟踪)。在光线充足的环境中,在真实世界对象和纹理的高收缩边缘上自发生成特征点。如果之前已保存世界地图,则可以缩短模型放置到场景中的时间。此外,您还可以使用
    ArcoachingGoverLayView
    获取有用的可视说明,在会话初始化和恢复期间为您提供指导

    场景理解 第二阶段可以包括水平和垂直平面检测、光线投射(或命中测试)和光线估计。如果您已激活平面检测功能,则需要一些时间来检测具有相应(或
    锚定实体(.Plane)
    )的平面,在您的情况下,该锚定实体必须系紧虚拟模型-立方体。还有一个高级场景理解,允许您使用场景重建功能。您可以在gadgets中使用场景重建和激光雷达扫描仪,它为您提供了改进的深度通道,用于合成场景中的元素和人物遮挡。您可以始终启用图像/对象检测功能,但您必须考虑它是建立在机器学习算法上的,它增加了模型在场景中的放置时间。 翻译 最后一个阶段用于渲染场景中的虚拟几何体。场景可以包含具有着色器和纹理的模型、变换或资源动画、动力学和声音。金属着色器的周围HDR反射由神经模块计算。ARKit无法渲染AR场景。对于3d渲染,您必须使用RealityKit、SceneKit或Metal等框架。这些框架有自己的渲染引擎

    默认情况下,在RealityKit中,有高质量的渲染效果,如运动模糊或光线跟踪阴影,需要额外的计算能力。考虑到这一点

    提示 要显著缩短在AR场景中放置对象的时间,请使用工作速度为纳秒的激光雷达扫描仪。若你们的小工具并没有激光雷达,那个么你们只能跟踪周围的环境,那个里的光线条件很好,所有真实世界的物体都清晰可辨,它们上面的纹理丰富,并没有重复的图案。另外,在项目中尽量不要使用多边形几何体,多边形数超过10K+且纹理分辨率高(
    jpeg
    png
    ,大小为1024x1024,视为正常)

    此外,RealityKit 1.0默认情况下启用了多个
    选项–
    深度通道合成
    运动模糊
    光线跟踪接触阴影
    (在A11和更早版本上有投影阴影)。如果您不需要所有这些功能,只需禁用它们。之后,你的应用程序会更快


    实际解决方案一 (禁用阴影、运动模糊、深度补偿等) 使用以下属性禁用处理器密集型效果:

    override func viewDidLoad() {
        super.viewDidLoad()
        
        arView.renderOptions = [.disableDepthOfField,
                                .disableHDR,
                                .disableMotionBlur,
                                .disableFaceOcclusions,
                                .disablePersonOcclusion,
                                .disableGroundingShadows]
        
        let boxAnchor = try! Experience.loadBox()
        arView.scene.anchors.append(boxAnchor)
    }
    

    实际解决办法二 (默认情况下启用阴影、运动模糊、深度补偿等) 在RealityKit中使用以下代码时:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let boxAnchor = try! Experience.loadBox()
        arView.scene.anchors.append(boxAnchor)
    }
    
    通过以下设置,可以获得Reality Composer的预配置场景,其中包含水平面检测属性和
    AnchoreEntity

    AnchorEntity(.plane(.horizontal,
                    classification: .any,
                     minimumBounds: [0.25, 0.25]) 
    
    你遇到的问题是,你的应用程序启动时会出现时间延迟。同时启动世界跟踪(第一阶段),然后应用程序尝试同时检测水平面(第二阶段),然后渲染立方体的金属着色器(第三阶段)。要消除这种时间延迟,请使用这种非常简单的方法(当应用程序启动时,您需要跟踪房间,然后点击屏幕):

    这样可以减少CPU和GPU上的同时负载。因此,您的多维数据集加载速度更快

    附笔。 另外,您也可以使用
    loadmodelsync(名为:in:)
    type方法,该方法允许您从捆绑包中的文件异步加载模型实体:

    static func loadModelAsync(named name: String, 
                                in bundle: Bundle?) -> LoadRequest<ModelEntity>
    
    static func loadmodelsync(名称:String,
    在bundle中:bundle?->LoadRequest
    
    在default Experience.rcproject中,多维数据集的。因此,在ARSession找到场景中的任何水平面(例如地板或桌子)之前,立方体基本上不会显示。在…上
    static func loadModelAsync(named name: String, 
                                in bundle: Bundle?) -> LoadRequest<ModelEntity>