Функции ослабления для моей анимации не работают
Я не лучший в математике, и я пытаюсь угадать, как реализовать это для моей анимации. Но в настоящее время это не работает, и я считаю, что я неправильно понял, как сделать мою функцию замедления для моей анимации.
У меня есть объект, который должен представлять плоскость, на моем холсте которого есть следующие свойства:
Current Velocity = obj.velocity
Braking Distance = obj.stopDist
Current Position = obj.posX & obj.posY
Destination = obj.destX & obj.destY
Затем я включил математические расчеты, чтобы попытаться посадить самолет на ВПП с функцией замедления, чтобы он выглядел наполовину прилично визуально, даже если это не физика реального мира, подобная этой:
function ease(easeDelta,accelerateBool){
if(accelerateBool){
// accelerating
return (easeDelta * easeDelta * easeDelta);
} else {
//decelerating
return ((easeDelta--) * easeDelta * easeDelta + 1);
}
}
function InRange(delta, minValue, maxValue){
var range = (maxValue - minValue);
var valueInRange = (range * delta);
var finalValue = (valueInRange + minValue);
return finalValue;
}
function landing(){ //part of animation loop
var delta = new Date().getTime() - obj.timer, //ms since previous frame
vectorX = obj.destX - obj.posX,
vectorY = obj.destY - obj.posY,
normal = Math.sqrt(vectorX*vectorX + vectorY*vectorY), //distance to destination
targetSpeed = 20,
easeDelta = (normal / obj.stopDist),
newSpeed = InRange(ease(easeDelta,false), obj.velocity, targetSpeed),
distance = delta * newSpeed;
obj.posX += (distance * vectorX);
obj.posY += (distance * vectorY);
obj.timer = new Date().getTime(); //ready for next frame
}
Проблема в том, что самолет не замедляется, поскольку он идет по взлетно-посадочной полосе в направлении пункта назначения. Это просто очень медленно.
Я перепутал мои математические вычисления с тем, как работают функции замедления?
1 ответ
Вот несколько чрезвычайно простых уравнений, написанных на рисунке, которые могут оказаться полезными.
// accelerating from zero velocity
function easeIn(t)
{
return t*t
}
// decelerating to zero velocity
function easeOut(t)
{
return t*(2-t)
}
чтобы вы могли использовать их так:
function ease(easeDelta,accelerateBool){
if(accelerateBool){
// accelerating
return (easeDelta * easeDelta);
} else {
//decelerating
return ((easeDelta*(easeDelta - 2)));
}
}