2014-02-07 61 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);