使用加速计在SpriteKit中移动和旋转精灵

4
我正在使用Spritekit制作我的第一个游戏,我需要使用加速计来移动精灵。好吧,没有问题;移动非常平滑和响应,但问题是当我尝试旋转精灵以使其面对自己的移动时,它经常像帕金森症一样“颤抖”(:D)。
我意识到这发生在加速度计数据在x,y轴上太接近0时。
所以问题是:有没有办法修复我的“帕金森病”?:D
下面是一些代码:
-(void) update:(NSTimeInterval)currentTime{
    static CGPoint oldVelocity;
    //static CGFloat oldAngle;

    if(_lastUpdatedTime) {
        _dt = currentTime - _lastUpdatedTime;
    } else {
        _dt = 0;
    }

    _lastUpdatedTime = currentTime;

    CGFloat updatedAccelX = self.motionManager.accelerometerData.acceleration.y;
    CGFloat updatedAccelY = -self.motionManager.accelerometerData.acceleration.x+sinf(M_PI/4.0);


    CGFloat angle = vectorAngle(CGPointMake(updatedAccelX, updatedAccelY));

    _velocity = cartesianFromPolarCoordinate(MAX_MOVE_PER_SEC, angle);


    if(oldVelocity.x != _velocity.x || oldVelocity.y != _velocity.y){
        _sprite.physicsBody.velocity = CGVectorMake(0, 0);
        [_sprite.physicsBody applyImpulse:CGVectorMake(_velocity.x*_sprite.physicsBody.mass, _velocity.y*_sprite.physicsBody.mass)];

        _sprite.zRotation = vectorAngle(_velocity);
        oldVelocity = _velocity;

    }
}

static inline CGFloat vectorAngle(CGPoint v){
    return atan2f(v.y, v.x);
}

我尝试在updatedAccelX或updatedAccelY的绝对值大于某些值时,仅启动_velocity向量的更新,但结果是当值在0.1和0.2之间并且改变方向时,移动不流畅,即使值小于0.1问题也没有消失。 我希望保持方向的响应性,但也想修复精灵旋转的“抖动”问题。非常抱歉我的英语不好,谢谢您提前任何建议。
1个回答

3
你可以尝试使用低通滤波器(用于隔离重力效应)或高通滤波器(用于隔离用户加速度效应)。
    #define filteringFactor 0.1

    - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {

        //low pass
        accelerX = (acceleration.x * filteringFactor) + (accelerX * (1.0 - filteringFactor));
        //idem …  accelerY
        //idem … accelerZ 

        //or high pass
        accelerX = acceleration.x - ( (acceleration.x * filteringFactor) + (accelerX * (1.0 - filteringFactor)) );
        //idem …  accelerY
        //idem … accelerZ
    }

它运行得非常好。谢谢你。我没有把这个问题看作是一个干扰问题。真的谢谢你。 - Giuseppe Lanza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接