FOV测试是检测前方和后方的玩家

时间:2012-05-01 19:22:37

标签: c# xna angle pi fieldofview

我在这里遇到的问题。我已经为我的敌人实施了一个视野,所以当玩家在可探测区域(前方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才能工作,我认为这可能与问题有关。非常感谢任何帮助!

1 个答案:

答案 0 :(得分: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会照顾正确的角度标志...... 虽然您将检查新计算的角度以选择适当的范围...