2014-02-07 95 views
2

我正在測試Unity3D 4.3中的加速度計代碼。我想要做的就是簡單地改變對象的角度,而傾斜iPad,以假像的角度,像真正的生活。除了加速度計有點太敏感,我可以看到GameObject就像閃爍,即使我把它放在桌子上,一切都正常。我怎樣才能使它不那麼敏感,以至於即使用手握住,角度也會根據傾斜而改變,並且物體保持穩定?unity3d - 加速度計敏感度

這裏是我的代碼:

void Update() { 
     Vector3 dir = Vector3.zero; 

     dir.x = Mathf.Round(Input.acceleration.x * 1000.0f)/1000.0f; 
     dir.y = Mathf.Round(Input.acceleration.y * 1000.0f)/1000.0f; 
     dir.z = Mathf.Round(Input.acceleration.z * 1000.0f)/1000.0f; 

     // clamp acceleration vector to the unit sphere 
     if (dir.sqrMagnitude > 1) 
      dir.Normalize(); 

     // Make it move 10 meters per second instead of 10 meters per frame... 
     dir *= Time.deltaTime; 
     dir *= speed; 

     acx = dir.x; 
     acy = dir.y; 
     acz = dir.z; 
     transform.rotation = Quaternion.Euler(dir.y-20, -dir.x, 0); 
    } 

回答

4

您可能需要使用信號輸出之前使用low pass filter(S Exponential Moving Average有關軟件的更好的描述)。我總是使用本機代碼來獲取iPhone上的加速度計和陀螺儀值,所以我不能100%確定Unity如何處理這個問題。但是從你所描述的價值觀看來,沒有經過過濾。

低通濾波器根據您以前的所有值計算加權平均值。有例如在0.1的加權平均過濾器的因素是:

Vector3 aNew = Input.acceleration; 
a = 0.1 * aNew + 0.9 + a; 

這樣,你的價值觀是在一個小的延遲爲代價的平滑。用50赫茲運行加速度計你不會注意到它。

+2

我發現[這](http://forum.unity3d.com/threads/224147-是-docus-wrong-on-accelerometer-low-pass-filter),想想如果有人有同樣的問題可以節省幾個小時。 – sooon

0

我不能讓凱的例子工作,因爲它並沒有乘最後一部分,所以這裏是我的小修正:

Vector3 aNew = Input.acceleration; 
a = (0.1 * aNew) + (0.9 * a);