我正在开发一个使用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
}
我不知道这种方法是否有效!我虽然使用过线程,但是对此我一点也不了解。如果您有任何想法,我非常欢迎您听听他们!谢谢!
(如果您希望我可以对其进行编辑并且可以共享我的所有代码!)
答案 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属性。