如果我们使用CADisplayLink
来设置定时器,可以是60fps,30fps或15fps,我们使用的是Accelerometer的
acceleration.x
处理加速度,然后60fps将创建两倍于30fps的加速度,因为现在对象的x
位置更新频率为两倍。如何正确处理逼真的加速? (可能模拟真正的重力拉力)。
更新:我认为我犯了一个错误:它不是CADisplayLink
的fps,而是Accelerometer的事件处理程序的频率。如果我将其设置为1 / 60.0或1 / 30.0或1 / 15.0,则对象加速较慢...由于事件处理程序执行了
objVelocity.x += acceleration.x;
我认为频率应该自动调整以使速度增加更慢,但它不是?
答案 0 :(得分:0)
这个概念是错误的。即使您可以将其设置为100 fps,加速度也将完全相同。它不会改变,因为加速度是恒定的,直到运动管理器改变它,并且这是根据您在其中设置的更新频率发生的。即使它改变了你也不能只是“添加”它,因为那不是加速度如何工作。无论您何时阅读,设备都会为您提供加速度(除非您使用设备运动,否则包括重力)。
如果你想获得速度,你有时间因素来补偿fps的差异。如果你想要位置,那么事情会变得复杂得多,因为双重积分会产生噪音,你必须考虑到读数可能没有像你预期的那样快速变化。根据我的实验,您可以安全地将其设置为每秒70次左右,但它会随着您使用的设备(4s或4左右)而改变
以供参考:
加速度计为您提供加速度,这将始终是一个读数,取决于设备在任何给定时间的加速度。
如果你整合加速度,你得到速度,这是你似乎想要得到的,方程如下:
v = u + a * t
现在,请仔细查看如何将您的总速度加到初始速度(您之前的速度u)新的加速度乘以时间(加速度是加速度计的读数,时间是读数之间的时间间隔)。
例如:
你的物体从没有移动开始,加速器应该读为0(除非你使用裸加速度计而不是运动管理器,在这种情况下你会看到重力)。现在你让它快速向右移动,设备需要5个读数,每个差异为0.2秒。
所以你得到让我们说1 2 1 -1 -2 ...这是因为一开始它加速但是当它开始减速时它会减速但仍然只考虑第一次读数,那时你的速度是0 * 1 * .2,现在时间为.2 + 2 * .2等等。理想情况下,从开始移动到完成移动时的所有速度都应该归结为0,因为运动定律。
现在如果你碰巧想要获得位移,那么准确得到它是非常复杂的,因为对于它你必须再次整合,并且双重整合在错误方面是疯狂的。
有几种方法可以获得位移,事实上我记得在堆栈溢出中有几个帖子,讨论如何使用设备加速度计来获取它。