2010-11-14 16 views
5

मैं एक दृश्य में फिट विभिन्न आकारों के मॉडल प्रदर्शित करना चाहता हूं, ताकि पूरे मॉडल स्क्रीन के अंदर दिखाई दे।
ऐसा करने का सबसे अच्छा तरीका क्या है? मैं स्केलिंग की कोशिश की इस सूत्रखिड़की के अंदर फ़िट 3 डी मॉडल

scaleFactor = (screenSize/(maxModelSize * constant)) 

कहाँ आकार ऊंचाई या चौड़ाई है, क्या बड़ा है पर निर्भर करता है का उपयोग कर मॉडल (glScale का उपयोग)।
लगातार है 1/(length of one screen pixel in OpenGL units)
इस के साथ दो समस्याएं हैं:
1. कुछ परिवर्तनों करने के बाद, मैं पहचान का उपयोग इस प्रारंभिक पैमाने पर लौटने के लिए सक्षम होना चाहते हैं (मॉडल खिड़की के अनुसार बदल जाता है)। वर्तमान में पहचान कॉल करने से मॉडल को इसके मूल आयामों ("फिक्सिंग" स्केल से पहले) लाया जाएगा।
2. "निरंतर" परीक्षण और त्रुटि से मुझे कुछ मिला है, मुझे गलत तरीके लगता है। मुझे यह भी संदेह है कि यह बिल्कुल स्थिर नहीं है, और स्क्रीन रिज़ॉल्यूशन पर निर्भर करता है और भगवान जानता है कि और क्या है।

+0

"कुछ परिवर्तनों करने के बाद, मैं इस प्रारंभिक पैमाने पर लौटने के लिए सक्षम होना चाहते हैं (मॉडल है खिड़की फिट करने के लिए स्केल किया गया) पहचान का उपयोग कर। वर्तमान में पहचान कॉल करने से मॉडल को इसके मूल आयामों ("फिक्सिंग" स्केल से पहले) लाया जाएगा। " यह मेरे लिए सुझाव देता है कि आप ModelView मैट्रिक्स को स्केल कर रहे हैं। शायद आपको प्रक्षेपण मैट्रिक्स को स्केल करने का प्रयास करना चाहिए? दूसरे शब्दों में, एक बड़ा कैमरा बनाएं, न कि छोटे मॉडल। – Zecc

उत्तर

9

Section 8.070:

पहले, अपने दृश्य में सभी वस्तुओं के लिए एक सीमांकन क्षेत्र की गणना:

निम्नलिखित एक बुनियादी देखने की व्यवस्था की स्थापना पर डेव Shreiner द्वारा एक पोस्ट होने से है। यह आपको जानकारी के दो बिट प्रदान करेगा: क्षेत्र का केंद्र (चलो (सी.एक्स, सी.ई., सी.जे.) उस बिंदु पर हो) और इसका व्यास (इसे "हीरा" कहते हैं)।

अगला, zNear क्लिपिंग विमान के लिए एक मान चुनें। सामान्य दिशानिर्देश से कुछ बड़ा चुनने के लिए हैं, लेकिन 1.0 के करीब है।

GLdouble left = c.x - diam; 
GLdouble right = c.x + diam; 
GLdouble bottom c.y - diam; 
GLdouble top = c.y + diam; 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(left, right, bottom, top, zNear, zFar); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

यह दृष्टिकोण खिड़की के बीच में अपने वस्तुओं केंद्रित हो जाएगा: तो, मान लीजिए कि आप सेट

zNear = 1.0; zFar = zNear + diam; 

संरचना अपने मैट्रिक्स (एक लिखने का प्रक्षेपण के लिए) इस क्रम में कॉल करते हैं और उन्हें फिट करने के लिए खींचें (यानी, यह मानते हुए कि आप पहलू अनुपात = 1.0 के साथ विंडो का उपयोग कर रहे हैं)। अपने खिड़की वर्ग नहीं है, तो गणना छोड़ दिया, सही, नीचे, और शीर्ष, जैसा कि ऊपर, और glOrtho() के लिए कॉल करने से पहले निम्न तर्क में डाल:

GLdouble aspect = (GLdouble) windowWidth/windowHeight; 
if (aspect < 1.0) { 
    // window taller than wide 
    bottom /= aspect; 
    top /= aspect; 
} else { 
    left *= aspect; 
    right *= aspect; 
} 

ऊपर कोड चाहिए अपने दृश्य में ऑब्जेक्ट्स को उचित रूप से रखें। यदि आप हस्तक्षेप करना चाहते हैं (यानी घुमाएं, आदि), तो आपको इसे बदलने के लिए जोड़ने की आवश्यकता है।

एक ठेठ देखने ModelView मैट्रिक्स पर जाना होगा बदलने और इस प्रकार दिखाई देंगे:

GluLookAt (0., 0., 2.*diam, c.x, c.y, c.z, 0.0, 1.0, 0.0); 
+0

उस मामले के बारे में क्या प्रक्षेपण परिप्रेक्ष्य है? – elect

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