在我的应用程序中,我使用加速度计来控制游戏中的角色。现在我只允许纵向方向,因此用户必须向右或向左倾斜设备才能移动角色。到目前为止效果很好。我现在想要完成的是“校准”加速度计以考虑用户当前正在玩的倾斜度。假设用户侧躺,这些值将会倾斜,因为它没有考虑到该起点,因此他们将无法控制角色。因此,我尝试考虑初始倾斜量,然后在游戏过程中考虑它,但它不起作用。
因此,我的非游戏视图中有一个按钮可以“校准”加速度计,这是它执行的代码:
这是在 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 adjustmentFloat 设置为我在 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 等)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)