Проверьте, находится ли объект в поле зрения (поле зрения) в Unity 3d - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь создать игру в Unity 3d, в которой NPC двигаются, оглядываются и проверяют, какие объекты находятся под углом их обзора. Чтобы вычислить, какие объекты находятся внутри угла поля зрения, я использую встроенную в Unity функцию Vector3.Angle, см .:

// Get current position of the Robot.
var robotObjectPosition = currentTransform.parent.position;

// Get the direction to the object
var directionToObject = (objectToFind.transform.position - robotObjectPosition) / 2;

// Calculate the angle to the object and check if it's inside our viewAngle.
var isInsideAngle = Vector3.Angle(currentTransform.forward, directionToObject) < viewAngle / 2;

Теперь у меня есть странная проблема, когда, если я подхожу ближе к объекту (в данном случае плоскости в форме линии ворот), вышеприведенная проверка возвращает ложь, даже если объект все еще находится перед ним и линия ворот по-прежнему четко внутри его видения. Я сделал скриншот, чтобы визуализировать свою проблему. На первом изображении линия цели находится внутри его поля зрения, но на втором (я переместил его на несколько шагов вперед) вышеприведенная функция возвращает false, хотя я четко вижу, что он все еще перед объектом. Я говорю, что это как-то связано с шириной другого объекта (потому что я делю угол обзора на 2), но я не смог найти решение для этого.

В основном я хотел бы понять, что здесь происходит.

The goal line (white line) is still inside vision here

* +1012 *Here, i moved the robot a little bit further and suddenly the checks above now return false, and the line is no longer in his field of vision.

1 Ответ

1 голос
/ 13 мая 2019

Я сам попробовал ваш код и получил тот же результат.Проблема в том, что вам нужно помнить, что вычисляемый угол имеет две важные характеристики: 1. он проверяет центр / точку поворота «objectToFind».как только центр окажется за углом, вы получите ложь.2. он находится в 3D, а не в 2D, поэтому, если вы приблизитесь, угол между роботом и объектом (по оси Y) не включает в себя центр objectToFind.

В качестве решения я бы выбралЛуч вместо проверки, находится ли он внутри диапазона углов.Надеюсь, это поможет

...