Этот вопрос сжигает мой мозг.
У меня есть объект на плоскости, но для простоты давайте поработаем только с одним измерением, поэтому у объекта есть начальная позиция xs.Я знаю конечную позицию хе.Объект должен двигаться из начальной в конечную позицию ускоренным (ускорение = а) движением.Я знаю скорость, которую должен иметь объект в конечной позиции (= ve).В моем особом случае конечная скорость равна нулю, но, конечно, мне нужна общая формула.Единственным неизвестным является начальная скорость против
. Объекты начинаются с vs в xs и заканчиваются ve в xe, двигаясь по пространству x с ускорением a за время t.
Так как я работаю со вспышкой, пространство выражается в пикселях, время выражается в кадрах (но вы можете рассуждать в терминах секунд, это легко преобразовать, зная количество кадров в секунду).
В цикле анимации (например, onEnterFrame) я вычисляю новую скорость и новую позицию с (например, = 0,4):
vx *= a (same for vy)
x += vx (same for y)
Я хочу, чтобы вся анимация длилась, скажем, 2секунд, что при 30 кадрах в секунду составляет 60 кадров.Теперь вы знаете, что в 60 кадрах мой объект должен перемещаться от xs к xe с постоянным замедлением, чтобы конечная скорость равнялась 0. Как рассчитать начальную скорость против?
Может быть, есть более простой способ сделатьэто во Flash, но меня сейчас интересует математика / физика, стоящая за этим.
редактировать в соответствии с ответом DSM.
Я пытался применить его предложения:
var vx:Number;
var a = -0.5;
var xs:Number = 0;
var xe:Number = Stage.width;
var mc:MovieClip;
var keyListener = {};
var startTime:Number;
init();
function init()
{
mc = attachMovie("pallino", "p1", 0);
mc._y = Stage.height/2;
Key.addListener(keyListener);
}
Ускорение равно -0,5, начало x равно 0, окончание x означаетширина сценыЯ прикрепляю видеоклип к середине сцены, а затем жду нажатия клавиши.Тогда:
keyListener.onKeyDown = function()
{
var k = Key.getCode();
mc._x = xs;
vx = 2 * (xe - xs) / 60;
trace("vx:"+vx);
startTime = new Date().getTime();
onEnterFrame = startAnimation;
}
В событии нажатия клавиши я устанавливаю начальную скорость;здесь я использую 60 для времени, потому что моя сцена установлена на 30 кадров в секунду, и я хочу, чтобы анимация происходила через 2 секунды.Наконец, анимация выглядит так:
function startAnimation()
{
trace("running, vx:" + vx);
mc._x += vx;
vx += a;
if ( mc._x >= xe )
{
trace("stopping because clip is on target position");
stopAnimation();
return;
}
if ( vx <= 0 )
{
trace("stopping because speed is too slow");
stopAnimation();
return;
}
}
function stopAnimation()
{
this.onEnterFrame = null;
var secsElapsed:Number = ( new Date().getTime() - startTime) / 1000;
trace(secsElapsed);
}
Анимация останавливается, потому что скорость слишком низкая (меньше нуля), прежде чем клип достигнет пункта назначения x.Почему ??