Алгоритм следования по пути с определенной инерцией - PullRequest
5 голосов
/ 31 июля 2011

Я пытаюсь разработать игру.

image demonstrating concept

У меня есть начальная точка с начальным вектором (синий), затем я рисую на экране путь (черный), которому я хочу следовать с определенной инерцией, или ограниченноугол и шаг за каждым поворотом, который должен привести к красной линии.

Есть ли у вас какие-либо советы о том, как запрограммировать такой алгоритм?

Ответы [ 2 ]

3 голосов
/ 31 июля 2011

Вы можете просто создать дифференциальную схему, то есть скорость модели и координату исходной точки в дискретные моменты времени.Допустим, вы исправили, например, dt = 0.1 sec, начальная скорость обозначена синим вектором как v0.Мы начинаем с x0.Скажем y[j] - это точки черного пути.

Пусть x1 = x0 + v1 * dt, где v1 = v0 + (y[k(x0)+1] - x0) * f(abs(y[k(x0)+1] - x_0)).Где
k(x0) - это индекс ближайшей к x0 точке среди y[j],
f(x) - это функция, характеризующая «силу», которая тянет вашу траекторию к указанной траектории.Он определен только для неотрицательных значений x es.

Эта модель переносит вашу траекторию к следующей точке определенного пути к ближайшей к текущей моделируемой позиции на траектории.

Хороший примерf(x) может быть моделью, моделирующей гравитационную силу: f(x) = K/(x * x), где K должен быть экспериментально скорректирован, чтобы дать естественные желаемые результаты.

Затем x2 = x1 + v2 * dt, где v2 = v1 + (y[k(x1) + 1] - x1) * f(abs(y[k(x1) + 1] - x_1)) и так далее:

x[n+1] = x[n] + v[n+1] * dt, где v[n+1] = v[n] + (y[k(x[n]) + 1] - x[n]) * f(abs(y[k(x[n])+1] - x[n])) ...

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

Редактировать Теперь, когда я немного подумал, я понимаю, что выбор силыФункция f была плохой, так как гравитационная сила позволяет космическим скоростям, т.е. способности вашей траектории бесконечно отклоняться от желаемой, если начальная скорость слишком велика.Таким образом, вы должны создать другую функцию, возможно, просто что-то вроде f(x) = K x или f(x) = K x ^ alpha, где alpha > 0.Видите ли, эта схема довольно общая, поэтому вы должны поэкспериментировать.

1 голос
/ 31 июля 2011

Другой вариант - сделать что-то вроде этого ...

  1. Compute the average value of k points in the target path
     to get (<x>,<y>).
  2, Compte the angle between the most recent point in the path
     and (<x>,<y>) and turn that way; if the angle is too big,
     turn as hard as possible.
  3. Recompute (<x>,<y>) for the next set of k elements by sliding
     the window by 1; repeat step 2.

Это может привести к довольно подходящему поведению. Я бы прошел пример, но это было бы довольно утомительно. Обратите внимание, что это похоже на метод unkulunkulu, но немного отличается с точки зрения подхода.

...