【问题标题】:Difference between renderer and session methods in ARKitARKit 中渲染器和会话方法的区别
【发布时间】:2020-08-10 16:10:45
【问题描述】:

我检查了以下两个示例代码:https://developer.apple.com/documentation/arkit/capturing_body_motion_in_3d

func session(_ session: ARSession, didUpdate anchors: [ARAnchor])
{  
    for anchor in anchors        
    {            
        guard let bodyAnchor = anchor as? ARBodyAnchor else { continue }
        let skeleton = bodyAnchor.skeleton
    }
}

和:https://developer.apple.com/documentation/arkit/tracking_and_visualizing_faces 

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor)
{
    guard let faceAnchor = anchor as? ARFaceAnchor else { return }
    let blendShapes = faceAnchor.blendShapes    
}

提取人脸 BlendShape 的代码使用“renderer”来获取 BlendShape 的值。

但是,检测身体运动的代码使用“会话”来获取值。

这两个代码似乎都是为了获取从 ARAnchor 更新的值。

“渲染器”和“会话”有什么区别?

如何在不同时间使用这两个代码?

【问题讨论】:

    标签: swift augmented-reality scenekit arkit realitykit


    【解决方案1】:

    renderer(_:didUpdate:for:) session(_:didUpdate:) 实例方法都以 60 fps 的速度更新 AR 内容(相机或模型位置)。它们的工作方式几乎相同,但用途不同。对于五个 renderer() 实例方法,您必须实现对 ARSCNViewDelegate 协议的委托。对于四个 session() 实例方法,您必须实现对 ARSessionDelegate 协议的委托。

    官方文档说:

    ARSCNViewDelegate 的方法提供了 SceneKit 内容与 AR 会话的自动同步。并且 ARSessionDelegate 的方法直接与 ARFrame 对象一起工作。

    主要区别在于:

    • 您可以将renderer(_:didAdd:for:) 方法用于 ARKit-SceneKit “链”,因为它仅适用于 ARSCNView。

    • 您可以将session(_:didUpdate:) 方法用于纯 ARKit 或 ARKit-RealityKit“链”,因为它不仅适用于 ARSCNView (ARKit),也适用于 ARView (ARKit+RealityKit)。

    【讨论】:

    • 我可以同时使用吗?它会导致任何线程问题吗?
    • 哪种情况会迫使您同时使用这两种方法?
    • 我的项目,renderer 用于检测地板,而“会话”用于处理所有其他 AR 内容。我不太确定这样做是否正确
    • 对不起@HaiHw,你说“其他 AR 东西”是什么意思?
    • 所有因素都很重要。模型的大小(以多边形为单位)和纹理的大小(以像素为单位)是最重要的两个!
    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 2015-02-17
    • 2017-07-19
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多