2011-09-20 122 views
0

我正在旋转TweenLite对象,但不是设置持续时间我希望持续时间基于旋转距离180度= 3秒90 = 1.5等等。AS3:查找旋转距离

这是我试图找到旋转的距离:

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

我并没有真正得到你的第一行 - 但你为什么不做一个'var time =(angle-wheelObj.rotation)* timePerDegree'? – pkyeck

+0

@pkyeck,因为角度可以大于或小于旋转角度(它使用负角和东西太...很奇怪)。 –

回答

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

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

注意:您可能需要使用角(角%360)

+0

根据当前旋转的位置,这给了我7秒+ 10-20度的旋转。或者如果我从相反的一侧吐出大约0.3秒。 –

+0

它应该相反,20/60〜= 0.33是对的。和340/60〜5.66。跟踪你的目标角度和当前的旋转。你可能在弧度和度数方面有问题。 – ymutlu

+0

我的角度定义为度,旋转也是如此。许多角度出来是正确的,但是当测试它时,大约有三分之一是错误的,即在20度的角度范围内可以= 0,而旋转角度340(相距20度),这导致通过不到6秒的时间那公式 –

0

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

θ=W*t 

如果您W是:

W=2*pi/6 

所以,你必须:

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

修订:对于最短的角度,

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

或in你的情况:

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; 
+0

抱歉,你能告诉我W和T表示什么。 –

+0

对不起W是Omega(角度),t是时间。 (http://en.wikipedia.org/wiki/Angular_displacement) – almightyon

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个减最大的角度,并看到哪一个更大,并将自己定为答案。例如,

20和320

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

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