[英]Moving and rotating a sprite with Accelerometer in SpriteKit
我正在嘗試使用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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.