我正在测试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);
}
答案 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);