unity3d - 加速度计灵敏度

时间:2014-02-07 15:41:32

标签: c# unity3d accelerometer

我正在测试Unity3D 4.3中的加速度计代码。我想要做的是在倾斜ipad的同时简单地改变物体角度,以及像真实物体一样的假视角。一切都很好,除了加速度计有点过于敏感,我可以看到GameObject就像闪烁一样,即使我把它放在桌子上也是如此。如何使其不那么敏感,以便即使握住你的手,角度也会根据倾斜而变化,物体保持稳定?

以下是我的代码:

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);
    }

2 个答案:

答案 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 Hz的频率运行加速度计,您将不会注意到它。

答案 1 :(得分:1)

我无法让Kay的例子工作,因为它没有倍增最后一部分,所以这是我的小修正:

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