AS3:找到旋转距离

时间:2011-09-20 13:34:38

标签: flash actionscript-3 actionscript

我正在使用TweenLite旋转对象,但是我希望持续时间不是基于旋转距离,其中180度= 3秒90 = 1.5,依此类推。

这是我尝试找到旋转距离:

var time:Number = Math.abs(Math.atan2(Math.sin(angle-wheelObj.rotation),Math.cos(angle-wheelObj.rotation)); 
TweenLite.to(wheelObj, time, {shortRotation:{rotation:angle}, ease:Expo.easeOut, onComplete:rotateWheel, onCompleteParams:[target]});
TweenLite.to(carObj, time, {shortRotation:{rotation:angle}, ease:Expo.easeOut});

这只是不起作用,当旋转很小时,时间有时很大,而当它很大时有时很小,所以有人知道更好的方法吗?

备注:

angle =目标轮换

wheelObj.rotation =当前轮换。

3 个答案:

答案 0 :(得分:1)

var speed:Number = 60; // 3 sec for 180 deg
var time:Number = Math.abs(angle - wheelObj.rotation) / speed;

您可以通过更改速度参数来设置持续时间。

注意:您可能需要将角度用作(角度%360)

答案 1 :(得分:0)

我可能错了(我没有使用过这个库),但似乎你过于复杂了。你应该这样做:

θ=W*t

你在哪里:

W=2*pi/6

所以你有:

θ=pi*t/3 (rads) or
θ=60*t (degrees)

修订版:对于最短角度,

t= |θ| / 60 for θ < 180
t= ( 180 - |θ| ) / 60 for θ > 180

或者在你的情况下:

var speed:Number = 60;
var angle:Number = Math.abs(angle - wheelObj.rotation) % 360;
if (angle > 180 ) {
     angle = 180 - angle;
}
var time:Number = Math.abs(angle)/speed;

答案 2 :(得分:0)

解决方案,如果有人有兴趣:

var rotationSpeed:Number = 60;
var startAngle:Number = (angle < 0) ? (angle + 360) % 360:angle % 360;
var endAngle:Number = (wheelObj.rotation < 0) ? (wheelObj.rotation + 360) % 360:wheelObj.rotation % 360;
var distance:Number = (Math.max(startAngle,endAngle) - Math.min(startAngle,endAngle) > (360 + Math.min(startAngle,endAngle))- Math.max(startAngle,endAngle)) ? (360 + Math.min(startAngle,endAngle))- Math.max(startAngle,endAngle) : Math.max(startAngle,endAngle) - Math.min(startAngle,endAngle);
var time:Number = distance / rotationSpeed;
TweenLite.to(wheelObj, time, {shortRotation:{rotation:angle}, ease:Expo.easeOut, onComplete:rotateWheel, onCompleteParams:[target]});
TweenLite.to(carObj, time, {shortRotation:{rotation:angle}, ease:Expo.easeOut});

以下算法:

var distance:Number = (Math.max(startAngle,endAngle) - Math.min(startAngle,endAngle) > (360 + Math.min(startAngle,endAngle))- Math.max(startAngle,endAngle)) ? (360 + Math.min(startAngle,endAngle))- Math.max(startAngle,endAngle) : Math.max(startAngle,endAngle) - Math.min(startAngle,endAngle);

比较最大角度 - 最小角度+最小角度+ 360减去最大角度,看哪一个更大,并将自己设定为答案。 e.g,

20和320

320 - 20 = 300 (20 + 360) - 320 = 40

这适用于任何两个角度(0到360之间)并始终找到最短路径。