2016-10-19 110 views
1

我在Unity中製作遊戲,其中游戲的主相機由手機方向控制。我遇到的問題是陀螺儀的數據非常嘈雜,並使相機以非常緊張的方式旋轉。我嘗試了不同的手機,以確保硬件不是問題(Galaxy s6和索尼Xperia T2)。如何平滑陀螺儀輸入?

我試過以下,但沒有一個似乎工作:

-Slerp當前的旋轉和嶄新的姿態之間(太多抖動,無論在什麼我乘Time.deltaTime)

//called at each update 
    transform.rotation = Quaternion.Slerp(transform.rotation, new Quaternion(-Input.gyro.attitude.x, -Input.gyro.attitude.y, 
       Input.gyro.attitude.z, Input.gyro.attitude.w), 60 * Time.deltaTime); 

- 平均最後的陀螺儀樣品(無論是Euleur角度平均值或Quaternion average;這兩種情況下仍然提供太多抖動,無論有多少樣本追蹤)

//called at each update 
    if (vectQueue.Count >= 5) 
     { 
      vectQueue.Enqueue(Input.gyro.attitude.eulerAngles); 
      vectQueue.Dequeue(); 



      foreach (Vector3 vect in vectQueue) { 
       avgr = avgr + vect; 

      } 
      avgr = new Vector3(avgr.x/5, avgr.y/5,avgr.z/5); 
      transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(avgr),Time.deltaTime*100); 

     } 
     else 
     { 
      vectQueue.Enqueue(Input.gyro.attitude.eulerAngles); 
     }    

-Round陀螺儀數據(最好的解決方案,到目前爲止,以防止抖動,但顯然這是不順暢的話)

-Apply高/低通濾波器(似乎並沒有做任何事情)

public float alpha = 0.5f; 
//called at each update 
v1 = Input.gyro.attitude.eulerAngles; 
    if (v2== null) 
     { 
      v2 =v1; 
      v3 = Input.gyro.attitude.eulerAngles; 
     } 
     else 
     { 
      v3 = (1 - alpha) * v3 + (1 - alpha)*(v1 - v2); 
      v2 = v1; 
      transform.Rotate(v3); 
     } 

- 複製來自人們的粘貼代碼,如this;但抖動在所有情況下都太強大了。

所以現在我在一個點,我想我會嘗試學習卡爾曼過濾器,並統一實施它,但顯然我更喜歡黑盒解決方案,以節省時間。

+0

我試過這個,這個和這個,但你甚至懶得發表一個你試過的代碼。也許有人可以發現你的代碼中的錯誤?你需要發佈你的過濾器代碼。 – Programmer

+0

@Programmer使用代碼片段更新。 – user2997154

+0

我正在調查此問題。也開始爲您的問題添加標籤。 C#標記適合於使代碼更具可讀性 – Programmer

回答

1

發現問題;我之前提到的任何方式在正常情況下都是有效的(使用組合以獲得最佳效果)。造成瘋狂抖動的原因是相機的位置。它有非常大的座標數字,我猜這是搞亂了引擎。

1

使用模擬輸入時一定要使用噪聲消除,可以通過計算當前幀中的陀螺值與前一幀中的陀螺值之間的差值來實現,如果差值大於理想值(0.002或0.03可能是好的)旋轉你的相機上的陀螺儀值。 這將最終解決你的抖動問題。希望你能得到它