0

我在这里遇到了一个奇怪的问题。我已经为我的敌人实施了一个视野,这样当玩家进入可检测区域(前方 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 才能使其工作,我认为这可能与问题有关。任何帮助是极大的赞赏!

4

1 回答 1

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 将处理直角符号...尽管您将检查新计算的角度以选择合适的范围...

于 2012-05-02T21:46:16.700 回答