如何从 "renderer(_:nodeFor:)" 实例方法中捕获节点?

How to capture node from "renderer(_:nodeFor:)" instance method?

我对 planeDetection 处于活动状态时调用的委托方法感到困惑。检测到平面时方法调用成功,但是返回的SCNNode到哪里去了?我如何访问它?

func renderer(_ renderer: SCNSceneRenderer, 
          nodeFor anchor: ARAnchor) -> SCNNode? 

为了它的价值,我使用了自定义 ARCL 库,它允许我通过 GPS 坐标放置节点。出于某种原因,在该框架下,这种方法似乎不会在检测到飞机时触发。我的委托设置正确,因为确实调用了 renderer(_:nodeFor:) 方法 - 否则我只会使用此方法。

func renderer(_ renderer: SCNSceneRenderer, 
             didAdd node: SCNNode, 
              for anchor: ARAnchor) 

关于新的 SCNNode,renderer(_:nodeFor:) 实例方法为我们生成,我们将此节点传递给 ARKit,ARKit 将其与相应的锚点绑定以彻底跟踪其位置。

renderer(_:nodeFor:) 方法返回的节点,作为子节点添加到 SCNScene 根节点。跟踪 ARFaceAnchors 时经常使用 renderer(_:nodeFor:) 方法。

var specialNode: SCNNode?

func renderer(_ renderer: SCNSceneRenderer, 
          nodeFor anchor: ARAnchor) -> SCNNode? {

    guard let sceneView = renderer as? ARSCNView, anchor is ARFaceAnchor 
    else { return nil }

    let faceGeometry = ARSCNFaceGeometry(device: sceneView.device!)!  
    self.specialNode = SCNNode(geometry: faceGeometry)

    return self.specialNode
}

...

func renderer(_ renderer: SCNSceneRenderer,
          didUpdate node: SCNNode,
              for anchor: ARAnchor) {
    
    if let faceAnchor = anchor as? ARFaceAnchor,
       let faceGeo = node.geometry as? ARSCNFaceGeometry {

        faceGeo.update(from: faceAnchor.geometry)
    }
}

不过,您可以将 renderer(_:nodeFor:) 方法与任何所需的锚点类型一起使用。