2011-09-20 166 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之間),並總能找到最短路徑。