Unity3D - 加速计灵敏度调节

3
我正在测试Unity3D 4.3中的加速度计代码。我的目标很简单,就是在倾斜iPad时改变物体的角度,以伪造真实生活中的视角。除了加速度计有点过于敏感以至于我可以看到即使将游戏对象放在桌子上也会出现闪烁之外,一切都运行良好。我该如何使其更不敏感,以便即使你用手握住,角度也会根据倾斜而改变,同时物体仍然保持稳定?
这是我的代码:
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个回答

4
您可能需要在使用信号输出之前使用低通滤波器(请参阅有关软件的指数移动平均值,以获得更好的描述)。我总是使用本机代码获取iPhone上的加速度计和陀螺仪值,所以我不能百分之百确定Unity如何处理此类问题。但从您所描述的情况来看,这些值似乎没有经过滤波处理。
低通滤波器会从所有先前的值中计算加权平均值。例如,如果您的滤波因子为0.1,则您的加权平均值为:
Vector3 aNew = Input.acceleration;
float a = 0.1f * aNew + 0.9f * a;

这样做会以一点延迟为代价使您的值平滑。使用50 Hz运行加速度计,您不会注意到它。


2
我发现了这个链接,认为如果有人遇到相同的问题可以节省一些时间。 - sooon

1

我无法使Kay的示例正常工作,因为它没有将最后一部分乘以,所以这是我的小修正:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接