我尝试在AR体验中实施平面检测。
我有一个ARSCNView
扩展名为ARSCNViewDelegate
的子类。
我的cameraDidChangeTrackingState
委托方法被调用。但是,我从未见过我的renderer(_:didAdd node:, for anchor:)
方法被调用。有想法吗?
class ARView: ARSCNView {
override init(frame: CGRect, options: [String : Any]? = nil) {
super.init(frame: frame, options: options)
let sessionConfig = ARWorldTrackingConfiguration()
sessionConfig.planeDetection = [.horizontal]
self.session.run(sessionConfig)
self.delegate = self
}
}
extension ARView: ARSCNViewDelegate{
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
//add childNodes to the node here....
//but, this method doesn't get called
}
}
编辑:我可以找到ARPlaneAnchors session(_ session: ARSession, didAdd anchors: [ARAnchor])
,但是我不确定是否应该使用它,因为在大多数(也是Apples)示例中,它们都将对象添加到锚点的节点,如上面的代码所示。还是我必须自己触发d idAdd node:, for anchor
方法?
答案 0 :(得分:0)
此函数是一个实例方法。您需要将会话的委托设置为一个对象,然后将锚保存在数组中。而且,如果您需要使用任何锚点,只需在数组中搜索并找到对您有用的锚点即可。
sceneView.delegate = self
func renderer(_ renderer: SCNSceneRenderer,
didAdd node: SCNNode,
for anchor: ARAnchor) {
guard let planeAnchor = anchor as? ARPlaneAnchor else {
fatalError()
}
planeAnchor.addPlaneNode(on: node,
contents: UIColor.arBlue.withAlphaComponent(0.5))
// let virtualNode = VirtualObjectNode()
// DispatchQueue.main.async(execute: {
// node.addChildNode(virtualNode)
// })
}
let anchorsArray = planeAnchor[2]
let node = SCNNode()
node.position = SCNVector3Make(anchorsArray.center.x,
0,
anchorsArray.center.z)
希望这会有所帮助。