Как реализовать мертвый расчет при включении поворота?

" Мертвый расчет - это процесс оценки текущей позиции на основе ранее определенной позиции и продвижения этой позиции на основе известных или расчетных скоростей за прошедшее время и курс". ( Википедия)

В настоящее время я внедряю простой сервер, который использует "мертвую" оптимизацию, которая сводит к минимуму необходимые обновления, делая логические предположения как для клиентов, так и для сервера.

Можно сказать, что объекты, контролируемые пользователями, вращаются или не вращаются. Это представляет проблему с мертвым расчетом (способ, которым я вижу это.)

Например, скажем, у вас есть точка A во времени, определенная как [положение, скорость, поворот: влево / вправо / нет]. Теперь вы хотите точку B через t времени. Когда не поворачивается, новую позицию легко экстраполировать. Полученное направление также легко экстраполировать. Но как быть, когда эти два фактора объединяются? Направление скорости будет изменяться вдоль кривой, поскольку объект вращается в течение некоторого времени.

Должен ли я, возможно, пойти с другим решением (например, заставить клиента отправлять обновление для каждого нового направления, а не просто сказать серверу "Я сейчас поворачиваю налево")?

Это в 2D пространстве, кстати, ради простоты.

2 ответа

Решение

Для простоты скажем, что у ваших транспортных средств радиус поворота r не зависит от скорости. Итак, чтобы вычислить новую позицию с учетом начальных координат и времени:

  • вычислить расстояние (это скорость * время)
  • вычислите, сколько вы повернули (это расстояние / (2* пи * г))
  • добавить эту дугу в исходное положение.

Последние шаги требуют доработки.

Учитывая угол a, вычисленный на шаге 2, если вы начали с (0,0) с должным северным направлением (то есть пи /2 радиана) и поворачиваете налево, тогда ваши новые позиции: (rcos (a) -1, r грех (а)).

Если ваш исходный заголовок был другим, скажем, это было "b", то просто поверните новую позицию соответственно, то есть умножьте на эту матрицу вращения:

 [ cos b , -sin b ]
 [ sin(b), cos(b) ]

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

Ну, я думаю, "поворота: влево / вправо / нет" недостаточно для определения положения B - вам также нужно знать дугу, в которой выполняется поворот. Если вы поворачиваете влево по круговой траектории радиуса 1, вы окажетесь в другом месте, чем если бы вы поворачивали по круговой траектории радиуса 10, даже если все ваше первоначальное положение, скорость и направление поворота будут так же.

Если вариант заставить клиента отправлять обновления для каждого нового направления и рассматривать их как линейные сегменты, это будет гораздо проще сделать для расчета. Вы можете просто рассматривать каждый новый отчет от клиента как вектор и суммировать их. Вычисление набора кривых будет более сложным.

Другие вопросы по тегам