如何校准 UIAccelerometer?

Posted

技术标签:

【中文标题】如何校准 UIAccelerometer?【英文标题】:How to calibrate UIAccelerometer? 【发布时间】:2011-12-01 06:02:02 【问题描述】:

我正在尝试从 ViewA 校准我的 UIAccelerometer,但我的游戏视图是 ViewB。 所以我想要实现的目标是让用户站在他们一边玩,我希望我的游戏表现得就像他们以正常姿势坐着玩一样。

那么在 ViewA 中我会这样做吗?:

float accelX = (acceleration.x - [[NSUserDefaults standardUserDefaults] floatForKey:@"value1"]);
[[NSUserDefaults standardUserDefaults] setFloat:accelX forKey:@"value1"];

那么在我的 Game 类中,我会在我的 UIAccelerometer 委托方法中执行此操作吗?:

float accelX = (acceleration.x - [[NSUserDefaults standardUserDefaults] floatForKey:@"X-Calibrate"]);
//Low Pass Filter
rollingX = (accelX * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor));
    AccelPoint.x += (rollingX*50);

然后我会做这样的事情:

mySprite.position = ccp(accelX, yValue);

我做错了什么吗?

谢谢!

编辑:ViewB 的新代码,我现在还需要某种形式的摩擦吗?

    rollingX = (acceleration.x * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor));     

AccelPoint.x += (rollingX*50);

然后在该代码之后,我将设置我的对象的位置。

【问题讨论】:

你试过了吗?如果是这样,您看到了什么行为? 是的,我已经尝试过了,似乎根本没有校准。我应该这样做吗? 【参考方案1】:

此问题中的示例似乎以与您描述的类似方式进行校准:Accelerometer & Calibration - iPhone SDK

视图 A 的示例代码:

float accelX = (acceleration.x - [[NSUserDefaults standardUserDefaults] floatForKey:@"value1"]);

[[NSUserDefaults standardUserDefaults] setFloat:accelX forKey:@"value1"];

这将存储一个预先校准的值。因此,如果您以前进行过校准,校准的影响将会最小化。

我认为只是:

[[NSUserDefaults standardUserDefaults] setFloat:acceleration.x forKey:@"value1"];

可能更多的是你所追求的。这样,您将消除用户起始位置的全部重力影响。

您的视图 B 的代码看起来不错,但请记住,这将使您的角色的速度无限增加。考虑增加某种形式的摩擦。

【讨论】:

AccelX 应该是 accelX :) 无论如何,我认为我只需要在 X 轴上进行校准,因为我的游戏只是纵向的,并且角色只能由 X 轴上的加速度计移动。跨度> 加速度计为我处理的唯一动作是向左或向右移动我的角色,仅此而已。 但是你用什么动作来左右移动你的角色呢? 好的,现在和你一起。用您可以尝试的方法更新了我的答案。 好的。我不想消除重力,我需要保持它! :) 另外你是说如果我再一次校准后再次校准,旧值会被覆盖?

以上是关于如何校准 UIAccelerometer?的主要内容,如果未能解决你的问题,请参考以下文章

UIAccelerometer 已弃用 ios7

UIAccelerometer 在摇晃

带有 iOS 6 SDK 的 Xcode 5:“UIAccelerometer”不可用:在 OS X 上不可用

UIAccelerometer距离计算

UIAccelerometer 和 UIScrollView

UIAccelerometer 和 UIScrollView