2010-08-07 15 views
12

मैं ओपनजीएल समन्वय प्रणाली को समझने की कोशिश कर रहा हूं। हर जगह मैं इसे सही हाथ के रूप में वर्णित करता हूं, लेकिन यह मेरे अनुभव से मेल नहीं खाता है। मैंने कुछ आकार और 3-डी ऑब्जेक्ट्स खींचने की कोशिश की और मुझे लगता है कि जाहिर है कि ज़ेड-अक्ष पॉइंट "स्क्रीन में" (जबकि एक्स पॉइंट टू दाएं, और वाई अप - जो बाएं हाथ की समन्वय प्रणाली का विवरण है)। मैं क्या खो रहा हूँ?ओपनजीएल जेड-अक्ष कहाँ अंक?

संपादित करें: उदाहरण के लिए:
http://img576.imageshack.us/img576/9234/triangles.jpg
हैं + Z अंक दर्शक, क्यों हरी त्रिकोण है, जो जेड निर्देशांक बड़ा है, लाल एक के पीछे है?

initializeGL:

qglClearColor(Qt::darkGray); 
glClearDepth(1.0); 
glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LEQUAL);  
glEnable(GL_COLOR); 

resizeGL:

glViewport(0, 0, width, height); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(-50.0f, 50.0f, -50.0f, 50.0f, 50.0, -50.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

paintGL:

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
glRotatef (-30.0, 1.0, 0.0, 0.0); 
glRotatef (20.0, 0.0, 1.0, 0.0); 
glColor3f(1.0, 0.0, 0.0); 
glBegin(GL_LINES); 
glVertex3f(45.0, 0.0, 0.0); 
glVertex3f(-45.0, 0.0, 0.0); 
glVertex3f(0.0, 45.0, 0.0); 
glVertex3f(0.0, -45.0, 0.0); 
glVertex3f(0.0, 0.0, 45.0); 
glVertex3f(0.0, 0.0, -45.0); 
glEnd(); 
glBegin(GL_TRIANGLES); 
//Red triangle: 
glColor3f(1.0, 0.0, 0.0); 
glVertex3f(0.0, 0.0, 1.0); 
glVertex3f(0.0, 20.0, 1.0); 
glVertex3f(20.0, 0.0, 1.0); 
//Green triangle:  
glColor3f(0.0, 1.0, 0.0); 
glVertex3f(-15.0, 0.0, 20.0); 
glVertex3f(0.0, 25.0, 20.0); 
glVertex3f(15.0, 0.0, 20.0); 
glEnd(); 
+0

"अगर + जेड पॉइंट दर्शक, क्यों हरा त्रिभुज, जो ज़ेड-समन्वय बड़ा है, लाल रंग के पीछे है?" आपने पूरे दृश्य को दो बार घुमाया। त्रिभुजों को प्रस्तुत करने से पहले मॉडल व्यू मैट्रिक्स के लिए glLoadIdentity पर कॉल करें, फिर परिणामों की तुलना करें। – SigTerm

उत्तर

5

अंतिम 2 पैरामीटर glOrtho संदर्भ:

nearVal, farVal
नजदीक और दूर गहराई कतरन विमानों के लिए दूरी निर्दिष्ट करें। यदि विमान दर्शक के पीछे होना है तो ये मान नकारात्मक हैं।

आपका नजदीक क्लिपिंग विमान दर्शक के सामने और आगे के पीछे है। यह जेड अक्ष फ्लिप करेगा।

+3

यह अनिवार्य रूप से मैंने इस जवाब से 12 घंटे पहले कहा था। – JustBoo

+0

हां, जेड-अक्ष वास्तव में गलती से फिसल गया था, लेकिन उसके बाद मुझे उस कोड की सटीक रेखा का पता लगाने में समस्या थी – majaen

8

ठीक है, बात यह है कि मेरे लिए बाहर खड़ा है glOrtho कार्य है। आपके पास निकट और दूर क्लिपिंग विमान केवल 100 इकाइयां अलग हैं। यह बहुत छोटा लगता है। क्या आप वास्तव में इस तरह से चाहते हैं? यह उस समारोह में पिछले 2 पैरामीटर द्वारा दर्शाया गया है।

इसके अलावा आपकी वस्तुएं इस छोटी फ्रस्टम के संबंध में बहुत बड़ी हैं। ऑब्जेक्ट सीधे आपके कैमरे के सामने बैठे जा सकते हैं और यह अन्य वस्तुओं को देखने से रोक देगा।

मैं ग्लोथो कॉल में सभी पैरामीटर को बड़ा कर दूंगा। एचटीएच


दाएं हाथ की प्रणाली (ओपनजीएल) नकारात्मक जेड (-जेड) में स्क्रीन में इंगित करना चाहिए। सकारात्मक वाई "ऊपर" होना चाहिए, और सकारात्मक एक्स दाईं ओर होना चाहिए।

ऐसा लगता है कि आपने जो वर्णन किया है, और यह एक दाएं हाथ की समन्वय प्रणाली है।

शायद यह मदद कर सकता है। http://www.geometrictools.com/Documentation/LeftHandedToRightHanded.pdf

+0

ज़ेड-अक्ष द्वारा "स्क्रीन में" मेरा मतलब सकारात्मक ज़ेड था (बड़ा बिंदु जेड-समन्वय है, यह दूर है)। मैं glscale का उपयोग नकारात्मक मानों या इस तरह से कुछ भी नहीं करता, इसलिए यह मेरे लिए थोड़ा सा रहस्य है। – majaen

+0

@ माजेन: शायद आप मॉडलव्यू मैट्रिक्स को अलग-अलग सेट अप करें। जेड जितना बड़ा होगा उतना ही निकट वस्तुएं आपके लिए हैं। – SigTerm

+1

क्या आप वाकई कोड में कहीं भी अक्ष में से एक को "फ़्लिप" नहीं कर रहे हैं? मुझे याद है (विंडोज़ में एक सिस्टम को समायोजित करने के लिए मैंने कुछ अक्षों को फिसल दिया और यहां तक ​​कि ऊपरी बाईं ओर मूल बना दिया। ऐसा लगता है कि कोड में कहीं कुछ अजीबता पैदा कर रहा है। – JustBoo

1

यह निर्भर करता है कि आप कैसे आकर्षित करते हैं।

मॉडलव्यू के लिए पहचान और नियमित ग्लू प्रक्षेपण के लिए संभावित रूप से एक इनपुट समन्वय प्रणाली की अपेक्षा की जाएगी जो सही है (जैसा कि जस्टबू का उल्लेख है, -ज स्क्रीन में है)।

यदि आप मैट्रिक्स का एक अलग सेट लोड करते हैं, हालांकि, मैट्रिक्स में निर्देशांक में से किसी एक को फ़्लिप करने से आपको कुछ भी नहीं रोकता है, जिसके परिणामस्वरूप बाएं हाथ की प्रणाली होती है। (या फ्लिप नहीं है। gluPerspective/glFrustum वास्तव में जेड निर्देशांक flips)। ऐसा करने के दौरान कुछ व्यावहारिक चीजें ध्यान में रखनी चाहिए, जैसे कि घुमाने के लिए घुमावदार आदेश।

5

मुझे क्या याद आ रही है?

में (के व्यूपोर्ट) बाएं हाथ प्रणाली x अंक सही, y अंक, z अंक आगे (दूर दर्शक से)।

दाएं हाथ में x अंक दाएं, y अंक ऊपर, z पिछड़े बिंदु (दर्शक की ओर)।

Picture

चित्र wikipedia से लिया जाता है।

x अंगूठे है, y सूचकांक उंगली है और z मध्यम उंगली है।

+0

लिंक के लिए धन्यवाद, इस छवि के साथ व्याख्या करने के लिए यह बहुत आसान है :) – Calvin1602