Как реализовать мертвый расчет при включении поворота?
" Мертвый расчет - это процесс оценки текущей позиции на основе ранее определенной позиции и продвижения этой позиции на основе известных или расчетных скоростей за прошедшее время и курс". ( Википедия)
В настоящее время я внедряю простой сервер, который использует "мертвую" оптимизацию, которая сводит к минимуму необходимые обновления, делая логические предположения как для клиентов, так и для сервера.
Можно сказать, что объекты, контролируемые пользователями, вращаются или не вращаются. Это представляет проблему с мертвым расчетом (способ, которым я вижу это.)
Например, скажем, у вас есть точка 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, даже если все ваше первоначальное положение, скорость и направление поворота будут так же.
Если вариант заставить клиента отправлять обновления для каждого нового направления и рассматривать их как линейные сегменты, это будет гораздо проще сделать для расчета. Вы можете просто рассматривать каждый новый отчет от клиента как вектор и суммировать их. Вычисление набора кривых будет более сложным.