使用RealityKit和ARKit的挑战

5

我想在ARKit中构建一个演示应用程序,关于beta版本(苹果一直称其为RealityKit或ARKit 3.0),我有一些问题。


我尝试构建的演示应用程序应该执行以下操作:

  1. 识别现实环境中的对象或图像,并在那里创建锚点

  2. 呈现附加到锚点的虚拟模型

  3. 使用遮挡呈现虚拟模型

  4. 使虚拟模型沿着锚定的图像/对象移动


我尝试从早期版本进行调整 (ARKit 2.0 借助 SceneKit),但是某些功能比如人物遮挡不包括在 ARKit 2.0 中。

随着苹果在beta版本上的迭代,许多在其网站和 WWDC 2019 上宣传的功能似乎已经从 RealityKit 的文档中消失(例如:人物遮挡、身体跟踪、世界跟踪)。

据我所知,项目(1)和(2)可以在 ARKit 2.0 中实现。项目(3)被宣传为与beta版本可能实现,但我几乎没有看到相关的文档记录。

最新beta版本是否可以做到这一点?如果可以,最佳方法是什么? 如果不行,是否有任何解决办法,例如混合旧API和新API之类的?

1个回答

6
所有你提到的挑战,在ARKit/SceneKitARKit/RealityKit中都可以实现。

选择配置

  1. 在真实环境中识别一个物体或图像,并在那里创建锚点。

你可以使用以下ARKit配置来识别3D对象图像

let configuration = ARWorldTrackingConfiguration()

guard let obj = ARReferenceObject.referenceObjects(inGroupNamed: "Resources", 
                                                         bundle: nil) 
else { return }

configuration.detectionObjects = obj     // Allows you create ARObjectAnchor
sceneView.session.run(configuration)

对比

let config = ARWorldTrackingConfiguration()

guard let img = ARReferenceImage.referenceImages(inGroupNamed: "Resources", 
                                                       bundle: nil) 
else { return }

config.detectionImages = img             // Allows you create ARImageAnchor
config.maximumNumberOfTrackedImages = 3
sceneView.session.run(config)

然而,如果你想在RealityKit中实现类似的行为,请使用以下代码:

let objectAnchor = AnchorEntity(.object(group: "Resources", name: "object"))

或者

let imageAnchor = AnchorEntity(.image(group: "Resources", name: "model"))

渲染引擎

  1. 渲染与锚点相连的虚拟模型。

目前,ARKit有四个伙伴帮助您渲染3D和2D图形:

  • RealityKit(三维引擎)
  • SceneKit(三维引擎)
  • Metal(三维引擎)
  • SpriteKit(二维引擎)

材质

  1. 使用遮挡功能展示虚拟模型。

在RealityKit模块中,所有材质都是符合Material协议的结构。目前有6种类型的材质。您需要使用OcclusionMaterial

  • OcclusionMaterial(一种隐藏在其后渲染的对象的不可见材质)
  • SimpleMaterial(可应用于网格的基本材质)
  • UnlitMaterial(简单材质,不响应场景中的灯光)
  • VideoMaterial(使用AVPlayer播放视频的材质)
  • PhysicallyBasedMaterial(模拟真实物体外观的材质)
  • CustomMaterial(名称自说明的材质)

查看此文章了解如何在RealityKit中以编程方式分配材质。

此文章向您展示如何在SceneKit中分配自定义遮挡材质。

更新3D内容

  1. 让虚拟模型随图像/物体锚点移动。

要在 ARKit+SceneKit 中实现此类行为,您需要使用 renderer(_:didAdd:for:)session(_:didAdd:) 方法。在 RealityKit 中,AnchorEntities 会自动跟踪。

以下是在 renderer(_:didAdd:for:) 实例方法中使用 ARObjectAnchor 的示例:

extension ViewController: ARSCNViewDelegate {
    
    func renderer(_ renderer: SCNSceneRenderer,
                 didAdd node: SCNNode,
                  for anchor: ARAnchor) {
                
        if let _ = anchor as? ARObjectAnchor {                
            let text = SCNText(string: "ARKit", extrusionDepth: 0.5)
            let textNode = SCNNode(geometry: text)
            node.addChildNode(textNode)
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接