ArXen42
@ArXen42

Как рассчитать траекторию, зная функцию ускорения?

Здравствуйте. Нужно для игры сделать рассчет траектории корабля. Известны неизменные данные:
  • Начальные координаты
  • Начальная скорость
  • Координаты цели
  • Развиваемое ускорение
  • Функция работы "автопилота" - принимает на вход вектора (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 это константа - позиция) и скорости, которые от него же и меняются - слабо представляю, как к такому подступиться.
11f564bc72fa434b8be41ff52cfcdd65.png

Действует она довольно просто - просто высчитывает направление разности скорости корабля и скорости, которую он должен иметь, чтобы начав ее гасить остановиться ровно в точке назначения. Т.е. без начальной скорости он будет половину пути разгоняться, а вторую тормозить.

Задачу решаю на плоскости, третья координата не нужна.
Буду благодарен за какие-нибудь подсказки/направление в котором рыть.

P.S. переписанная функция, если раскрыть нормализацию внутри
d575ecc6f17340b1b37e6e4f5215797b.png
  • Вопрос задан
  • 734 просмотра
Решения вопроса 1
Аналитический алгоритм всегда один и тот же - отдельно по каждой из координат Х и У :

ускорение - есть производная от скорости по времени
скорость - есть производная местоположения на оси по времени

Значит подставляем в формулу ускорения Вашу формулу, получаем дифф.уравнение второго порядка, решаем его, подставляем значения местоположения и скорости в момент времени t=0 и получаем искомую Вами зависимость местоположения от времени.

Если формула ускорения для одной координаты зависит от местоположения и/или скорости по другой координате, то "развязать" координаты Вам не удастся и мы имеем вместо двух независимых дифф.уравнений второго порядка, систему и пытаемся ее решить аналитически.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы