swift RealityKit和ARKit面临的挑战

9lowa7mx  于 2022-12-28  发布在  Swift
关注(0)|答案(1)|浏览(151)

我想在ARKit中构建一个演示应用程序,我对目前的测试版有一些疑问(苹果一直称之为RealityKit,或ARKit 3.0)。
我尝试构建的演示应用应执行以下操作:
1.识别真实的环境中的对象或图像,并在那里创建锚
1.渲染附接到所述锚的虚拟模型
1.使虚拟模型具有遮挡
1.使虚拟模型与锚图像/对象沿着移动
我尝试过从早期版本(利用SceneKit的ARKit 2.0)改编一些代码,但某些功能,如人物遮挡,不是ARKit 2.0的一部分。
由于苹果一直在迭代他们的测试版,他们网站上和WWDC 2019上宣传的许多功能似乎已经从RealityKit的文档中消失了(人物遮挡、身体跟踪、世界跟踪)。
据我所知,第(1)项和第(2)项在ARKit 2.0中是可能的。第(3)项在beta版中被宣传为可能的,但我几乎没有看到任何文档。
在最新的测试版中有可能做到这一点吗?如果有,最好的方法是什么?如果没有,有没有像混合旧的和新的API之类的变通方法?

093gszye

093gszye1#

您提到的所有挑战都可以在ARKit/SceneKitARKit/RealityKit中解决。

选择配置

1.确定真实的环境中的对象或图像,并在那里创建锚。
您可以使用ARKit中的以下配置识别3D objectsImages

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(3D引擎)
  • 场景套件(3D引擎)
  • 金属(3D引擎)
  • SpriteKit(2D引擎)

材料
1.使虚拟模型显示为遮挡。
RealityKit模块中所有的物料都是符合Material协议的结构,目前有6种物料,需要OcclusionMaterial

*OcclusionMaterial(隐藏在其后面渲染的对象的不可见材质)
*简单材质(可应用于网格的基本材质)
*UnlitMaterial(不响应场景中灯光的简单材质)
*VideoMaterial(允许您使用AVPlayer播放视频的素材)
*PhysicallyBasedMaterial(模拟真实世界对象外观的材质)
*自定义物料(名称为自描述的物料)
查看THIS POST,了解如何在RealityKit中以编程方式指定材质
本文将向您展示如何在SceneKit中指定自定义遮挡材质

更新3D内容

1.使虚拟模型与图像/对象锚沿着移动。
要在ARKit + SceneKit中实现这种类型的行为,您必须使用renderer(_:didAdd:for:)session(_:didAdd:)方法。
以下是在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)
        }
    }
}

相关问题