好的,我发现了一些似乎可行的方法,但我仍然有一些问题。这是我如何进行的(承认设备是垂直的):
1 - 我有我的默认 x、y 和 z 值。
2 - 我使用低通滤波器从该数据中提取重力矢量。
3 - 我从每个 x、y 和 z 中减去归一化的重力矢量,得到运动加速度。
4 - 然后,我将这个加速度值与时间积分,得到速度。
5 - 我再次将此速度与时间积分,并找到一个位置。
以下所有代码都在我的控制器的加速计中:didAccelerate:委托。我试图让球根据我找到的位置移动。这是我的代码:
NSTimeInterval interval = 0;
NSDate *now = [NSDate date];
if (previousDate != nil)
{
interval = [now timeIntervalSinceDate:previousDate];
}
previousDate = now;
//Isolating gravity vector
gravity.x = currentAcceleration.x * kFileringFactor + gravity.x * (1.0 - kFileringFactor);
gravity.y = currentAcceleration.y * kFileringFactor + gravity.y * (1.0 - kFileringFactor);
gravity.z = currentAcceleration.z * kFileringFactor + gravity.z * (1.0 - kFileringFactor);
float gravityNorm = sqrt(gravity.x * gravity.x + gravity.y * gravity.y + gravity.z * gravity.z);
//Removing gravity vector from initial acceleration
filteredAcceleration.x = acceleration.x - gravity.x / gravityNorm;
filteredAcceleration.y = acceleration.y - gravity.y / gravityNorm;
filteredAcceleration.z = acceleration.z - gravity.z / gravityNorm;
//Calculating velocity related to time interval
velocity.x = velocity.x + filteredAcceleration.x * interval;
velocity.y = velocity.y + filteredAcceleration.y * interval;
velocity.z = velocity.z + filteredAcceleration.z * interval;
//Finding position
position.x = position.x + velocity.x * interval * 160;
position.y = position.y + velocity.y * interval * 230;
如果我执行这个,我会得到很好的值,我的意思是我可以看到加速度根据我的动作进入正值或负值。但是当我尝试将该位置应用到我的球视图时,我可以看到它正在移动,但倾向于朝一个方向移动而不是另一个方向。这意味着,例如,如果我用我的设备画圆圈,我会看到描述曲线的球朝向屏幕的左上角。类似的东西:http: //img685.imageshack.us/i/capturdcran20100422133.png/
您对正在发生的事情有任何想法吗?提前致谢 !