FOV测试正在检测前面和后面的玩家

本文关键字:玩家 前面 测试 检测 FOV | 更新日期: 2023-09-27 18:32:47

我在这里遇到的一个奇怪的问题。 我已经为我的敌人实现了视野,这样当玩家在可探测区域(前面120度锥体)内移动时,他会被坏人追赶,直到他离开FOV。

问题是有一个 120 FOV 的锥体也从敌人后面出来,所以有两个锥体,一个在前面,一个在后面,我只想使用前面的那个。 我唯一能想到的是我溢出了通过的 PI? 我真的不确定。

我使用本教程通过矢量数学来实现这一点。 点积部分。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 才能工作,我认为这可能与问题有关。 任何帮助将不胜感激!

FOV测试正在检测前面和后面的玩家

我认为添加 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 将负责直角标志...尽管您将检查新计算的角度以选择足够的范围...