Здравствуйте. Нужно для игры сделать рассчет траектории корабля. Известны неизменные данные:
- Начальные координаты
- Начальная скорость
- Координаты цели
- Развиваемое ускорение
- Функция работы "автопилота" - принимает на вход вектора (targetPos - currentPos) и текущую скорость, на выходе - вектор ускорения, который нужно придать кораблю, чтобы долететь до цели.
Как получил: взял unity3d, создал тестовую сцену, написал скрипт, придающий ускорение по этой функции объекту, как-то так выглядит (три объекта с разными начальными скоростями летят к центральному).
i.imgur.com/3rf6z0e.jpg
На всякий случай, код:
internal class AutopilotController : MonoBehaviour
{
[SerializeField] private Transform _target;
[SerializeField] private Vector3 _initialVelocity;
[SerializeField] private Single _acceleration;
private void Start()
{
GetComponent<Rigidbody>().velocity = _initialVelocity;
}
private void Update()
{
var thisRigidbody = GetComponent<Rigidbody>();
Vector2 tdir = _target.position - transform.position;
Vector2 velocity = thisRigidbody.velocity;
thisRigidbody.AddForce(CalculateForce(tdir, velocity));
}
private Vector2 CalculateForce(Vector2 tdir, Vector2 velocity)
{
return (Mathf.Sqrt(_acceleration * tdir.magnitude) * tdir.normalized - velocity)
.normalized * _acceleration;
}
}
Результат получился именно тот, что хотел, но сам по себе особо не нужен . Мне нужно такую траекторию рассчитать без использования физического симулятора, т.е. получить
зависимость координат от времени. К сожалению, знаний физики не хватает, чтобы понять, на что разложить функцию/как проинтегрировать и т.д., чтобы получить эту зависимость.
Т.е. у меня получилось
переменное векторное ускорение, зависящее от текущих позиции (т.к. tdir это константа - позиция) и скорости, которые от него же и меняются - слабо представляю, как к такому подступиться.
Действует она довольно просто - просто высчитывает направление разности скорости корабля и скорости, которую он должен иметь, чтобы начав ее гасить остановиться ровно в точке назначения. Т.е. без начальной скорости он будет половину пути разгоняться, а вторую тормозить.
Задачу решаю на плоскости, третья координата не нужна.
Буду благодарен за какие-нибудь подсказки/направление в котором рыть.
P.S. переписанная функция, если раскрыть нормализацию внутри