كيف يمكن ببساطة استدعاء الملعب () و yaw () أن تسبب الكاميرا في نهاية المطاف ()؟

StackOverflow https://stackoverflow.com/questions/784445

  •  16-09-2019
  •  | 
  •  

سؤال

أنا ترميز لعبة OpenGL الأساسية ولدي بعض التعليمات البرمجية التي تعالج الماوس من حيث تحريك الكاميرا.

أنا أستخدم الطريقة التالية:

int windowWidth = 640;
int windowHeight = 480;

int oldMouseX = -1;
int oldMouseY = -1;

void mousePassiveHandler(int x, int y)
{
    int snapThreshold = 50;

    if (oldMouseX != -1 && oldMouseY != -1)
    {
        cam.yaw((x - oldMouseX)/10.0);
        cam.pitch((y - oldMouseY)/10.0);


        oldMouseX = x;
        oldMouseY = y;

        if ((fabs(x - (windowWidth / 2)) > snapThreshold) || (fabs(y - (windowHeight / 2)) > snapThreshold))
        {
            oldMouseX = windowWidth / 2;
            oldMouseY = windowHeight / 2;
            glutWarpPointer(windowWidth / 2, windowHeight / 2);
        }
    }
    else
    {
        oldMouseX = windowWidth / 2;
        oldMouseY = windowHeight / 2;
        glutWarpPointer(windowWidth / 2, windowHeight / 2);
    }


    glutPostRedisplay();

}

ومع ذلك، بعد النظر في الدوائر ستجد أن الكاميرا تبدأ في "لفة" (تدوير). بما أنني فقط استدعاء الملعب ويواو، فإنني لا أرى كيف يمكن ذلك.

هنا هو الرمز الذي أستخدمه لفصل الكاميرا: http://pastebin.com/m20d2b01e.

بقدر ما أعرف، لا ينبغي أن يحدث الكاميرا "المتداول". يجب أن يكون ببساطة الملعب صعودا وهبوطا أو ياو اليسار واليمين. لا لفة.

ما يمكن أن يسبب هذا؟

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

المحلول

تهانينا - لقد اكتشفت نظرية المجموعة الكذب!

انه من الممكن. تعتمد نتائج سلسلة التحولات على الترتيب الذي يتم فيه تنفيذها. القيام بملعب يتبعه ياو ليس هو نفسه القيام به في يوم، تليها الملعب. في الواقع، في حدود الإثان والملاعب الصغيرة اللانهائية، فإن الفرق يصل إلى لفة نقية؛ القضية العامة أكثر تعقيدا.

(يطلق على الفيزيائيين هذه "علاقات التخفيف من المجموعة الدورية".)

إذا كنت على دراية بمصفوفات الدوران، فيمكنك أن تعمل بسهولة.

نصائح أخرى

ربما تحتاج إلى استخدام الأوامرات لتناسب التناوب، إذا كنت لا تفعل ذلك بالفعل. هذا يتجنب مشكلة قفل جيمبال التي يمكنك الحصول عليها عند توجيه كاميرا عن طريق الدوران حول المحاور الثلاثة.

إليك كيفية تحويلها بينهما.

حسنا، إذا بدأت في التطلع إلى الأمام أفقيا إلى الأفق، فإن الملعب 90 درجة، ثم غادر ياو 90 درجة، ثم أسفل 90 درجة، كنت تبحث في نفس الاتجاه كما بدأت، ولكن الأفق سيكون رأسيا ( كما لو كنت تدحرجت 90 درجة اليسار).

تعديل: أعتقد أن المشكلة هي أن ياو / الملعب / لفة سيكون مناسبا إذا تم التعامل مع الكاميرا مثل طائرة. ما تريد القيام به هو التعامل معه مثل نقطة في مجال، ومتابعة المكان الذي تشير إليه الكاميرا على الكرة. بدلا من ياو / الملعب، استخدم إحداثيات كروية تتبع Theta (خط العرض) و PHI (خط الطول). قد تبدو متشابهة، ولكن النظر في الحالة القصوى التي تشير إليها الكاميرا مباشرة. مع YAW / PITCE، لا يزال بإمكانك ضبط الياو والملعب بحرية من هذا الاتجاه المستقيم. مع Theta / Phi، يمكنك فقط ضبط Theta Downard، وبغض النظر عن مقدار ما قمت بمعدلته ب IS، ستظل تنخفض Theta تعطيك كاميرا متوازية للأفق. هذه هي الطريقة التي يعمل بها FPS Camera (لا يمكنك أن تبدو حتى الآن كنت تتطلع وراءك).

تحرير 2.: النظر إلى رمز الكاميرا المرتبط به، تريد أن تستخدم rotLati(float angle) و rotLongi(float angle) المهام.

رياضيا السبب وراء ذلك هو أن الدورات في الفضاء ثلاثي الأبعاد لا تنقل. ما يعني ذلك هو أن الملعب () تليها YAW () ليست هي نفسها كما يابعة اثنان منهم دون الحصول على بعض من الثالث. بمعنى آخر، ستنتج أي سلسلة من الملعب () ES و Yaw () تأثير لفة ملحوظة () مع مرور الوقت، ما لم يكن النصف الثاني من التسلسل هو العكس الدقيق للنصف الأول. (هناك الكثير من الرياضيات المعقدة إلى حد ما مشارك في هذا، ولكن التفاصيل ليست ذات صلة بشكل خاص)

الملعب / ياو / لفة كلها نسبة إلى اتجاه سيارتك. عند الملعب أعلى / لأسفل، يمكنك تغيير محور YAW الخاص بك. وبالمثل، عندما تي، يمكنك تغيير محور الملعب الخاص بك. لذلك من الممكن تغيير اتجاهك بطريقة تشبه المناورة لفة فقط من خلال مزيج ومناورات الملعب واليا.

أعتقد أن هذا الظرف يسمى قفل جيمبال - هناك مثال عليه مع الرسوم التوضيحية على صفحة ويكيبيديا.

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