2017-01-10 30 views

回答

3
  1. 計算矢量相對於該節點相機。通過從節點位置減去相機位置來計算矢量
  2. 使用atan2將矢量轉換爲角度。蘋果公司的文件在解釋上有點薄弱。有一個關於raywenderlich.com的教程。

例如,

let v = CGPoint(x: nodePosition.x - cameraPosition.x, y: nodePosition.y - cameraPosition.y); 
let a = atan2(v.y, v.x) // Note: order of arguments 

角度以弧度表示,範圍介於-π和π(-180至180度)之間。如果該值爲負值,則該節點位於攝像機向量的左側,正值表示該節點向右,零表示節點向前。

如果需要,可以方便地使用此角度來實際執行旋轉。只需將相機角度增加一點到節點的角度即可。

E.g.

cameraRotation += a * 0.1 

注意事項:

  • 「轉發」或「向上」不一定會是一樣的內部座標系。通常0在右邊,所以如果你想顯示一個箭頭或其他用戶界面,你可能需要從角度加上或減去一個量(通常爲 - (π/ 2)來旋轉四分之一圈)。
  • 角度始終只會在-π和+π之間。如果節點恰好落在相機後面(正好是180度),您將得到-π或+π,並且在節點跨越此不連續點時,您可能會看到這兩個極值之間的角度跳變。有時您會在導航箭頭指向目標然後突然彈到屏幕另一側的遊戲中看到這種副作用。有各種方式來處理這個問題。一個簡單的方法是在角度上使用低通濾波器(即隨時間累積多個採樣)。
+0

這工作。謝謝! – Stefan

0

沒有與projectPoint funcion魔女一個簡單的方法顯示圖像在您的視圖的2D元素,並根據它在哪裏可以找到該用戶應該

let sceneWidth:CGFloat = self.sceneView.frame.width 

getIfHeIsLookingNew(sceneWidth: sceneWidth, nodePosition: self.sceneView.projectPoint(targetNode.position)) 

func getIfHeIsLookingNew(sceneWidth: CGFloat, nodePosition: SCNVector3){ 
    if(nodePosition.z < 1){ 
      if(nodePosition.x > (Float(sceneWidth))){ 
       print("Look Right") 
      }else if(nodePosition.x < 0){ 
       print("Look Left") 
      }else{ 
       print("Correct") 
       return 
      } 
      }else if(nodePosition.x < 0){ 
       print("Look Right") 
      }else{ 
       print("Look Left") 
      } 

      } 

    } 
相關問題