Как реализовать мертвый расчет при включении поворота? - PullRequest
4 голосов
/ 11 августа 2009

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 11 августа 2009

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

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

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

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

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

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

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

1 голос
/ 11 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...