2011-05-06 22 views
8

मुझे अपनी ऑब्जेक्ट्स को विश्व समन्वय में समन्वयित करने के लिए एक आसान तरीका चाहिए, ताकि कोई उन्हें उस समन्वय प्रणाली में ढूंढ सके और टकराव का पता लगा सके?स्थानीय ऑब्जेक्ट निर्देशांक को विश्व निर्देशांक में कैसे परिवर्तित करें?

+0

मैं रेखीय बीजगणित या मा के बारे में के बारे में पढ़ने की सलाह देते त्रिभुज बीजगणित और ग्राफिक्स पर एक पुस्तक भी। –

उत्तर

24

सबसे पहले, कुछ पृष्ठभूमि। 3 डी ग्राफिक्स में, आप कई वेक्टर रिक्त स्थान के बारे में चिंता करने की जरूरत:

  • मॉडल अंतरिक्ष - इन आमतौर पर निर्देशांक हैं आप ओपन
  • विश्व अंतरिक्ष करने के लिए निर्दिष्ट - निर्देशांक दुनिया में कुछ केंद्रीय बिंदु के संबंध में निर्दिष्ट कर रहे हैं।
  • देखें स्थान - निर्देशांक को कैमरे के संबंध में निर्दिष्ट किया गया है
  • प्रोजेक्शन स्पेस - स्क्रीन पर सबकुछ प्रत्येक आयाम में [-1, +1] अंतराल में फिट बैठता है।

निर्देशांक एक ही ढंग से निर्दिष्ट कर रहे हैं, इसलिए प्रत्येक सदिश घटकों (x, y, z, w), जहां w एक स्केलिंग कारक है। आप 3-स्पेस में (x/w, y/w, z/w) के रूप में निर्देशांक प्राप्त कर सकते हैं। परिप्रेक्ष्य प्रक्षेपण जैसे कुछ परिवर्तनों के लिए स्केलिंग कारक की आवश्यकता होती है जो गैर-समरूप समन्वय के साथ संभव नहीं होगा।

4x4 matrices को एक वेक्टर स्पेस से दूसरे में निर्देशांक बदलने के लिए आवश्यक है। आप तीन विभिन्न मैट्रिक्स हो सकता है:

  • मॉडल मैट्रिक्स (दुनिया के लिए मॉडल)
  • देखें मैट्रिक्स (दुनिया को देखने के लिए)
  • प्रोजेक्शन मैट्रिक्स (प्रक्षेपण अंतरिक्ष के लिए दृश्य)

आप परियोजना होगा

C' = P * V * M * C 

ओपन प्रशिक्षु: एक सूत्र का उपयोग कर स्क्रीन पर समन्वय C सहयोगी दो matrices रखता है: modelview (मॉडल और एक साथ गुणा देखें), और प्रक्षेपण। एक बनावट मैट्रिक्स भी है जिसके बारे में हम चिंता नहीं करेंगे। जब आप glMatrixMode पर कॉल करते हैं, तो आप इन मैट्रिक्स के बीच स्विच कर रहे हैं। आप glLoadIdentity का उपयोग कर पहचान मैट्रिक्स के साथ वर्तमान मैट्रिक्स को प्रतिस्थापित करते हैं। आप glTranslatef, glRotatef, या gluProjection जैसे कार्यों के साथ वर्तमान मैट्रिक्स में परिवर्तन लागू करते हैं। इनमें से प्रत्येक कार्य केवल 4x4 मैट्रिक्स बनाता है जो विशिष्ट परिवर्तन को लागू करता है, उसके बाद वर्तमान मैट्रिक्स को गुणा करता है। आप देख सकते हैं कि रूपांतरण मैट्रिस OpenGL 2.1 reference pages में क्या हैं।


अब वास्तविक उत्तर के लिए। आपको अपने दृश्य में प्रत्येक ऑब्जेक्ट के लिए 4x4 मॉडल मैट्रिक्स को बनाए रखने की आवश्यकता है। मॉडल मैट्रिक्स में मॉडल निर्देशांक को विश्व निर्देशांक में बदलने के लिए आवश्यक सभी परिवर्तन शामिल होंगे।, बस w = 1 निर्धारित करते हैं,

T = [ 1 0 0 x ] 
    [ 0 1 0 y ] 
    [ 0 0 1 z ] 
    [ 0 0 0 1 ] 
M' = M * T 

फिर आप दुनिया अंतरिक्ष में निर्देशांक (सुनिश्चित करें कि वे समरूप निर्देशांक पहले कर रहे हैं पाने के लिए अपने मॉडल मैट्रिक्स का उपयोग कर सकते हैं: उदाहरण के लिए, हर बार जब आप glTranslate कहते हैं, आप अपने मॉडल मैट्रिक्स को अद्यतन करेगा वे नहीं हैं):

V' = V * M 

आप समानांतर में इन परिवर्तनों को बनाए रखने रहे हैं, आप वास्तव में अब और ओपन modelview मैट्रिक्स को बनाए रखने की जरूरत नहीं है। आप अपने मॉडल मैट्रिक्स को अपने शेडर्स के लिए वर्दी के रूप में पास कर सकते हैं। आप अपने तरीके और प्रक्षेपण मैट्रिक्स को इसी तरह से बनाए रख सकते हैं। ओपनजीएल के हाल के संस्करणों में यह आवश्यक है; सभी मैट्रिक्स हैंडलिंग कार्यों को बहिष्कृत कर दिया गया है।

+1

मैं अपने मॉडल मैट्रिक्स को कैसे बनाए रखूं ??? –

+0

@Shazad, कुछ पृष्ठभूमि जानकारी और एक और विस्तार स्पष्टीकरण जोड़ा। उम्मीद है की वो मदद करदे। –

+0

@Jay: सबसे पहले आपने कहा 'सी' = पी * वी * एम * सी', अंत में, आप कहते हैं कि 'वी' = एम * वी'। मैं थोड़ी उलझन में हूं, क्योंकि एक बार यह 'वी * एम' और एक बार 'एम * वी' है। मैट्रिक्स गुणा कम्यूटिव नहीं है, इसलिए 'ए * बी! = बी * ए'। क्या यह हो सकता है कि आपके उत्तर में आदेश गलत है? शायद यह भी मेरा गणित गलत है, हालांकि, उस मामले में मुझे सही करने के लिए स्वतंत्र महसूस करें। – Mecki

4

आप वर्चुअल कैमरा दृश्य मैट्रिक्स (वी-1) बार वस्तु का ModelView मैट्रिक्स (वी * एम) विश्व निर्देशांक पाने के लिए की प्रतिलोम के उत्पाद का उपयोग कर सकते हैं।

तुम बस के बाद gluLookAt() फ़ंक्शन का उपयोग कर वी मिलती है:

glGetFloatv (GL_MODELVIEW_MATRIX, camViewMatrix)

तो मैट्रिक्स को उलटने और यह स्टोर, (गुणा बाद में कोड में के लिए इस्तेमाल किया।)

आप कोई बिंदु जहां के बारे में वस्तु आकर्षित करने के लिए कर रहे हैं पर वी * एम पाने के तुरंत बाद सभी glTranslatef(), glRotatef() और glScale() एक ही जीएल समारोह का उपयोग कर आदेशों:

glGetFloatv (GL_MODELVIEW_MATRIX, objectsModelVie wMatrix);

वी-1 * (वी * एम) == एम

तो कई दो मेट्रिसेस, परिणामस्वरूप मैट्रिक्स स्थिति, M12 = एक्स, शामिल M13 = y और M14 = z

अधिक पर सी कोड के साथ विवरण: https://sourceforge.net/p/openantz/wiki/Local_to_World_Coordinates/

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

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