最後最後, 讓我們來更新focus node 吧
添加一個 helper func
func updateFocusNode() {
let results = self.sceneView.hitTest(self.focusPoint, types [.existingPlaneUsingExtent])
if results.count == 1 {
if let match = results.first {
let transform = match.worldTransform
self.focusNode.position = SCNVector3(
x: t.columns.3.x,
y: transform.columns.3.y,
z: transform.columns.3.z)
self.gameState = .swipeToPlay
}
} else {
self.gameState = .pointToSurface
}
}
這裏sceneView.hitTest 測試我們的點擊射線,並設定這射線只有偵測 detected plane,並將所產生的結果存在results 參數中,再來將第一個 hit 結果,來更新 fucus node。從hit 結果包含一個worldTransform, 這是一個矩陣(包含位置, 方向, 與規模),利用這個參數進行focus node 的更新。如果這點擊沒有產生任何結果, 則會繼續指引使用者點到 detected plane
然後我們在renderer(_:updateAtTime)使用剛寫好的 updateFocusNode func
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
updateFocusNode()
}