我正在 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);
}
您可能需要使用低通滤波器 http://en.wikipedia.org/wiki/Low_pass_filter (s. 指数移动平均线 https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average有关软件的更好描述)在使用信号输出之前。我总是使用本机代码来获取 iPhone 上的加速度计和陀螺仪值,因此我不能 100% 确定 Unity 如何处理此问题。但根据您所描述的内容,这些值似乎未经过滤。
低通滤波器计算所有先前值的加权平均值。例如,过滤因子为 0.1,您的加权平均值为:
Vector3 aNew = Input.acceleration;
float a = 0.1f * aNew + 0.9f * a;
这样,您的值就会得到平滑,但会造成少量延迟。以 50 Hz 运行加速度计,您不会注意到它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)