在我的应用程序中,我使用加速度计来控制游戏中的角色。现在,我只允许肖像方向,所以用户必须倾斜设备向右或左,以移动字符。到目前为止还不错。我现在要做的是‘校准’加速度计,以说明当前用户正在播放的倾斜。假设用户是站在他们这一边的,值会被扭曲,因为它没有考虑到这个起点,所以他们无法控制字符。因此,我试图说明最初的倾斜量,然后在游戏中说明,但它是无效的。
因此,我在非游戏视图中有一个按钮来“校准”加速度计,这是它执行的代码:
这是在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));
}然而,这是行不通的,校准似乎没有任何作用,我不知道为什么。有人知道为什么这不管用吗?
发布于 2012-11-09 11:20:54
我可以给你指点。对于rollingX的计算是不正确的,它将给出超出范围-1 - +1的值,您需要一种方法来检测它,并适当地调整它。此外,简单地偏移一个轴将无法工作。加速度计工作在三维空间。为了使你的计算正确工作,电话总是必须在z平面上为0。用户旋转手机的z平面越远,设备在x平面上输出的读数就越小。加速度计感知重力,所以相对于这个平面是固定的。
为了进行有效的校准,您需要对所有三轴进行连续的矩阵变换,因为您需要加权偏移量(例如,当z增加时,需要更多地注意y而不是x等)。
https://stackoverflow.com/questions/13225713
复制相似问题