2009-06-17 17 views
5

घुमावदार मेरे प्रोजेक्ट के लिए मुझे एक आयताकार घुमाने की आवश्यकता थी। मैंने सोचा, कि आसान होगा, लेकिन मैं एक अप्रत्याशित व्यवहार हो रही है, जब उसने चलना ..सी ++/ओपनजीएल - एक आयताकार

यहाँ कोड है:

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

समस्या क्या है?

धन्यवाद

उत्तर

10

आप अपने परिवर्तनों के आदेश फ्लिप करने की जरूरत है:

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); 
+0

बहुत बहुत धन्यवाद, यह काम करता है! –

1

यकीन है कि रोटेशन अनुवाद से पहले लागू किया जाता है सुनिश्चित करें।

9

पिछले उत्तरों के विस्तार करने के लिए हो जाता है।

ओपनजीएल में ट्रांसफॉर्मेशन मैट्रिक्स गुणा के माध्यम से किया जाता है। अपने उदाहरण में आपके पास:

M_r_ - रोटेशन बदलने

M_t_ - अनुवाद

v बदलना - एक शीर्ष

और आप क्रम में उन्हें आवेदन किया था:

M_r_ * M_t_ * v

स्पष्टीकरण के लिए ब्रांड्स का उपयोग करके:

(एम_आर_ * (एम_टी_ * वी))

हम देखते हैं कि कशेरुका पहले मैट्रिक्स द्वारा बदल दिया गया है, जो इस मामले में अनुवाद है। यह थोड़ा सा अंतर्ज्ञानी हो सकता है क्योंकि इसके लिए आपको उस क्रम में परिवर्तनों को निर्दिष्ट करने की आवश्यकता होती है, जिसे आप चाहते हैं कि आप उन्हें लागू करना चाहते हैं। लेकिन यदि आप सोचते हैं कि मैट्रिक्स स्टैक पर ट्रांसफॉर्म कैसे लगाए जाते हैं तो इसे उम्मीद से थोड़ा अधिक समझना चाहिए (ढेर एक साथ पूर्व-गुणा किया जाता है)।

इसलिए क्यों वांछित परिणाम प्राप्त करने के लिए आपको विपरीत क्रम में परिवर्तन निर्दिष्ट करने की आवश्यकता है।

+0

वास्तव में :) अद्यतन के लिए धन्यवाद! –

3

इनर्टिएटिक ने बहुत अच्छी प्रतिक्रिया प्रदान की। एक कोड परिप्रेक्ष्य से, आपके परिवर्तन उनके विपरीत दिखाई देने वाले क्रम में होंगे। दूसरे शब्दों में, वास्तविक ड्राइंग कोड के करीब बदल जाएगा पहले लागू किया जाएगा।

उदाहरण के लिए:
glRotate();
glTranslate();
glScale();
drawMyThing();

पहली बार अपने बात पैमाने पर होगा, तो इसका अनुवाद, तो यह बारी बारी से।आदेश में कौन से परिवर्तन लागू किए जा रहे हैं, यह जानने के लिए आपको प्रभावी रूप से "अपना कोड पीछे की ओर पढ़ने" की आवश्यकता है। यह भी ध्यान रखें कि जब आप मॉडल-व्यू स्टैक को दबाते हैं और पॉप करते हैं तो इन परिवर्तनों की स्थिति क्या होती है।

संबंधित मुद्दे