سؤال

أنا أعمل على لعبة ثنائية الأبعاد في XNA مقرها حول التدفق. لقد قمت بتطبيق تقنية التدفق الخاصة بـ 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 هو قيم Radians التي لعبت معها لمحاولة الحصول على التأثير الصحيح ولكن هذا ينتج عنه في الغالب في تعيين جميع الوكلاء كقادة.

هل يمكن لأي شخص أن يوجهني في الاتجاه الصحيح لاكتشاف ما إذا كان كيان ما هو "مخروط" من رؤية كيان آخر؟

هل كانت مفيدة؟

المحلول

تحتاج إلى تطبيع المدخلات إلى وظيفة ATAN2. كما عليك أن تكون حذراً عند طرح الزوايا لأن النتيجة يمكن أن تكون خارج نطاق PI إلى -PI. أفضل استخدام ناقلات الاتجاه بدلاً من الزوايا حتى تتمكن من استخدام تشغيل منتج DOT لهذا النوع من الأشياء لأن ذلك يميل إلى أن يكون أسرع ولا داعي للقلق بشأن الزوايا خارج النطاق الكنسي.

يجب أن يحقق الرمز التالي النتيجة التي تواجهها بعد:

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

نصائح أخرى

أعتقد أنك تريد اختبار +/- الزاوية ، وليس فقط + (أي angleDifference >= -ViewAngle/2 && angleDifference <= ViewAngle/2). أو استخدام القيمة المطلقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top