विहित दृश्य मात्रा का उद्देश्य क्या है?


15

मैं वर्तमान में OpenGL सीख रहा हूं और इस प्रश्न का उत्तर नहीं ढूंढ सका हूं।

प्रक्षेपण मैट्रिक्स को दृश्य स्थान पर लागू करने के बाद, दृश्य स्थान "सामान्यीकृत" है ताकि सभी बिंदुओं की सीमा [-1, 1] के भीतर हो। इसे आमतौर पर "कैनोनिकल व्यू वॉल्यूम" या "सामान्यीकृत डिवाइस निर्देशांक" के रूप में जाना जाता है।

जबकि मुझे बहुत सारे संसाधन मिले हैं जो मुझे बताते हैं कि यह कैसे होता है, मैंने ऐसा क्यों होता है इसके बारे में कुछ भी नहीं देखा है।

इस कदम का उद्देश्य क्या है?

जवाबों:


7

सबसे महत्वपूर्ण यह है कि यह आपके बिंदुओं (वर्टिक्स) को 3D वर्ल्ड स्पेस से 2D स्क्रीन स्पेस में परिवर्तित करता है।

इसका अर्थ है कि इस मैट्रिक्स के साथ वर्टेक्स गुणा होने के बाद स्क्रीन पर X और Y कॉर्ड्स की स्थिति होती है ([-1, 1] के बीच) और Z गहराई है। Z का उपयोग गहराई-बफ़र के लिए किया जाता है और पहचानता है कि समतल के पास आपके कैमरों से कितनी दूर (या टुकड़ा) है।

प्रोजेक्शन का मतलब है कि जो कोने समीप से अधिक समतल हैं वे स्क्रीन के मध्य से अधिक दूर हैं -> कैमरे के पास त्रिकोण अधिक बड़ा प्रतीत होता है जो कि दूर है। और यह आपके देखने के क्षेत्र पर आधारित है - आप इसे कुछ createProjectionMatrix फ़ंक्शन या createFrustum में दर्ज कर रहे हैं। यह काम करता है कि यह आपके कैमरे के फ्रिज़ को कैंची और तराजू करता है और यूनिट क्यूब में इसे खड़ा करता है। वे मान जो 1 से अधिक और -1 से छोटे हैं, प्रदर्शित नहीं किए जाते हैं।

पिक्सेल पहलू अनुपात भी रखता है, इसलिए पिक्सेल sqaure हो सकता है। यह सरल है। यह सिर्फ इस तरह कैमरा हताशा कैंची: अधिक व्यापक स्क्रीन -> अधिक ऊर्ध्वाधर कतरनी और इसके विपरीत।

सरल उत्तर:
यह आपके कैमरा फ्रैम को परिभाषित करता है और इसके लिए अच्छा है:

  • आपके पास जो वस्तुएं हैं, वे उन वस्तुओं की तुलना में बड़ी दिखती हैं जो आपसे दूर हैं।
  • पिक्सेल पहलू अनुपात रखें - हर कोई वर्ग पिक्सेल सही पसंद करता है? :)

मुझे ऐसा कोई हिस्सा दिखाई नहीं देता जहाँ वह पूछता है कि प्रक्षेपण मैट्रिक्स क्या करता है। वह सिर्फ यह सोचकर आश्चर्यचकित हो जाता है कि सामान्यीकृत डिवाइस निर्देशांक किस लिए हैं।
क्रिस का कहना है कि मोनिका

प्रक्षेपण मैट्रिक्स कैमरा छिन्नक परिभाषित करता है। लेकिन यह विहित देखने की मात्रा के रूप में [-1,1] होने का कारण नहीं बताता है। इसके बजाय [-100,100] क्यों नहीं है?
बोब्बोबो

1
क्योंकि 1 100 से अधिक "अधिक सामान्य संख्या" है: D (0 और भी अधिक सामान्य है, लेकिन घन 0x0x0 बहुत दिलचस्प नहीं है ...)
इवान कुकिर

5

यह उत्तर तथ्य के बाद लंबा है, लेकिन जब से मैंने इसे Google पर पाया है शायद यह अभी भी किसी की मदद करेगा। मैं सिर्फ यह स्पष्ट करना चाहता हूं कि जेसन और नोटाबिन क्या कह रहे थे: क्लिपिंग गणना करना बहुत आसान है (यह पता लगाना कि आपको क्या देखना चाहिए और क्या नहीं देखना चाहिए क्योंकि आप जिस तरह से देख रहे हैं, वह कितनी दूर है, ect ।)। यह जाँचने के बजाय कि क्या चीजें आपके दृश्य फ्रिज़म की सीमाओं पर विमानों को काटती हैं, आप बस x, y, z सब कुछ की तुलना xMax, xMin, yMax, ect से करते हैं। , क्योंकि आपके पास बस एक घन है। यह थोड़ा अधिक जटिल है यदि आप केवल कुछ दिखाने का हिस्सा चाहते हैं, लेकिन गणित अभी भी एक इकाई के साथ एक घन के साथ बेहतर है।

एक दंपति की बातें जो मुझे अन्य उत्तरों में भ्रामक लगीं:

-आप हताशा के दृश्य से किनारा नहीं कर रहे हैं, आप इसे समरूप मैट्रिक्स परिवर्तनों का उपयोग करके क्यूब में वार करने की तरह हैं।

-हम इस कदम के साथ एक 2D स्क्रीन में परिवर्तित नहीं कर रहे हैं। ऐसा करने के लिए यह कदम आवश्यक नहीं है। सैद्धांतिक रूप से हम अपने सभी काम पहले बिना घन में परिवर्तित किए कर सकते हैं, जो अधिक सहज लेकिन कठिन गणित होगा - लेकिन ग्राफिक्स सभी गणनाओं को वास्तव में तेजी से करने के बारे में हैं क्योंकि औसत खेल के लिए प्रति सेकंड बहुत सारी गणना होती है या जो भी हो।

अधिक विस्तार से: यह जरूरी नहीं कि एक यूनिट क्यूब है जिसे हम परिवर्तित कर रहे हैं, यह हमारे काम करने के लिए अधिकतम-न्यूनतम गणनाओं के लिए एक आयताकार बॉक्स होना चाहिए। वास्तव में कक्षा में हमने एक बॉक्स का उपयोग किया था, जहाँ कैमरा z- अक्ष से नीचे की ओर जाता है, z 0 से 1 तक जाता है, x -1 से 1 तक जाता है, और y -1 से 1 तक जाता है। सामान्य रूप से गणित 1, 0 में और -1 गणनाओं को आसान बनाने के लिए अच्छे नंबर हैं, मेरा मानना ​​है कि हम -100 से 100 या कुछ और क्यों नहीं करते हैं।

TLDR: यह क्लिपिंग को आसान बनाता है।

संपादित करें: bobobobo का सार है। सब कुछ त्रिकोण है, आम तौर पर: डी।

स्रोत: एक विश्वविद्यालय ग्राफिक्स वर्ग लेना


दिलचस्प होने के दौरान, ऐसा लगता है कि आपके बिंदु आंशिक रूप से सच हैं। आप एक सजातीय मैट्रिक्स का उपयोग नहीं कर रहे हैं, यह सिर्फ इतना है कि क्लिप स्पेस में, सजातीय अंतरिक्ष में बिंदुओं को परिभाषित किया गया है। 2) सच है, क्लिप स्पेस में अभी तक स्क्रीन पर प्रोजेक्ट नहीं किए गए हैं। यह परिप्रेक्ष्य के विभाजन के बाद होता है, हालांकि ध्यान दें कि यह आवश्यक रूप से तब होता है जब आप क्लिप स्पेस से वापस कार्टेसियन स्पेस में जाते हैं। 3) हाँ और नहीं। NDC स्थान के लिए निर्देशांक निर्देशांक बदलना अभी भी किसी तरह आवश्यक है। जो आवश्यक नहीं है वह क्लिप स्पेस है, जो कि GPU के लिए विशिष्ट है। ...
user18490

... यह क्लिप स्पेस स्टेज है जो आवश्यक नहीं है, यूनिट क्यूब को रीमैपिंग नहीं है। आपकी अंतिम धारणा भी सही नहीं है। आप -1 से 1 तक रीमैप करते हैं क्योंकि तब एनडीसी स्पेस से रैस्टर स्पेस (व्यूपोर्ट ट्रांसफॉर्म) जाना आसान हो जाता है। यह वास्तव में और भी आसान है यदि आप NDC स्पेस की सीमा [0,1] में है, जो कुछ कार्यान्वयन के लिए मामला है। अंत में यह सभी गणित है, हालांकि यकीन है कि अन्य सम्मेलनों का इस्तेमाल किया जा सकता है। अधिक जानकारी के लिए अच्छी स्क्रैटचैपिक्सल वेबसाइट देखें।
user18490


1

मेरा मानना ​​है कि यह इसलिए है क्योंकि ओपनजीएल यह प्रदर्शित नहीं कर सकता है कि छवि को कैसे प्रदर्शित किया जाए (पहलू अनुपात या रिज़ॉल्यूशन, हार्डवेयर विवरण, आदि)। यह एक मध्यवर्ती रूप में प्रस्तुत करता है और छवि बनाता है जो ऑपरेटिंग सिस्टम या ड्राइवर या जो कुछ भी सही रिज़ॉल्यूशन / आकार में होता है।


जब आप हार्डवेयर विवरण के बारे में बात कर रहे होते हैं तो आप सही नहीं होते हैं। गैर हैं। इसके अलावा अगर आप cpu पर अपना rastarizator लिख रहे हैं (इसे क्यों करें? यह जानने के लिए कि यह सामान कैसे काम करता है :)) आप gpu पर समान मेट्रिसेस का उपयोग कर रहे हैं। आप भाग्यशाली हैं कि मुझे अभी भी वोट देने के लिए विशेषाधिकार नहीं हैं :)
नोटबैन

क्या पहलू अनुपात को जानने की जरूरत नहीं है? जो मैं समझता हूं, वह एक्स और वाई के लिए स्केलिंग कारकों को संग्रहीत करता है ताकि बाद में छवि का सही पहलू अनुपात हो।
ब्रेडजेस

3
अगर मैं गलत हूं तो मुझे सुधारें, लेकिन वह आपके प्रोजेक्ट पॉइंट्स के बारे में बात कर रहा है, और इस तरह हम 2D बात कर रहे हैं। यदि ऐसा है, तो OpenGL को यह नहीं पता होता है कि स्क्रीन पर आप इस छवि को कहाँ रख रहे हैं, न ही इस बारे में कि यह कैसे प्रदर्शित होने वाली है। यह एक ऐसी छवि बनाता है जो तब सही तरीके से पैमाने और जगह पर करना आसान है, लेकिन यह आपके लिए ऐसा नहीं करता है। मैं इस बात से सहमत हूं कि हार्डवेयर विवरण इसके लिए एक बुरा नाम था, मेरा मतलब केवल उपरोक्त था। इसके अलावा, आप एक पहलू अनुपात के साथ एक प्रक्षेपण मैट्रिक्स निर्दिष्ट कर सकते हैं, लेकिन उस अनुपात को आपके मॉनिटर के समान नहीं होना चाहिए।
Chewy Gumball

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

2
आह! मैं यहां मुद्दा देखता हूं। उन्होंने कहा कि "इसे आम तौर पर" कैनोनिकल व्यू वॉल्यूम "या" सामान्यीकृत डिवाइस निर्देशांक "के रूप में जाना जाता है। मैं जवाब दे रहा था जैसे कि वह सामान्यीकृत डिवाइस निर्देशांक के बारे में पूछ रहा था, हालांकि वह वास्तव में उन लोगों के बारे में नहीं पूछ रहा था। वे वास्तव में, दो पूरी तरह से अलग चीजें हैं और यही कारण है कि हम यहां पर हैं। शायद यह स्पष्ट किया जाना चाहिए ताकि लोग वही गलती न करें जो मैंने किया था।
Chewy Gumball

1

मैं ध्यान देता हूं कि एक उत्तर पहले ही स्वीकार कर लिया गया है, लेकिन यह आम तौर पर क्लिपिंग के लिए उपयोगी होता है, क्योंकि दृश्य को एक यूनिट क्यूब में बदल दिया जाता है।


सच है, मैंने इस बारे में अधिक स्पष्ट होने के लिए अपने उत्तर को थोड़ा संपादित किया।
23

वैसे एक यूनिट क्यूब साइड 1 क्यूब है। इसलिए नाम अनुचित है। इसे विहित देखने की मात्रा कहा जाना चाहिए।
user18490

1

मैं भी यही सोच रहा हूं। कुछ बातों पर विचार करना होगा।

सबसे पहले, हाँ, दुनिया में सब कुछ उस यूनिट क्यूब में परिवर्तित हो जाता है [-1,1] जो मूल के आसपास केंद्रित है। अगर उस यूनिट क्यूब में कुछ नहीं है तो यह प्रदर्शित नहीं होने वाला है।

इस बारे में अच्छी बात यह है कि, आप त्रिकोणों को बहुत आसानी से खींच सकते हैं। (यदि किसी त्रिभुज के सभी 3 कोने हैं x > 1या x < -1फिर उस त्रिभुज को खींचा जा सकता है)।


0

मैं Scratchapixel पर परिप्रेक्ष्य प्रक्षेपण मैट्रिक्स पर पाठ की जांच करने की सिफारिश करूंगा

http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix

यह स्पष्ट रूप से बताता है कि क्यों एक इकाई क्यूब के लिए दृश्य को खाली जगह ताना जाता है। क्यों? अनिवार्य रूप से क्योंकि कैनवास पर 3D बिंदुओं को प्रोजेक्ट करने की प्रक्रिया में उन्हें NDC स्पेस में बदलने के लिए शामिल किया गया है, जो एक ऐसा स्थान है जिसमें स्क्रीन पर मौजूद बिंदुओं को रीमेक किया जाता है [-1,1] (स्क्रीन को वर्गाकार मानते हुए)। अब हम बिंदु Z- समन्वय को सीमा [0,1] तक सीमित कर देते हैं (या कभी-कभी [-1,1]) इसलिए अंत में आप एक घन के साथ समाप्त होते हैं। तथ्य यह है कि जब अंक एक घन में समाहित होते हैं, तो उन्हें देखने की प्रक्रिया की तुलना में आसान होता है जब उन्हें व्यू फ्रामर में परिभाषित किया जाता है (जो एक अजीब जगह है, एक छोटा पिरामिड)। एक और कारण यह है कि यह सीजी में एक ही स्थान (इकाई घन चीज़) की कल्पना कर सकते हैं। इस बात की परवाह किए बिना कि क्या आप उदाहरण के लिए एक परिप्रेक्ष्य या ऑथोग्राफिक प्रोजेक्शन का उपयोग करते हैं,

हालांकि हो सकता है कि आप बहुत ज्यादा फोकस क्यों करें। यूनिट क्यूब वास्तव में गणित के शामिल होने की प्रक्रिया का ही नतीजा है या स्क्रीन पर वर्टिकल प्रोजेक्ट करता है और फिर अपने निर्देशांक को रेखापुंज के लिए रिमैप करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.