Тест FOV обнаруживает игрока перед и позади

У меня странная проблема. Я реализовал поле зрения для своих врагов, так что, когда игрок путешествует внутри обнаруживаемой области (120-градусный конус впереди), его преследует плохой парень, пока он не выйдет за пределы поля зрения.

Проблема в том, что из-за врагов в ответ выходит конус 120 FOV, поэтому есть два конуса, один спереди, один сзади, я хочу использовать только один спереди. Единственное, о чем я могу думать, это то, что я переполнен пройденным ПИ? Я действительно не уверен.

Я использовал этот учебник для реализации этого с использованием векторной математики. Точечный продукт раздел. http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-2/

Вот код, связанный с FOV.

 Vector2 EnemyVecAngle = new Vector2((float)Math.Cos(EnemyAnimation.Angle), (float)Math.Sin(EnemyAnimation.Angle));

        //normalize
        Vector2 EnemyFacingN = Vector2.Normalize(EnemyVecAngle);
        Vector2 EnemytoPlayer = Vector2.Normalize(player.Position - Position);

        //check angle
        float CheckAngle = (float)Math.Acos(Vector2.Dot(EnemyFacingN, EnemytoPlayer));

if ((CheckAngle >= 60) && (CheckAngle <= 120)
following = true;

это утверждение, которое делает противника лицом к игроку после обнаружения

EnemyAnimation.Angle = (float)Math.PI / -2 + (float)Math.Atan2(Position.Y - player.Position.Y, Position.X - player.Position.X);

Мне интересно, почему мне нужно добавить -PI/2 для его работы, я думаю, что это может быть связано с проблемой. Любая помощь очень ценится!

1 ответ

Решение

Я думаю, что добавить Math.PI / -2, чтобы повернуть текстуру на 90º.

Вы должны использовать Atan2:

    Vector2 EnemyVecAngle = new Vector2((float)Math.Cos(EnemyAnimation.Angle), (float)Math.Sin(EnemyAnimation.Angle));

    //normalize
    Vector2 EnemyFacingN = Vector2.Normalize(EnemyVecAngle);
    Vector2 EnemytoPlayer = Vector2.Normalize(player.Position - Position);

    //check angle
    float CheckAngle = (float) (Math.Atan2(EnemyFacingN.Y, EnemyFacingN.X) 
                              - Math.Atan2(EnemytoPlayer.Y, EnemytoPlayer.X) );  

Этого должно быть достаточно... Atant2 позаботится о знаке правильного угла... хотя вы будете проверять новые рассчитанные углы, чтобы выбрать подходящий диапазон...

Другие вопросы по тегам