Frage

Ich arbeite an einem 2D-Spiel in XNA Basis Beflockung. Ich habe implementiert Craig Reynold sprühte Beflockung und jetzt möchte ich dynamisch einen Führer der Gruppe zuweisen, um es zu einem Ziel zu führen.

Um dies zu tun, ich will ein Spiel Mittel finden, die nicht mit anderen Stoffen vor ihm hat und es den Führer machen, aber ich bin nicht sicher, die Mathematik für diesen.

Zur Zeit habe ich:

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 ist ein Radiant Werte, die ich mit gespielt haben, um zu versuchen und die richtige Wirkung zu erhalten, aber dies führt meist in alle Agenten als Leiter zugeordnet ist.

Kann mir jemand Punkt mich in die richtige Richtung zu erkennen, ob ein Unternehmen in einem „Kegel“ Sicht eines anderen Unternehmens ist?

War es hilfreich?

Lösung

Sie müssen die Eingabe in die Atan2 Funktion normalisieren. Auch muss man vorsichtig sein, wenn Winkel abgezogen, weil das Ergebnis außerhalb des Bereichs pi zu -pi sein kann. Ich ziehe Richtungsvektoren zu verwenden, anstatt Winkel, so dass Sie den Punktproduktoperation für diese Art der Sache nutzen können wie die schneller zu sein scheint, und Sie müssen sich keine Sorgen machen über Winkel außerhalb des kanonischen Bereich.

Der folgende Code sollte das Ergebnis erreichen Sie nach:

    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;
    }

Andere Tipps

Ich glaube, Sie testen wollen +/- Winkel, nicht nur + (dh angleDifference >= -ViewAngle/2 && angleDifference <= ViewAngle/2). Oder Absolutwert verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top