मुझे कुछ 2 डी ज्यामिति मिली है। मैं अपनी ज्यामिति के चारों ओर कुछ बाध्यकारी रेक्ट लेना चाहता हूं, और उसके बाद विमान पर कहीं और इसका एक छोटा संस्करण प्रस्तुत करना चाहता हूं। यहाँ और अधिक या कम कोड मैं स्केलिंग और अनुवाद क्या करना है:ओपनजीएल: स्केल फिर अनुवाद करें? और कैसे?
// source and dest are arbitrary rectangles.
float scaleX = dest.width/source.width;
float scaleY = dest.height/source.height;
float translateX = dest.x - source.x;
float translateY = dest.y - source.y;
glScalef(scaleX, scaleY, 0.0);
glTranslatef(translateX, translateY, 0.0);
// Draw geometry in question with its normal verts.
यह काम करता है ठीक किसी दिए गए आयाम के लिए अपेक्षा के गंतव्य मूल 0. है लेकिन के लिए, कहते हैं, एक्स मूल है, अशून्य है, परिणाम अभी भी सही ढंग से स्केल किया गया है लेकिन ऐसा लगता है कि (?) किसी अक्ष पर शून्य के करीब किसी चीज़ का अनुवाद किया गया है - यह पता चला है कि यह बिल्कुल वैसा ही नहीं है जैसे dest.x शून्य था।
कोई व्यक्ति कुछ स्पष्ट बता सकता है कि मुझे याद आ रही है?
धन्यवाद!
अंतिम अपडेट बहबर और मार्कस के उत्तर प्रति नीचे, मैंने कुछ और प्रयोग किया और इसे हल किया। एडम बोवेन की टिप्पणी टिप बंद थी। मुझे दो महत्वपूर्ण तथ्य याद आ रहे थे:
- मुझे जिस ज्यामिति की परवाह है, उसके केंद्र में स्केलिंग करने की आवश्यकता है।
- मुझे अंतर्ज्ञान के विपरीत क्रम में परिवर्तनों को लागू करने की आवश्यकता है (मेरे लिए)।
पहले पीछे की ओर स्पष्ट है। लेकिन उत्तरार्द्ध के लिए, मेरे जैसे अन्य अच्छे प्रोग्रामर/खराब गणितज्ञों के लिए: मेरा अंतर्ज्ञान बदल रहा है Red Book में "ग्रैंड, फिक्स्ड कोऑर्डिनेट सिस्टम" कहलाता है, जिसमें एक पूर्ण विमान है, और आपकी ज्यामिति उस पर घूमती है ट्रांसफॉर्म का उपयोग कर विमान। यह ठीक है, लेकिन एक मैट्रिक्स में एकाधिक परिवर्तनों को ढेर करने के पीछे गणित की प्रकृति को देखते हुए, यह विपरीत है कि चीजें वास्तव में कैसे काम करती हैं (नीचे दिए गए उत्तरों या अधिक के लिए लाल पुस्तक देखें)। असल में, ट्रांसफॉर्म "रिवर्स ऑर्डर" में "लागू" होते हैं ताकि वे कोड में कैसे दिखाई दे सकें। यहाँ अंतिम काम कर समाधान है:
// source and dest are arbitrary rectangles.
float scaleX = dest.width/source.width;
float scaleY = dest.height/source.height;
Point sourceCenter = centerPointOfRect(source);
Point destCenter = centerPointOfRect(dest);
glTranslatef(destCenter.x, destCenter.y, 0.0);
glScalef(scaleX, scaleY, 0.0);
glTranslatef(sourceCenter.x * -1.0, sourceCenter.y * -1.0, 0.0);
// Draw geometry in question with its normal verts.
संक्षेप में, ऑर्डर को glTranslate (dest) में बदलें; glScale (पैमाने); glTranslate (स्रोत); –
एडम: जैसा कि आप सुझाव देते हैं, यह काम नहीं करता है, हालांकि मैं चिंतित हूं - क्या आप इस बारे में विस्तार से बता सकते हैं कि ऑर्डरिंग क्यों होगी, और संभवतः यह एक स्पष्ट विचार प्रदान करेगा कि यह मौजूदा कोड के सापेक्ष कैसा दिखता है ? शायद मैं सिर्फ अपने छद्म कोड का गलत व्याख्या कर रहा हूं। धन्यवाद! –
कभी नहीं: इस मामले में "काम नहीं करता" एक fatfingered मूल्य था। इसे ठीक करने के बाद, हम व्यवसाय में हैं। अधिक के लिए अद्यतन प्रश्न देखें। धन्यवाद! –