2012-10-24 45 views
7

मूल प्रश्न

मैं अपने कैमरा और स्क्रीन में हेरफेर करने के 'gluPerspective', 'glViewport' और 'gluLookAt' का उपयोग करना चाहते हैं।gluPerspective, glViewport, gluLookAt और GL_PROJECTION और GL_MODELVIEW Matricies

मैट्रिक्स मोड पर लागू करने के लिए कौन से फ़ंक्शन लागू होते हैं? और मैं किस क्रम में उन्हें उपयोग करना चाहिए?

उदाहरण के लिए, मैं इस तरह अपनी स्क्रीन और कैमरा स्थापित करने के लिए कोशिश कर रहा हूँ: (लेकिन यह काम नहीं कर रहा है!)

glMatrixMode(GL_PROJECTION) // Apply following to projection matrix - is this correct? 
glLoadIdentity(); // Reset first 
glPerspective(45.0, (double)w/(double)h, 1.0, 200.0); // Set perspective 
glViewport(0, 0, w, h); // Set viewport 

glMatrixMode(GL_MODELVIEW); // Apply following to modelview - should glViewport come under here? 
glLoadIdentity(); // Reset first 
gluLookAt(px, py, pz, cx, cy, cz, ux, uy, uz); // Set position, centre and then up vectors 
// This surely comes after calling GL_MODELVIEW? 

मैं ऑनलाइन प्रलेखन के लिए चारों ओर देखा है, और मैं कार्यों को समझने के लिए, बस जहां उन्हें जाना चाहिए और किस क्रम में!

कुछ समय बाद ...

यह कई महीनों के बाद अब है और मैं एक त्वरित संपादित प्रणाली मैं ओपन के साथ चीजों को प्रस्तुत करने के लिए उपयोग करते हैं दिखाने के लिए जोड़ने हूँ। यह उन लोगों की मदद करना है जो भविष्य में इस प्रश्न को देखते हैं।

मैं मुख्य रूप से दो विधियों का उपयोग करता हूं।

विधि 1:

इस विधि समूहों सब कुछ एक साथ।

// Firstly, the window may have been resized so re-create the viewing area 
glViewport(0, 0, width_of_window_rendering_area, height_of_window_rendering area); 

यह खिड़की के अंदर के पूरे क्षेत्र में प्रतिपादन के लिए व्यूपोर्ट को दोबारा शुरू करता है। sfml के साथ, आप जो विंडोइंग टूलकिट आप (भरमार, glfw, एसडीएल आदि) का उपयोग के आधार पर) window.width की तरह कुछ (या window.height(), या कुछ इसी तरह करना होगा ...

// The second step is to add a projection matrix. There are three main ones I like to use 
// Uncomment the one you want 
glMatrixMode(GL_PROJECTION); // Tell OpenGL to manipulate the correct matrix stack 
glLoadIdentity(); // Reset the projection matrix, or bad things happen after multiple calls to below functions! 
// glOrtho(...) // Uncomment to use 2D rendering 
// gluPerspective(...) // Uncomment to use (easy) 3D rendering 
glFrustrum(...) // Uncomment to use (harder/less intuitive?) 3D rendering 
glMatrixMode(GL_MODELVIEW); // I always prefer to leave OpenGL in the modelview manipulation mode. 
    // I consider it the "default" and safest mode to leave OpenGL in, as any rogue 
    // calls to functions changing its contents is likely to mess up your geometry 
    // which should be visible as a problem on the screen, which tells you you need 
    // to fix something! Manipulating the other matrix stacks may not show obvious 
    // problems. 

आप होगा 'glOrtho', 'gluPerspective' और 'glFrustrum' में से तीन में से एक को चुनने की आवश्यकता है। 'GluOrtho2D' भी है, लेकिन देखभाल के साथ इसका उपयोग करें! (मैं अपने आप को 'ग्लोथो' के साथ निकट और दूर के विमानों को निर्दिष्ट करना पसंद करता हूं।) आपको फ़ंक्शन में अपने तर्कों के साथ '...' को प्रतिस्थापित करने की आवश्यकता है।

// The third step is to clear the screen and set your camera/geometry position 
glClear(GL_COLOR_BUFFER_BIT); // use bitwise OR ('||') with 'GL_DEPTH_BUFFER_BIT' and 'GL_STENCIL_BUFFER_BIT' if required 
gluLookAt(...); 
// I like to use gluLookAt, or at least I _italic_used to! Now I implement my own camera... 
// That is another fun thing you should try if you are comfortable with 3D geometry and hard math! 

// The fourth step is to draw your scene. You may want to put lighting stuff first or in with the drawing 
glutWireTeapot(...); 

विधि 2:

दूसरी विधि से ऊपर के रूप में ही है, लेकिन एक अलग समारोह में पहला कदम ले जाने के लिए। फिर आपको विंडो आकार बदलने की घटनाओं का पता लगाना चाहिए और इस फ़ंक्शन को कॉल करना होगा। ग्लूट के साथ, आप कॉलबैक निर्दिष्ट कर सकते हैं। एसएफएमएल के साथ आप खिड़की का आकार बदलते समय एक घटना का पता लगा सकते हैं। मैं भूल जाता हूं कि एसडीएल कैसे काम करता है, लेकिन यह समान है। मैंने अभी तक नहीं सीखा है कि glfw कैसे काम करता है।

उम्मीद है कि आपकी मदद करेगा।

कुछ ओपनजीएल नौसिखियां (शायद स्वयं एक समय में शामिल) प्रोजेक्शन मैट्रिक्स पर कैमरा अनुवाद निर्दिष्ट करने का प्रयास करें। यह मत करो - मैं इसे प्रकाश और संभवतः अन्य चीजों को गड़बड़ कर देता हूं।

कॉल glViewport(...) शुरुआत में एक बार:

+0

आपके पास जो कुछ है वह मेरे लिए उपयुक्त दिखता है। शायद आपकी त्रुटि कहीं और है। – Tim

+0

सुनिश्चित करें कि आपका दृश्य glPerspective में निर्दिष्ट निकट और दूर के विमानों के बीच है। – Max

+0

यदि आप कार्यों को समझते हैं, तो आप समझेंगे कि वे कहां जाते हैं। उदाहरण के लिए, आपको लगता है कि 'glViewport' एक मैट्रिक्स बनाता है। ऐसा नहीं होता। –

उत्तर

3

मैं के रूप में मेरे आकृति बदलें कॉलबैक फ़ंक्शन परिभाषित करते हैं।

फिर एक पहचान मैट्रिक्स के साथ प्रक्षेपण मैट्रिक्स पुनः लोड:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

तब:

glPerspective(...) 
glMatrixMode(GL_MODELVIEW); 

gluLookAt(...) बाद में कभी भी कहा जा सकता है कि अगर आप अपने कैमरे की स्थिति को बदलने की जरूरत।

मेरे सरल उद्देश्यों के लिए काम करता है।

+0

धन्यवाद, यह वह उत्तर है जिसे मैं ढूंढ रहा था। यदि मैं gluLookAt को दो बार कॉल करता हूं, तो क्या यह कैमरे को फिर से ले जाएगा? इसी तरह, glRotatef को दो बार कॉल करना कैमरा/दृश्य को दो बार घुमाएगा, gluLook ऐसा ही करेगा? – user3728501

+0

क्षमा करें, एक और सवाल: क्या GlViewPort एक मैट्रिक्स संपादित करता है? क्या मुझे glViewPort पर किसी भी कॉल से पहले glMatrixMode (GL_PROJECTION) कॉल करना चाहिए? – user3728501

+0

हां, यह पूरे दृश्य को दो बार घुमाएगा। लेकिन अगर आप इसे अपने डिस्प्ले कॉलबैक फ़ंक्शन में डालते हैं, तो याद रखें कि डिस्प्ले फ़ंक्शन को बार-बार कहा जाता है, आपको अपने डिस्प्ले कॉलबैक फ़ंक्शन की शुरुआत में पहचान मैट्रिक्स के साथ मॉडल व्यू मैट्रिक्स लोड करना होगा। – Max