我在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;但抖動在所有情況下都太強大了。
所以現在我在一個點,我想我會嘗試學習卡爾曼過濾器,並統一實施它,但顯然我更喜歡黑盒解決方案,以節省時間。
我試過這個,這個和這個,但你甚至懶得發表一個你試過的代碼。也許有人可以發現你的代碼中的錯誤?你需要發佈你的過濾器代碼。 – Programmer
@Programmer使用代碼片段更新。 – user2997154
我正在調查此問題。也開始爲您的問題添加標籤。 C#標記適合於使代碼更具可讀性 – Programmer