我正在使用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
=当前轮换。
答案 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之间)并始终找到最短路径。