Всякий раз, когда ваше существо, путешествующее в направлении вектора v
, сталкивается со стеной, направление которой представлено вектором w
, направление, которое вам нужно "скользить", определяется вектором, который является проекцией v
на w
. Это можно найти с помощью
v . w
--------- w
|w|*|w|
, где .
- это векторное произведение , а |w|
- это величина вектора w
(= sqrt(w . w)
). Если w
является единичным вектором, это становится просто
(v . w) w
Использование результирующего вектора в качестве скорости вашего существа будет означать, что ваше существо путешествует быстро, когда оно просто «задевает» стену, и медленно, когда оно ударяется о стену почти мертвым. (Именно так большинство шутеров от первого лица управляют столкновениями для игрока-человека.)
Если вместо этого вы хотите, чтобы ваше существо всегда путешествовало на полной скорости, вам нужен только знак v . w
- вы всегда будете путешествовать либо в направлении стены (w
), либо в противоположном направлении (-w
).
Проблема, с которой вы столкнетесь, - это когда ваше существо врезается в стену. В этом случае ваш спроецированный вектор будет (0, 0), и вам понадобится другой метод, чтобы решить, в какую сторону (w
или -w
) идти. Обычный подход здесь - это A *, хотя это может быть ненужным, если ваша среда обладает достаточной структурой.