我正在尝试使用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); }
我确实尝试仅在更新的AccelX或updatedAccelY时启动_veLocity向量的更新,绝对值> =某些值,但结果是我的运动不平滑,如果值在0.1和之间,则改变方向0.2,当值低于0.1时,问题并没有消失.
我想保持方向响应,但我也想修复精灵旋转的“摇动”.
我很抱歉我的英语不好,并提前感谢任何建议.
解决方法
您可以尝试使用低通滤波器(参见隔离重力效应)或高通滤波器(以隔离用户加速效果).
#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 }