Как проверить, видит ли мой NPC заднюю часть цели?

Marek M. спросил: 28 марта 2018 в 02:56 в: c#

Я думаю, что название говорит все. Может ли это быть сделано с использованием только векторной математики?

var toTarget = (enemy.transform.position - npc.transform.position).normalized;
var seesBack = Vector3.Dot(toTarget, npc.transform.forward) < 0;

Кажется, я должен каким-то образом смешать вектор цели в уравнение, но я действительно хромой, когда дело доходит до векторной математики (хорошо , математика вообще;)). Кто-нибудь?

EDIT:

Я тоже пробовал это сделать, но угол слишком низкий. Например, если NPC находится справа от его цели, расчетный угол составляет ~ 60 градусов:

var angle = Mathf.Abs(Vector3.Angle(enemy.transform.forward * -1, npc.transform.forward));
var seesBack = angle <= 70;

3 ответа

Есть решение
Immersive ответил: 28 марта 2018 в 04:24
Закрыть! Учтите, что для того, чтобы NPC мог видеть спину противника, противник должен смотреть примерно в том же направлении, что и вектор от NPC к противнику, он же toTarget:
var toTarget = (enemy.transform.position - npc.transform.position).normalized;
var seesBack = Vector3.Dot(toTarget, enemy.transform.forward) > 0;

Обратите внимание, что точка против преобразования врага и больше 0.

Immersive ответил: 28 марта 2018 в 04:28
Ваш оригинальный тест seesBack проверял только, мог ли NPC видеть врага вообще. Вам все еще может понадобиться это. знак равно
Marek M. ответил: 28 марта 2018 в 05:38
Хорошо, что сделали свое дело! Большое спасибо: D
Draco18s ответил: 29 марта 2018 в 04:19
О, это действительно умно.
Draco18s ответил: 28 марта 2018 в 03:51

Оба из них говорят вам одно и то же:

Два смотрят в одном и том же направлении?

Никто не говорит вам ничего о том, какой из них впереди.

Точечный продукт будет лучше, но вам также нужно проверить, кто за кем стоит.

способ, которым я могу придумать, - это сравнить расстояние между двумя объектами, добавить небольшое количество по переднему вектору NPC (например, 0,5 единицы, что примерно вдвое меньше толщины его объема столкновения) и получите расстояние от этой точки до центра другого объекта.

Если расстояние смещения меньше, NPC отстает (как при движении вперед, он станет ближе). Вы, вероятно, также захотите провести проверку расстояния где-нибудь, чтобы "позади" не было "трех комнат". Но я полагаю, вы уже сделали это.

Lece ответил: 30 марта 2018 в 12:41

Можно ли это сделать, используя только векторную математику?

Это проверит, находится ли противник в стороне от и , расположенных перед NPC.

var r = Vector3.Dot(transform.forward, enemy.transform.forward) > 0f &&
        Vector3.Dot(transform.forward, enemy.transform.position - transform.position) > 0f;
Lece ответил: 29 марта 2018 в 05:36
Это работает, так что с downvote?
Marek M. ответил: 30 марта 2018 в 07:07
Некоторые люди на SO просто ... Ну ... раздражают, если не сказать больше. Я думаю, что понизить голосование можно только в том случае, если вы даете вескую причину, и ваш ответ также работает, поэтому человек, ставящий на него отрицательный голос, должен хотя бы сказать, почему.