我正在尝试使用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时,问题并没有消失。
我想保持方向响应,但我也想修复精灵旋转的“摇动”。
我很抱歉我的英语不好,并提前感谢任何建议。
答案 0 :(得分: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
}