Я работаю над игрой, в которой при каждом обновлении игрового цикла запускается ИИ. Во время этого обновления у меня есть шанс повернуть объект, контролируемый ИИ, и / или заставить его ускоряться в направлении, к которому он обращен . Я хочу, чтобы оно достигло конечного местоположения (в разумных пределах) и в этом месте имело определенную скорость и направление (опять же, оно не должно быть точным), то есть с учетом тока:
- P 0 (x, y) = Вектор текущей позиции
- V 0 (x, y) = Текущий вектор скорости (единиц / сек)
- θ 0 = Текущее направление (радианы)
- τ max = Макс. Скорость поворота (радиан / сек)
- α макс. = макс. Ускорение (ед. / Сек ^ 2)
- | V | max = Абсолютная максимальная скорость (единиц / сек)
- P f (x, y) = Вектор целевого положения
- V f (x, y) = Целевой вектор скорости (единиц / сек)
- θ f = Вращение цели (радианы)
Выберите немедленный :
- τ = скорость поворота в пределах [-τ max , τ max ]
- α = Скаляр ускорения в пределах [0, α max ] (должен ускоряться в направлении, в котором он сейчас находится)
Так, чтобы они были минимизированы:
- t = Общее время для перемещения к месту назначения
- | P t -P f | = Расстояние от конечной позиции в конце
- | V t -V f | = Отклонение от скорости цели в конце
- | θ t -θ f | = Отклонение от цели вращения в конце (переносится в (-π, π))
Параметры могут пересчитываться во время каждой итерации игрового цикла. На рисунке написано 1000 слов, поэтому , например , учитывая текущее состояние синего парня, достичь приблизительно состояния красного парня за максимально короткое время (стрелки обозначают скорость):
Рис http://public.blu.livefilestore.com/y1p6zWlGWeATDQCM80G6gaDaX43BUik0DbFukbwE9I4rMk8axYpKwVS5-43rbwG9aZQmttJXd68NDAtYpYL6ugQXg/words.gif
Если предположить постоянные α и τ для Δt (Δt → 0 для идеального решения) и разбить позицию / скорость на компоненты, это дает (I думаю , моя математика, вероятно, выключена):
Уравнения http://public.blu.livefilestore.com/y1p6zWlGWeATDTF9DZsTdHiio4dAKGrvSzg904W9cOeaeLpAE3MJzGZFokcZ-ZY21d0RGQ7VTxHIS88uC8-iDAV7g/equations.gif
(РЕДАКТИРОВАТЬ: последний должен быть θ = θ 0 + τΔt)
Итак, как мне выбрать непосредственные значения α и τ (помните, что они будут пересчитываться на каждой итерации игрового цикла, обычно> 100 кадров в секунду)? Самый простой, самый наивный способ, который я могу придумать:
- Выберите Δt, равное среднему значению за последние несколько Δts между обновлениями игрового цикла (т. Е. Очень маленьким)
- Вычислите приведенные выше 5 уравнений следующего шага для всех комбинаций (α, τ) = {0, α max } x {-τ max , 0, τ max } (только 6 комбинаций и 5 уравнений для каждого, поэтому не должно занимать слишком много времени, и, поскольку они выполняются так часто, довольно ограниченные диапазоны будут амортизироваться в конце)
- Назначьте веса для положения, скорости и вращения. Возможно, эти веса могут быть динамическими (то есть, чем дальше от позиции находится объект, тем больше веса взвешено).
- С жадностью выберите тот, который минимизирует их для местоположения Δt с этого момента.
Это потенциально быстро и просто, однако есть несколько вопиющих проблем с этим:
- Произвольный выбор весов
- Это жадный алгоритм, который (по самой своей природе) не может вернуться
- Это действительно не принимает во внимание проблемное пространство
- Если оно часто меняет ускорение или развороты, анимация может выглядеть «рывком».
Обратите внимание, что в то время как алгоритмHm может (и, вероятно, должен) сохранять состояние между итерациями, но P f , V f и θ f могут изменять каждую итерацию (то есть, если объект пытается следовать / позиционировать себя рядом с другим), поэтому алгоритм должен быть в состоянии адаптироваться к изменяющимся условиям.
Есть идеи? Есть ли простое решение для этого я скучаю?
Спасибо,
Роберт