一致的旋转速度,iOS精灵套件

一致的旋转速度,iOS精灵套件,ios,rotation,sprite-kit,Ios,Rotation,Sprite Kit,我想用SKAction旋转方法,根据触摸坐标,绕z轴旋转宇宙飞船。触摸之后,飞船的机头应该指向触摸点 CGFloat rad = atan2f(touchPos.y - sprite.position.y, touchPos.x - sprite.position.x); // calc rad between vectors SKAction *rotation = [SKAction rotateToAngle: rad duration: ??? shortestUnitArc:YES]

我想用SKAction旋转方法,根据触摸坐标,绕z轴旋转宇宙飞船。触摸之后,飞船的机头应该指向触摸点

CGFloat rad = atan2f(touchPos.y - sprite.position.y, touchPos.x - sprite.position.x); // calc rad between vectors

SKAction *rotation = [SKAction rotateToAngle: rad duration: ??? shortestUnitArc:YES];
如何调整持续时间以使旋转速度始终相同(无论旋转角度有多大)

问题是弧度出现在从-pi到pi的间隔内(因为atan2)。因此,旋转取决于所接触的象限,速度也取决于所接触的象限

CGFloat factor = 5.0; //Adjust this to get your desired speed.

CGFloat rad = atan2f(touchPos.y - sprite.position.y, touchPos.x - sprite.position.x); // calc rad between vectors

CGFloat diff = ABS(node.zRotation - rad);

CGFloat time = diff / factor;

SKAction *rotation = [SKAction rotateToAngle: rad duration: time shortestUnitArc:YES];
我现在明白了:

我已经将弧度从[-Pi,Pi]转换为[0,2Pi]

CGFloat prevRad = sprite.zRotation; // actual sprite rotation
if (prevRad < 0) prevRad = (M_PI)+((M_PI)+prevRad); // atan2 from 0 to 2PI

CGFloat rad = atan2f(touchLocation.y - sprite.position.y, touchLocation.x - sprite.position.x); // calc rad between vectors
if (rad < 0) rad = (M_PI)+((M_PI)+rad); // atan2 from 0 to 2PI
CGFloat factor = 4.0f;
CGFloat diff = ABS(sprite.zRotation - rad);
CGFloat time = diff / factor;

SKAction *rotation = [SKAction rotateToAngle:rad duration: time shortestUnitArc:YES];
rotation.timingMode = SKActionTimingEaseInEaseOut;
[sprite runAction:rotation];