2D中的XNA视野

时间:2010-11-09 11:21:13

标签: c# xna artificial-intelligence artificial-life boids

我正在开发基于植绒的XNA 2D游戏。我已经实现了Craig Reynold的植绒技术,现在我想动态地为该组指定一名领导者,以指导它朝向目标。

要做到这一点,我想找到一个游戏代理,在它面前没有任何其他代理并使其成为领导者,但我不确定这方面的数学。

目前我有:

Vector2 separation = agentContext.Entity.Position - otherAgent.Entity.Position;

float angleToAgent = (float) Math.Atan2(separation.Y, separation.X);
float angleDifference = Math.Abs(agentContext.Entity.Rotation - angleToAgent);
bool isVisible = angleDifference >= 0 && angleDifference <= agentContext.ViewAngle;

agentContext.ViewAngle是我玩过的一个弧度值,试图获得正确的效果但这主要导致所有代理被指定为领导者。

有人能指出我正确的方向来检测一个实体是否在另一个实体的“视锥”范围内吗?

2 个答案:

答案 0 :(得分:1)

我认为你想测试+/-角度,而不仅仅是+(即angleDifference >= -ViewAngle/2 && angleDifference <= ViewAngle/2)。或者使用绝对值。

答案 1 :(得分:1)

您需要将Atan2功能的输入标准化。另外,在减去角度时必须小心,因为结果可能超出pi到-pi的范围。我更喜欢使用方向向量而不是角度,所以你可以使用点积运算这样的事情,因为它往往更快,你不必担心规范范围之外的角度。

以下代码应达到您所追求的结果:

    double CanonizeAngle(double angle)
    {
        if (angle > Math.PI)
        {
            do
            {
                angle -= MathHelper.TwoPi;
            }
            while (angle > Math.PI);
        }
        else if (angle < -Math.PI)
        {
            do
            {
                angle += MathHelper.TwoPi;
            } while (angle < -Math.PI);
        }

        return angle;
    }

    double VectorToAngle(Vector2 vector)
    {
        Vector2 direction = Vector2.Normalize(vector);
        return Math.Atan2(direction.Y, direction.X);
    }

    bool IsPointWithinCone(Vector2 point, Vector2 conePosition, double coneAngle, double coneSize)
    {
        double toPoint = VectorToAngle(point - conePosition);
        double angleDifference = CanonizeAngle(coneAngle - toPoint);
        double halfConeSize = coneSize * 0.5f;

        return angleDifference >= -halfConeSize && angleDifference <= halfConeSize;
    }