4

群れに基づく 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 は、適切な効果を得るために試したラジアン値ですが、ほとんどの場合、すべてのエージェントがリーダーとして割り当てられます。

エンティティが別のエンティティの「円錐」ビュー内にあるかどうかを検出するために、誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

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;
    }
于 2010-11-11T04:16:27.660 に答える
1

+(つまり)だけでなく、+/-角度をテストしたいと思いますangleDifference >= -ViewAngle/2 && angleDifference <= ViewAngle/2。または絶対値を使用します。

于 2010-11-09T11:28:40.643 に答える