AS3: Найти расстояние вращения - PullRequest
0 голосов
/ 20 сентября 2011

Я вращаю объект с помощью 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 ]

1 голос
/ 20 сентября 2011
var speed:Number = 60; // 3 sec for 180 deg
var time:Number = Math.abs(angle - wheelObj.rotation) / speed;

Вы можете установить продолжительность, изменив параметр скорости.

Примечание: вам может потребоваться использовать угол как (угол% 360)

0 голосов
/ 20 сентября 2011

Решение, если кому-то интересно:

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) ивсегда находит кратчайший маршрут.

0 голосов
/ 20 сентября 2011

Возможно, я ошибаюсь (я не использовал эту библиотеку), но, похоже, вы слишком усложняете это. Вы должны просто сделать:

θ=W*t

Где вы W:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...