1

如果我们CADisplayLink用来设置一个计时器,无论是 60fps、30fps 还是 15fps,我们使用加速度计的

acceleration.x

要处理加速度,那么 60fps 将创建两倍于 30fps 的加速度,因为现在对象的x位置更新频率是两倍。如何正确处理现实加速?(可能是为了模拟真实的重力拉力)。


更新: 我想我犯了一个错误:它不是 fps CADisplayLink,而是加速度计事件处理程序的频率。如果我将其设置为 1 / 60.0 或 1 / 30.0 或 1 / 15.0,则对象加速较慢...由于事件处理程序执行

objVelocity.x += acceleration.x;

我认为频率应该自动调整以使速度增加更慢,但不是吗?

4

1 回答 1

0

这个概念是错误的。即使您可以将其设置为 100 fps,加速度也将完全相同。它不会改变,因为加速度是恒定的,直到运动管理器改变它,这取决于你在其中设置的更新频率。即使它改变了,你也不能只是“添加”它,因为加速不是这样工作的。该设备会在您阅读它的任何时刻为您提供加速度(包括重力,除非您使用设备运动)。

如果你想获得速度,你有时间因素来补偿 fps 的差异。如果您想要位置,那么事情会变得更加复杂,因为双重积分会产生噪音,并且您必须考虑到读数可能不会像您预期的那样快速变化。根据我的实验,您可以安全地将其设置为每秒 70 次左右,但它确实会随着您使用的设备(4s 或 4 左右)而改变

所以供参考:

加速度计为您提供加速度,这将始终是一个读数,取决于设备在任何给定时间的加速度。

如果你整合你得到速度的加速度,这就是你似乎想要得到的,等式如下:

v = u + a * t

现在在这里仔细看看如何让你的总速度加到初始速度(你以前的速度 u)上,新的速度是加速度乘以时间(加速度是加速度计的读数,时间是时间间隔读数之间)。

例如:

您的对象从没有运动开始,加速度应该读取 0(除非您使用的是裸加速度计而不是运动管理器,在这种情况下您会看到重力)。现在你让它快速向右移动,设备读取 5 个读数,每个读数有 0.2 秒的差异。

所以你可以说 1 2 1 -1 -2 ...那是因为一开始它会加速,但当它开始减速时它会减速,但仍然,只要考虑第一个读数,你当时的速度是 0 * 1* .2,现在时间 to 是 .2 + 2 * .2 等等。理想情况下,从开始移动到结束移动的所有速度都应该总和为 0,因为运动定律。

现在,如果你碰巧想要得到位移,那么要准确得到它是非常复杂的,因为你必须再次积分,而双重积分在错误方面是疯狂的。

有几种方法可以获得位移,事实上我记得堆栈溢出中的一些帖子讨论了如何使用设备加速度计获得它。

于 2012-04-27T03:38:18.737 回答