再來我們在 ARSCNViewDelegate 中的 renderer(_:didAdd:for:)實現
func renderer(_ renderer: SCNSceneRenderer,
didAdd node: SCNNode, for anchor: ARAnchor) {
guard let anchor = anchor as? ARPlaneAnchor else {
return
}
DispatchQueue.main.async {
let node = self.createARPlaneNode(
planeAnchor: anchor,
color: UIColor.blue.withAlphaComponent(0.5))
node.addChildNode(node)
}
}
從這個delegate 的方法中我們拿到了 SCNNode, 這是一個新的空白empty ScenceKit node,
同時也搭配了一個 ARAnchor node, 再來我們要確認拿到的 anchor是我們剛剛設的 ARPlaneAnchor
最後產生一個 blue 的 node, 加在 ARKit 產生的 node 上,並且給它設定顏色
當然,使用者偵測的表面是會隨使用者移動而改變, 所以需要在適當的時候去更新,
這裡寫一個helper func 去做更新
func updateARPlaneNode(planeNode: SCNNode, planeAnchor: ARPlaneAnchor) {
let geometry = planeNode.geometry as! SCNPlane
geometry.width = CGFloat(planeAchor.extent.x)
geometry.height = CGFloat(planeAchor.extent.z)
planeNode.position = SCNVector3Make(planeAchor.center.x, 0, planeAchor.center.z)
}
這func 做的事就是先取得上一次plane的結果,然後根據給定的新anchor,更新這個plane的長寬和其node的位置
最後, 將這個helper func 加在ARSCNViewDelegate 中的 renderer(_:didUpdate:for:) 實現
func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
guard let anchor = anchor as? ARPlaneAnchor else { return }
DispatchQueue.main.async {
self.updateARPlaneNode(planeNode: node.childNodes[0],
planeAchor: anchor)
} }
這裏一樣需要先確認是否為 ARPlaneAnchor , 然後利用剛才的 helper func 更新plane