2010-10-26 6 views
5

मैं शीर्षक में के रूप में ही qustion है: मॉडल नहीं घूर्णन हैओपनजीएल में कैमरा नहीं मॉडल को घुमाने के लिए कैसे?

glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTranslatef(0.0f, 0, -zoom); 
    glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f); 
    glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f); 

    //Here model render :/ 

और मेरे एप्लिकेशन कैमरे में:/ मैं कुछ की तरह बनाने के/

+6

आप कैसे जानते हैं कि यह आपका कैमरा है, न कि आपका मॉडल? –

+1

क्या आप कोड नमूना कोड कोड में डाल सकते हैं (कोड का चयन करें और "0101" बटन पर क्लिक करें)? – LarsH

+0

@ एसबी, क्या आप स्टीव बेकर हैं? बस उत्सुक।:-) – LarsH

उत्तर

0

जब के लिए परिवर्तन परिभाषित करते समय GL_MODELVIEW का उपयोग अपने ऑब्जेक्ट्स और GL_PROJECTION को अपने दृष्टिकोण को बदलने के लिए।

+0

वह पहले से ही GL_MODELVIEW का उपयोग कर रहा है। मुझे उम्मीद है कि आप कैमरे को स्थानांतरित करने के लिए GL_PROJECTION का उपयोग नहीं कर रहे हैं। Http://sjbaker.org/steve/omniv/projection_abuse.html – LarsH

+0

वाह देखें, ठीक है। मैं अपनी खुद की रोशनी के साथ समानांतर अनुमान करता था, इसलिए यह कोई मुद्दा नहीं होता, लेकिन हाँ, मैं देखता हूं कि यह सामान्य रूप से क्यों बुरा होगा। – andrewmu

+0

एफवाईआई, -1 वोट मेरा नहीं है। – LarsH

5

संभवतः आपको लगता है कि यह आपका कैमरा चल रहा है और आपका मॉडल ऐसा नहीं है क्योंकि दृश्य में सभी वस्तुएं एक साथ चल रही हैं?

अपने मॉडल को प्रस्तुत करने और अन्य वस्तुओं को प्रस्तुत करने से पहले, क्या आप मॉडेलव्यू मैट्रिक्स को रीसेट कर रहे हैं? दूसरे शब्दों में, क्या आप उस मॉडल को प्रस्तुत करने के बाद एक और glLoadIdentity() या glPopMatrix() कर रहे हैं जिसके बारे में आप बात कर रहे हैं और अन्य वस्तुओं को प्रस्तुत करने से पहले?

क्योंकि यदि नहीं, तो उस मॉडल पर आपके द्वारा लागू किए गए परिवर्तनों को भी अन्य ऑब्जेक्ट्स पर लागू किया जाएगा, और ऐसा होगा जैसे आप पूरी दुनिया (या कैमरा) घुमाएंगे।

मुझे लगता है कि अपने कोड यद्यपि के साथ एक और समस्या हो सकती है:

glTranslatef(0.0f, 0, -zoom); 
    glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f); 
    glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f); 
    //Here model render :/ 

आप बिंदु (0, 0, ज़ूम) के आसपास अपने मॉडल बारी बारी से करने की कोशिश कर रहे हैं?

आम तौर पर, आदेश में एक निश्चित बिंदु (एक्स, वाई, जेड) के चारों ओर घूमने के लिए, आपको कार्य करें:

  1. अनुवाद (एक्स, वाई, जेड) मूल (0,0,0) द्वारा करने के लिए वेक्टर द्वारा अनुवाद (-x, -y, -z)
  2. रोटेशन
  3. वेक्टर द्वारा अनुवाद (एक्स, वाई, जेड)
  4. ड्रा द्वारा वापस (एक्स, वाई, जेड) अनुवाद मूल प्रदर्शन

यदि आप कोशिश कर रहे हैं दूसरी ओर

glTranslatef(0.0f, 0, zoom); // translate back from origin 

यदि आपके आस-पास मॉडल को घुमाने के लिए कोशिश कर रहे हैं: बिंदु (0,0, ज़ूम), चरण 3. याद कर रहे हैं तो इससे पहले कि आप अपने मॉडल प्रस्तुत करना इस जोड़ने की कोशिश कर चारों ओर चक्कर मूल (0,0,0), और इसे z-axis के साथ भी ले जाएं, फिर आप अपने अनुवाद को अपने घूर्णन के बाद आना चाहेंगे, जैसा कि @nonVirtual ने कहा था।

और अन्य ऑब्जेक्ट्स खींचने से पहले मॉडलवेल मैट्रिक्स को रीसेट करना न भूलें। तो पूरा अनुक्रम कुछ ऐसा होगा:

glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

#if you want to rotate around (0, 0, -zoom): 
    glTranslatef(0.0f, 0, -zoom); 
    glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f); 
    glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f); 
    glTranslatef(0.0f, 0, zoom); // translate back from origin 
#else if you want to rotate around (0, 0, 0): 
    glRotatef(yr*20+moveYr*20, 0.0f, 1.0f, 0.0f); 
    glRotatef(zr*20+moveZr*20, 1.0f, 0.0f, 0.0f); 
    glTranslatef(0.0f, 0, -zoom); 
#endif  
    //Here model render :/ 

    glLoadIdentity(); 
    // translate/rotate for other objects if necessary 
    // draw other objects 
+0

मेरे पास मेरे दृश्य पर प्रकाश है। प्रतिपादन इस तरह दिखता है: glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearcolor (0.3,0.3,0.3,1); glMatrixMode (GL_MODELVIEW); glLoadIdentity(); glTranslatef (0.0f, 0, -ज़ूम); glRotatef (वर्ष * 20 + moveYr * 20, 0.0f, 1.0f, 0.0f); glRotatef (zr * 20 + moveZr * 20, 1.0f, 0.0f, 0.0f); ऑब्जेक्ट्स – openglNewbie

+0

प्रस्तुत करें ठीक है ... लेकिन क्या आप एक और glLoadIdentity() या glPopMatrix() कर रहे हैं जब आप उस मॉडल को प्रस्तुत करते हैं जिसके बारे में आप बात कर रहे हैं और अन्य ऑब्जेक्ट्स प्रस्तुत करने से पहले? क्योंकि यदि नहीं, तो उस मॉडल पर आपके द्वारा लागू किए गए परिवर्तनों को भी अन्य ऑब्जेक्ट्स पर लागू किया जाएगा, और ऐसा होगा जैसे आप पूरी दुनिया (या कैमरा) घुमाएंगे। – LarsH

0

मेरा मानना ​​है कि इसे उस क्रम में करना है जिसमें आप अपने परिवर्तन लागू कर रहे हैं। कॉल के ऑर्डर को glRotate और glTranslate पर स्विच करने का प्रयास करें। जैसा कि अब है, आप इसे मूल से बाहर ले जा रहे हैं, फिर इसे मूल के बारे में घूमते हुए, जो कैमरे के चारों ओर ऑब्जेक्टिंग ऑब्जेक्ट की उपस्थिति देगा। यदि आप इसे मूल रूप से अभी भी घुमाते हैं, तो इसे स्थानांतरित करें, फिर इसे वांछित परिणाम देना चाहिए। उम्मीद है की वो मदद करदे।

+0

चाहे वह वर्तमान में मूल से या मूल से आगे बढ़ रहा है, इस पर निर्भर करता है कि यह कहां से शुरू हो रहा है। मैंने माना कि मॉडल का केंद्र शुरू में (0,0, ज़ूम) था। लेकिन आप सही हो सकते हैं ... – LarsH