0

如何根据倾斜量更新对象的x 和 y 位置

我正在尝试根据倾斜运动的量来更新我的_bg对象的x和 y 位置。

此外,如果将设备放在桌子上,则位置应回到原来的位置;

我正在尝试做这样的事情:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    _motionManager = [[CMMotionManager alloc] init];

    [_motionManager startGyroUpdates];
    _timer = [NSTimer scheduledTimerWithTimeInterval:1/30
                                              target:self
                                            selector:@selector(updateGyro)
                                            userInfo:nil repeats:YES];
}



- (void)updateFromGyro
{
    self.x += _motionManager.gyroData.rotationRate.x;
    self.y += _motionManager.gyroData.rotationRate.y;

    _bg.center = CGPointMake(self.x, self.y);
}

问题是物体永远不会停止移动!

谢谢!

4

3 回答 3

0

我认为您在设置新中心时犯了错误。尝试这个 :

- (void)updateFromGyro
{
    self.x = _bg.center.x + _motionManager.gyroData.rotationRate.x;
    self.y = _bg.center.y + _motionManager.gyroData.rotationRate.y;

    _bg.center = CGPointMake(self.x, self.y);
}

顺便说一句,即使您将设备放在桌子上,您的应用程序也会继续接收陀螺仪更新,因为不能保证桌子的坡度为 0 度。

于 2013-06-20T15:39:57.860 回答
0

这可能会有所帮助。根据问题中可用的有限数据,不确定。您可能还应该切换到使用绝对位置/旋转,而不是帧之间的相对变化。

只需设置一个最小阈值。这将防止微小的动作显示为更新:

if( _motionManager.gyroData.rotationRate.x > ROTATION_MIN )
{
    self.x += _motionManager.gyroData.rotationRate.x;
}
if( _motionManager.gyroData.rotationRate.y > ROTATION_MIN )
{
    self.y += _motionManager.gyroData.rotationRate.y;
}
_bg.center = CGPointMake(self.x, self.y);
于 2013-06-20T15:31:15.967 回答
0

速率是每单位时间的变化量。因此,您正在设置相对于设备移动速度的坐标,而不是它的实际偏移量。您可能想查看它attitude(它与任意参考框架的实际偏移量)。文档在这里

于 2013-06-20T15:32:49.837 回答