Я работаю над игрой. Я знаю положение агентов (x, y) и его ориентацию в диапазоне (-PI PI) и позицию (x, y) объекта интереса. Как я могу узнать, смотрит ли агент на объект?Как сказать агенту стоит точка?
ответ
Возьмите вектор от вашего агента до цели (tx - ax, ty - ay)
и найдите его ориентацию (обычно atan2(ty - ay, tx - ax)
, но вы не указали, см. [1]). Затем сравните две ориентации.
Если у вас есть облицовочную направление вашего игрока (который вы можете также вычислить из ориентации [1]), вы можете использовать продукт многоточия:
c := dot(dir, normalized(t - a))
пусть a
будет позиция вашего агента и t
позиция вашей цели, то c
- это косинус внутреннего угла между ними.
[1] Если ваша ориентация ориентирована против часовой стрелки, а ось x ориентирована в 0, то направление в обратном направлении будет dir := (cos(angle), sin(angle))
.
Вам нужен количественный критерий для определения «взгляда» или нет. Его можно выразить в терминах угла (менее 5 ° с обеих сторон) или расстояния (менее 50 см с обеих сторон).
В первом случае вычислите относительную ориентацию агента и точки (по atan2 (δy, δx)) и возьмите разницу. Во втором случае умножьте расстояние между агентом и точкой на касательную к разности углов.
Остерегайтесь того, что разница должна быть рассчитана по модулю 360 °, а отклонения более 90 ° должны быть отклонены. Также обязательно используйте радианы/градусы последовательно.