Я пытаюсь создать плавное движение камеры в 2D.Цель, которую я хочу поразить, потенциально может перемещаться на большое расстояние в одном кадре и не похожа на персонажа, плавно переходящего от А к В.
Я знаю о возможных решениях, таких как Vector2.Lerp()
, нотакой подход только медленно замедляется, но резко ускоряется.
_position = Vector2.Lerp(_position, target, 0.5f * Time.deltaTime);
Я пытался реализовать поведение рулевого управления "прибыть", но не смог заставить его работать вместе с ускорением - особенно когда цель близка к текущей позиции.
Мне удалосьчтобы заставить его работать довольно хорошо на одной оси, но этот подход не работал при повторении на второй оси.
var decelerateRadius = GetDistanceFromAcceleration(acceleration, Mathf.Abs(_velocity));
var direction = target - _position;
var distance = Mathf.Abs(direction);
var a = acceleration * Time.deltaTime;
if (distance > 0.0005f)
{
if (distance < decelerateRadius.x)
{
_velocity *= distance / decelerateRadius.x;
}
else
{
_velocity += direction.x >= 0.0f ? a : -a;
}
}
else
{
_velocity = 0.0f;
}
// move tracker
_position += _velocity * Time.deltaTime;
И мой метод расчета расстояния на основе ускорения:
private Vector2 GetDistanceFromAcceleration(float a, float vx, float vy)
{
// derived from: a = (vf^2 - vi^2) / (2 * d)
return new Vector2(vx * vx / (2.0f * a), vy * vy / (2.0f * a));
}
Моей последней попыткой было получение скользящего среднего значения цели, но она столкнулась с той же проблемой, что и лепрпинг.
Чтобы подвести итог требований:
- Должен ускоряться
- Должен замедляться и останавливаться у цели
- Не должен "вращаться вокруг орбиты" или иным образом вращаться вокруг цели перед остановкой
- Цель должна быть в состоянии двигаться
- Может бытьограничено максимальной скоростью
Какие-либо советы, указатели или решения о том, как этого добиться?
Я также задавал вопрос в игре dev https://gamedev.stackexchange.com/questions/170056/accelerate-decelerate-towards-moving-target-and-hitting-it