У меня есть спрайт , который имеет Velocity
и Position
, либо хранится в виде Vector2
. В каждом Update
цикле скорость добавляется к позиции.
Я хотел бы дать спрайту третий вектор Target
. Новые цели могут быть заданы на любой итерации. Я бы хотел, чтобы спрайт по существу перемещался в произвольном порядке, однако необходимо указать два параметра:
- Типичная случайная прогулка в равной степени может увеличить или уменьшить расстояние до любого заданного
Target
(плюс небольшая вероятность тангенциального движения). Я должен быть в состоянии сместить мою случайную прогулку так, чтобы, хотя она все еще была случайной, направление, в котором «решает» спрайт, с большей вероятностью приблизило бы егоTarget
. - Случайное блуждание должно быть «плавным» - спрайт не должен быстро менять направление, поскольку это будет выглядеть как «мерцание» или «дрожание» игрока. Он должен постепенно отклоняться в ту или иную сторону, двигаясь случайным образом, и медленно приближаться при усреднении.
Какой хороший, простой способ сделать это? Если возможно, дайте ответ как Vector2 RandomWalk(Vector2 target)
метод.
У меня уже есть NextGaussian(mean, stdev)
метод, если он полезен.
xna
c#
random
linear-algebra
Superbest
источник
источник
Ответы:
Я бы взял «странствующее» рулевое поведение (исходный код можно найти здесь ) и настроил его так, чтобы случайные числа были смещены к вашей цели.
источник
Чтобы получить плавную случайную прогулку, вы можете использовать сплайны Катмулла-Рома . Этот вид сплайна берет последовательность точек и генерирует плавные кривые, которые проходят через каждую точку. Таким образом, вы могли бы генерировать случайные путевые точки для перемещения спрайта и анимировать его вдоль сплайна Кэтмулла-Рома через путевые точки. Для работы сплайна вам понадобится всего четыре путевые точки: две предыдущие и две следующие. Когда спрайт достигнет путевой точки, отбросьте самую старую из вашего набора из четырех и создайте новую, затем продолжите анимацию вдоль сплайна.
Что касается в конечном итоге движения к цели, то одной идеей будет компенсировать распределение случайного блуждания к цели. Например, если вы обычно выбираете случайную путевую точку, используя гауссово распределение с центром в текущей позиции вашего спрайта, вы можете вместо этого сместить центр гауссиана на некоторое заданное расстояние до цели. Относительные размеры смещения и стандартное отклонение Гаусса будут определять, насколько смещено движение.
источник
Вот что-то, что я взбил за 20 минут. Мы берем направление от ходунка к цели, выбираем направление в пределах определенного количества градусов от этого направления (величина уменьшается, когда ходок приближается к своей цели). Этот алгоритм также учитывает расстояние до цели, чтобы он не проходил мимо цели. Короче говоря, он в основном колеблется влево и вправо на небольшую случайную величину и попадает в цель по мере приближения.
Чтобы проверить этот алгоритм, я поместил Уокера в (10, 0, 10), а цель в (0, 0, 0). В первый раз, когда алгоритм запускал его, случайным образом выбирал позицию, по которой должен идти ходок (3.73f, 0, 6.71f). После того, как ходок достиг этой позиции, он выбрал (2.11f, 0, 3.23f), затем (0.96f, 0, 1.68f), затем (0.50f, 0, 0.79f), затем он шел прямо к цели, потому что находился в пределах минимальное расстояние допуска.
На графике с высоты птичьего полета траектория будет выглядеть как точки на изображении ниже, начиная с «W» (ходок) и заканчивая «T» (цель). Если вы хотите более естественное движение, вы заранее рассчитаете несколько очков и создадите сплайн, который даст вам гораздо больше очков, за которыми вы можете следить за ходоком. Я оценил, как будет выглядеть этот путь после превращения в сплайн, и это представлено линией на изображении.
А вот пример кода:
В зависимости от вашей конкретной игры вы можете настроить дистанцию, FOV, случайность и частоту, пока это не будет соответствовать вашим потребностям. Я уверен, что алгоритм можно немного очистить и оптимизировать, я не тратил на это много времени, я просто хотел, чтобы его было легко читать.
источник