校准UIAccelerometer?

在我的应用程序中,我使用加速计来控制游戏中的角色。 现在我只允许纵向方向,因此用户必须向右或向左倾斜设备才能移动角色。 到目前为止工作正常。 我现在要做的是“校准”加速度计以考虑用户正在播放的当前倾斜度。 让我们说用户正在他们身边,价值会有所偏差,因为它没有考虑到那个起点,所以他们无法控制角色。 因此,我试图考虑该初始倾斜量,然后在游戏期间对其进行说明但是它不起作用。

所以我在非游戏视图中有一个按钮来“校准”加速度计,这是它执行的代码:

这是在IBAction中

[[UIAccelerometer sharedAccelerometer] setUpdateInterval:1.0f/30.0f]; [[UIAccelerometer sharedAccelerometer] setDelegate:self]; 

这是加速计代表调用

 - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { [[NSUserDefaults standardUserDefaults] setFloat:acceleration.x forKey:@"X-Calibrate"]; [[UIAccelerometer sharedAccelerometer] setDelegate:nil]; } 

然后在init的游戏视图中,我将iVar calibrationFloat设置为我在NSUserDefaults中设置的值。 然后我还有一个kFilteringFactor来摆脱小小的紧张情绪。 所以这是游戏加速度计委托方法,它将rollingX设置为等于所有内容,然后根据rollingX移动角色:

 - (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { rollingX = ((acceleration.x - calibrationFloat) * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor)); } 

然而,这不起作用,校准似乎没有做任何事情,我不知道为什么。 有谁设定为什么这不起作用?

我可以给你一些指示。 rollingX的计算不正确,它会给出超出范围-1 – +1的值,你需要一种方法来检测它达到极限并适当调整它。 也简单地偏移一个轴将不起作用。 加速度计在3D空间中工作。 为了使您的计算正常工作,手机在z平面中始终必须为0。 用户旋转手机进一步进入z平面,设备将在x平面上输出的读数越小。 加速度计感应重力,因此平面相对于此固定。

为了进行有效的校准,您需要对所有3轴应用连续矩阵变换,因为您需要加权偏移(例如,当z增加时,更多地关注y而不是x等)。