如何调用func渲染器(_:didAdd:for:)

时间:2018-07-24 15:20:27

标签: ios swift multithreading arkit coreml

我正在开发一个使用ARKit和CoreML的iOS应用,该应用应该在墙上识别出一定数量后添加SCNNode。我现在面临的问题是我同时具有两个竞争的功能(一个正在搜索墙(renderer(_:didAdd:for:),另一个正在搜索数字(“ classificationCompleteHandler”))。希望应用在某些条件下(例如if(lastNum != num && score > 0.90){ addNewARAnchor() })搜索并添加新的ARAnchor。问题是我不知道应该在此func addNewARAnchor()中添加什么,我的想法是添加负责的功能用于添加新的func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor)的ARAnchors,但是我不知道应该使用哪个参数!所以现在我有类似的东西:

func addNewARAnchor(){
 if(lastNum != num && score >= 0.9){
  // I don't know how to call renderer
 }
}

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor){
 //SCNNodes stuff
}

我不知道这种方法是否有效!我虽然使用过线程,但是对此我一点也不了解。如果您有任何想法,我非常欢迎您听听他们!谢谢!

(如果您希望我可以对其进行编辑并且可以共享我的所有代码!)

1 个答案:

答案 0 :(得分:0)

函数

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

是委托方法,因此您(通常)不会自己调用它。而是将会话的委托设置为某个对象。然后,只要调用此函数,就运行一些代码:

guard let planeAnchor = anchor as? ARPlaneAnchor else { return }

然后将锚保存在某个数组中,以便以后添加:

planeAnchors.append(planeAnchor)

最后,当您需要使用锚点时,在数组中搜索并找到对您最有用的一个。


编辑: 如果您有一个名为sceneView的场景视图,则可以通过在视图控制器(或任何其他类)中执行以下操作来设置其委托:

sceneView.delegate = self

然后,只需执行以下操作即可访问锚点:

let p = planeAnchors[0] // Or whichever anchor you want to access, you would just change the index

最后,将节点添加到该锚点:

let node = SCNNode()
node.position = SCNVector3Make(p.center.x, 0, p.center.z)
// Rotate because SceneKit is rotated
node.eulerAngles.x = -.pi / 2
self.sceneView.addChildNode(node)

您可以根据想要添加节点的方式/取决于节点的类型来稍微切换此代码。关键是要使用锚点p.center.x和p.center.z属性。