iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
0
Mobile Development

iOS 工程師要懂的AR 開發,利用ARKit 製作APP系列 第 11

ARKit-讓我們開始偵測表面吧Part 3

  • 分享至 

  • xImage
  •  

再來我們在 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


上一篇
ARKit-讓我們開始偵測表面吧Part 2
下一篇
ARKit-讓我們開始偵測表面吧Part 4
系列文
iOS 工程師要懂的AR 開發,利用ARKit 製作APP25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言