首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >校准UIAccelerometer?

校准UIAccelerometer?
EN

Stack Overflow用户
提问于 2012-11-05 03:56:44
回答 1查看 518关注 0票数 2

在我的应用程序中,我使用加速度计来控制游戏中的角色。现在,我只允许肖像方向,所以用户必须倾斜设备向右或左,以移动字符。到目前为止还不错。我现在要做的是‘校准’加速度计,以说明当前用户正在播放的倾斜。假设用户是站在他们这一边的,值会被扭曲,因为它没有考虑到这个起点,所以他们无法控制字符。因此,我试图说明最初的倾斜量,然后在游戏中说明,但它是无效的。

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

这是在IBAction中

代码语言:javascript
复制
[[UIAccelerometer sharedAccelerometer] setUpdateInterval:1.0f/30.0f];
[[UIAccelerometer sharedAccelerometer] setDelegate:self];

这是加速度计委托调用。

代码语言:javascript
复制
- (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移动字符:

代码语言:javascript
复制
- (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    rollingX = ((acceleration.x - calibrationFloat) * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor));
}

然而,这是行不通的,校准似乎没有任何作用,我不知道为什么。有人知道为什么这不管用吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-09 11:20:54

我可以给你指点。对于rollingX的计算是不正确的,它将给出超出范围-1 - +1的值,您需要一种方法来检测它,并适当地调整它。此外,简单地偏移一个轴将无法工作。加速度计工作在三维空间。为了使你的计算正确工作,电话总是必须在z平面上为0。用户旋转手机的z平面越远,设备在x平面上输出的读数就越小。加速度计感知重力,所以相对于这个平面是固定的。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13225713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档