Использование ускорения, ограниченного трением, для точного задания максимальной скорости
Предыдущий ответ верен, что трение может установить предел скорости, но в ответе упущены некоторые детали, касающиеся установки предела.
Сначала ваша переменная скорости
vel = 0; //in pixels per frame. Start at 0 (or wherever you want)
И вам нужна конкретная максимальная скорость в пикселях на кадр.
maxVelocity = 100; // set the maximum speed
И у вас есть конкретное максимальное ускорение в пикселях на кадр2
maxAccel = 1; // The max acceleration will occur when accelerating from 0
Теперь вам нужно получить трение, необходимое для прекращения ускорения, когда скорость достигает 100. Назовем неизвестное трение
friction = null; // what we need to find out
Вы будете использовать уравнение
vel = vel + maxAccel; // accelerate
vel = vel * friction; // add friction
Вы знаете, что friction
должно уменьшать скорость после ускорения, чтобы она не превышала maxVelocity
. Итак, нам нужно значение для friction
, которое при применении к maxVelocity + maxAccel
равно maxVelocity
.
maxVelocity = (maxVelocity + maxAccel) * friction;
Теперь просто перестройте уравнение для решения неизвестного friction
, чтобы получить
friction = maxVelocity / (maxVelocity + maxAccel);
Теперь у вас есть значение friction
, которое гарантирует, что ваша скорость не превысит maxVelocity
.
Чтобы немного расширить его, вы можете добавить ускорение, которое даст вам краткосрочную дополнительную скорость, но вы не хотите, чтобы эта ускоренная скорость превышала предел. Вы можете просто пересчитать friction
в новое maxVelocity
, но это может не дать вам желаемого толчка, так как верхний конец кривой скорости имеет низкое ускорение.
Другой способ - обеспечить дополнительное ускорение при сохранении того же трения - рассчитать необходимое дополнительное ускорение. Нам нужны новые вары.
maxBoostVelocity = 120; // max boost velocity
boostAccel = null; // this will have to be calculated using the friction we have
Используя ту же логику, что и выше, но переставляя решение трения с точки зрения новой максимальной скорости и с известным трением, мы получаем
boostAccel = ((maxBoostVelocity / friction )- maxBoostVelocity);
Мне нравится использовать только дополнительное ускорение для ускорения, поэтому мне не нужно трогать существующие значения ускорения. Поэтому я просто вычитаю исходное ускорение из расчетного ускорения, чтобы получить то, что хочу.
boostAccel = boostAccel - maxAccel;
Итак, в каком-то коде
// the known limits
vel = 0; //in pixels per frame. Start at 0 (or wherever you want)
maxVelocity = 100; // set the maximum speed
maxAccel = 1; // The max acceleration will occur when accelerating from 0
maxBoostVelocity = 120; // max boost velocity
accelerate = false; // flag to indicate that we want to accelerate
boost = false; // flag to indicate we want to boost
// the unknown friction and boost accel
boostAccel = null; // this will have to be calculated using the friction we
friction = null; // what we need to find out
function applyAcceleration()
if(boost){ // is boosr flag true then add boost
vel += boostAccel ; // boost
}
if(accelerate || boost){ // is accelerate or boost flag true
vel += maxAccel; // accelerate
}
// always apply the friction after the accelerations
vel *= friction; // apply friction
}
// in the init function calculate the friction and boost acceleration
function init(){
friction = maxVelocity / (maxVelocity + maxAccel);
boostAccel = ((maxBoostVelocity / friction )- maxBoostVelocity) - maxAccel;
}
person
Blindman67
schedule
28.04.2016
max = 50
,if vel > 50
как объектforce
может влиять наvel
? Поглотил быvel
force
.. - person John Moore   schedule 18.04.2016vel = vel1 + vel2
.vel1
поглотитьforce
, если сила означает бег.vel2
поглощаетforce
, если сила означает запуск из человеко-пушки.vel1
зажимается,vel2
нет. - person Egor Skriptunoff   schedule 18.04.2016