سؤال

على مشروعي أنا في حاجة إلى تدوير مستطيل.فكرت أنه سيكون من السهل ولكن أنا الحصول على سلوك لا يمكن التنبؤ به عند تشغيله..

هنا هو رمز:

    glPushMatrix();
    glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
    glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glBegin(GL_QUADS);

        glTexCoord2f(0.0f, 0.0f);
        glVertex2f(0, 0);
        glTexCoord2f(1.0f, 0.0f);
        glVertex2f(width_sprite_, 0);
        glTexCoord2f(1.0f, 1.0f);
        glVertex2f(width_sprite_, height_sprite_);
        glTexCoord2f(0.0f, 1.0f);
        glVertex2f(0, height_sprite_);

    glEnd();
    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);
    glPopMatrix();

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

ما هي المشكلة ؟

شكرا

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

المحلول

وتحتاج إلى الوجه ترتيب التحولات الخاص بك:

glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);

ويصبح

glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
glRotatef(30.0f, 0.0f, 0.0f, 1.0f);

نصائح أخرى

لتوضيح الإجابات السابقة.

ويتم تنفيذ التحولات في OpenGL عبر الضرب المصفوفة. في المثال الخاص بك لديك:

وM_r_ - دوران تحويل

وM_t_ - ترجمة تحويل

والخامس - قمة الرأس

وكنت قد طبقت عليها في الترتيب:

وM_r_ * * M_t_ ضد

<ع> استخدام الأقواس لتوضيح:

و(M_r_ * (M_t_ * ت))

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

وبالتالي لماذا من أجل الحصول على نتيجة المرغوبة كنت في حاجة لتحديد التحويلات بالترتيب العكسي.

Inertiatic المقدمة استجابة جيدة جدا.من مدونة منظور التحولات الخاص بك سوف يحدث في عكس الترتيب التي تظهر.وبعبارة أخرى, تحول أقرب إلى الرسم الفعلي رمز سيتم تطبيقها أولا.

على سبيل المثال:
glRotate();
glTranslate();
glScale();
drawMyThing();

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

تأكد من يتم تطبيق التناوب قبل الترجمة.

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