हम कैमरे की जगह दुनिया को क्यों हिलाते हैं?


87

मैंने सुना है कि एक ओपनजीएल गेम में हम खिलाड़ी को स्थानांतरित करने के लिए क्या करते हैं वह कैमरा को स्थानांतरित करने के लिए नहीं है, बल्कि पूरी दुनिया को स्थानांतरित करने के लिए है।

उदाहरण के लिए यहाँ इस ट्यूटोरियल का एक एक्सट्रैक्ट है: ओपनजीएल मैट्रिक्स

वास्तविक जीवन में आप एक निश्चित दृश्य के दृश्य को बदलने के लिए कैमरे को स्थानांतरित करने के लिए उपयोग किए जाते हैं, ओपनजीएल में यह दूसरा तरीका है। OpenGL में कैमरा स्थानांतरित नहीं हो सकता है और इसे नकारात्मक Z दिशा का सामना करते हुए (0,0,0) पर स्थित होना चाहिए। इसका मतलब है कि कैमरे को हिलाने और घुमाने के बजाय, उपयुक्त दृश्य के निर्माण के लिए दुनिया को घुमाया और कैमरे के चारों ओर घुमाया गया।

हम ये क्यों करते हैं?


1
एक कैमरा एक प्रक्षेपण दृश्य के अलावा और कुछ नहीं दर्शाता है। इसलिए आप अपने इच्छित प्रक्षेपण को पाने के लिए दुनिया को बदल देते हैं। अवधारणा अजीब है, लेकिन यह वास्तव में समझ में आता है ... एक तरह से ... मुझे लगता है
सिडर

@ शेराथिस, मैंने बेहतर स्पष्टीकरण के साथ अपने उत्तर में सुधार किया है। गणित और 3 डी कैमरा (वर्चुअल कैमरा) विकल्प के साथ जोड़ा गया प्रोजेक्शन परिप्रेक्ष्य। आपके और दूसरों के लिए मददगार हो सकता है।
एमडी महबूबुर्रहमान

4
यह वास्तव में सच नहीं है, क्योंकि दोनों ऑपरेशन (कैमरा, या दुनिया में वस्तुओं को स्थानांतरित करना) सममित हैं, यह बताने का कोई तरीका नहीं है कि कौन सा ऑपरेशन हुआ है। आप कैमरे के बारे में घूमते हुए दुनिया के बारे में सोच रहे हैं, लेकिन समान रूप से कोई और दुनिया के बारे में उल्टे चलते हुए कैमरे की कल्पना कर सकता है ... ठीक है, इसलिए आप एक दूसरे के सापेक्ष वस्तुओं को स्थानांतरित कर सकते हैं, इसलिए एक ही तरीका अधिक सहज हो सकता है, लेकिन न तो व्यक्ति "गलत" है, स्थिति को देखने के दोनों तरीके अलग-अलग स्थितियों में अच्छे हैं। अक्सर दोनों के बारे में सोचना मददगार होता है।
user3728501

जवाबों:


72

क्यों ?

क्योंकि, A कैमरा प्रक्षेपण दृश्य को दर्शाता है।

लेकिन 3D कैमरा (वर्चुअल कैमरा) के मामले में, दुनिया के बजाय कैमरा चलता है। मैंने इस जवाब का बाद में विस्तृत विवरण दिया है।

गणितीय रूप से समझना

प्रोजेक्शन दृश्य अंतरिक्ष में घूमता है और इसके अभिविन्यास को बदलता है। ध्यान देने वाली पहली बात यह है कि स्क्रीन पर वांछित प्रक्षेपण दृश्य दिशा के साथ नहीं बदलता है।

इस कारण से, हम वांछित प्रक्षेपण पाने के लिए अन्य चीजों को बदल देते हैं।

Http://opengl.org से समझना

कैमरे को हिलाने की उपस्थिति देने के लिए, आपके ओपनग्ल्ल एप्लिकेशन को कैमरे के परिवर्तन के व्युत्क्रम के साथ दृश्य को स्थानांतरित करना होगा। जहां OpenGL का संबंध है, वहां कोई कैमरा नहीं है। अधिक विशेष रूप से, कैमरा हमेशा आँख के स्थान पर स्थित होता है (0, 0, 0)

Http://open.gl से समझ

इसके अलावा http://open.gl/transformations के मैट्रिक्स मैट्रिक्स भाग से निम्न पंक्तियाँ साझा करना चाहते हैं

एक कैमरा परिवर्तन का अनुकरण करने के लिए, आपको वास्तव में उस परिवर्तन के उलट दुनिया को बदलना होगा। उदाहरण: यदि आप कैमरे को ऊपर ले जाना चाहते हैं, तो आपको इसके बजाय दुनिया को नीचे ले जाना होगा।

परिप्रेक्ष्य से समझना

वास्तविक दुनिया में, हम चीजों को इस तरह से देखते हैं, जिसे "परिप्रेक्ष्य" कहा जाता है।

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

वह परिप्रेक्ष्य है। 3 डी परियोजनाओं में परिप्रेक्ष्य महत्वपूर्ण है। परिप्रेक्ष्य के बिना, 3D दुनिया वास्तविक नहीं लगती है।

हालांकि यह स्वाभाविक और स्पष्ट लग सकता है, यह विचार करना महत्वपूर्ण है कि जब आप कंप्यूटर पर 3 डी रेंडरिंग बनाते हैं तो आप कंप्यूटर स्क्रीन पर एक 3 डी दुनिया का अनुकरण करने का प्रयास कर रहे हैं, जो एक 2 डी सतह है।

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

इसलिए, जब 3D में किसी दृश्य का अनुकरण करने के लिए 3D रेंडरिंग का उपयोग किया जाता है और फिर आपकी स्क्रीन की 2D सतह पर 3D दृश्य पेश किया जाता है, तो प्रक्रिया को परिप्रेक्ष्य प्रक्षेपण कहा जाता है।

सहज ज्ञान युक्त कल्पना करके शुरू करें कि आप क्या हासिल करना चाहते हैं। यदि कोई ऑब्जेक्ट दर्शक के करीब है, तो ऑब्जेक्ट को बड़ा होना चाहिए। यदि ऑब्जेक्ट दूर है, तो यह छोटा होना चाहिए। इसके अलावा, यदि कोई वस्तु दर्शक से दूर, सीधी रेखा में यात्रा कर रही है, तो आप चाहते हैं कि वह स्क्रीन के केंद्र की ओर अभिमुख हो, क्योंकि यह दूर तक दूर तक जाती है।

गणित में परिप्रेक्ष्य का अनुवाद

जैसा कि आप निम्नलिखित चित्र में दृष्टांत देखते हैं, कल्पना करें कि कोई वस्तु आपके 3 डी दृश्य में तैनात है। 3 डी दुनिया में, वस्तु की स्थिति को एक्सडब्ल्यू, वाईडब्ल्यू, जेडडब्ल्यू के रूप में वर्णित किया जा सकता है, आंख के बिंदु में मूल के साथ एक 3 डी समन्वय प्रणाली का जिक्र है। यह वह जगह है जहाँ वस्तु को वास्तव में स्क्रीन से परे 3D दृश्य में स्थित किया जाता है।

यहाँ छवि विवरण दर्ज करें

जैसा कि दर्शक स्क्रीन पर इस ऑब्जेक्ट को देखता है, 3 डी ऑब्जेक्ट को एक्सपी और वाईपी के रूप में वर्णित 2 डी स्थिति के लिए "अनुमानित" किया जाता है, जो स्क्रीन के 2 डी समन्वय प्रणाली (प्रक्षेपण विमान) का संदर्भ देता है।

इन मूल्यों को गणितीय सूत्र में डालने के लिए, मैं विश्व निर्देशांक के लिए एक 3 डी समन्वय प्रणाली का उपयोग करूंगा, जहां x अक्ष दाईं ओर इंगित करता है, y इंगित करता है, और स्क्रीन के अंदर सकारात्मक z अंक। 3D मूल, दर्शक की आंख के स्थान को संदर्भित करता है। तो, स्क्रीन का ग्लास एक विमान ओर्थोगोनल (समकोण पर) z- अक्ष पर है, कुछ z पर जिसे मैं zProj कहूँगा।

आप अनुमानित पदों xP और yP की गणना कर सकते हैं, दुनिया की स्थिति xW और yW को विभाजित करके, zW, जैसे:

xP = K1 * xW / zW
yP = K2 * yW / zW

K1 और K2 ऐसे स्थिरांक हैं जो ज्यामितीय कारकों से प्राप्त होते हैं जैसे कि आपके प्रोजेक्शन प्लेन का पहलू अनुपात (आपका व्यूपोर्ट) और आपकी आंख का "व्यू फील्ड", जो वाइड-एंगल विजन की डिग्री को ध्यान में रखता है।

आप देख सकते हैं कि यह परिवर्तन किस प्रकार परिप्रेक्ष्य का अनुकरण करता है। स्क्रीन के किनारों के पास के बिंदु केंद्र की ओर धकेले जाते हैं क्योंकि आंख (zW) से दूरी बढ़ती है। इसी समय, केंद्र (0,0) के करीब बिंदु आंख से दूरी से बहुत कम प्रभावित होते हैं और केंद्र के करीब रहते हैं।

Z द्वारा यह विभाजन प्रसिद्ध "परिप्रेक्ष्य विभाजित है।"

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

अन्य महत्वपूर्ण मामले

  • 3D कैमरा (वर्चुअल कैमरा) के मामले में, दुनिया के बजाय कैमरा चलता है।

3 डी कैमरों की बेहतर समझ पाने के लिए, कल्पना करें कि आप एक फिल्म की शूटिंग कर रहे हैं। आपको एक दृश्य सेट करना होगा जिसे आप शूट करना चाहते हैं और आपको एक कैमरा चाहिए। फुटेज प्राप्त करने के लिए, आप अपने कैमरे के साथ दृश्य के माध्यम से घूमेंगे, दृश्य में वस्तुओं को विभिन्न कोणों और बिंदुओं से शूट करेंगे।

एक ही फिल्मांकन प्रक्रिया एक 3D कैमरे के साथ होती है। आपको "वर्चुअल" कैमरा चाहिए, जो आपके द्वारा बनाए गए "वर्चुअल" दृश्य में घूम सकता है।

दो लोकप्रिय शूटिंग शैलियों में एक चरित्र की आंखों के माध्यम से दुनिया को देखना शामिल है (जिसे पहले व्यक्ति कैमरा के रूप में भी जाना जाता है) या एक चरित्र पर कैमरे की ओर इशारा करते हुए और उन्हें ध्यान में रखते हुए (तीसरे व्यक्ति के कैमरे के रूप में जाना जाता है)।

यह एक 3D कैमरे का मूल आधार है: एक आभासी कैमरा जिसे आप एक 3D दृश्य में घूमने के लिए उपयोग कर सकते हैं, और एक विशिष्ट दृष्टिकोण से फुटेज को प्रस्तुत कर सकते हैं।

विश्व स्थान और दृश्य स्थान को समझना

इस तरह के व्यवहार को कोड करने के लिए, आप कैमरे के दृष्टिकोण से 3D दुनिया की सामग्री को प्रस्तुत करेंगे, न कि केवल दुनिया के समन्वय प्रणाली के दृष्टिकोण से, या किसी अन्य निश्चित दृष्टिकोण से।

सामान्यतया, एक 3D दृश्य में 3D मॉडल का एक सेट होता है। मॉडल को अपने स्वयं के समन्वय प्रणाली के संदर्भ में वर्टिकल और त्रिकोण के एक सेट के रूप में परिभाषित किया गया है। वह स्थान जिसमें मॉडल परिभाषित किए जाते हैं, मॉडल (या स्थानीय) स्थान कहलाता है।

मॉडल ऑब्जेक्ट्स को 3D दृश्य में रखने के बाद, आप "वर्ल्ड ट्रांस्फ़ॉर्म" मैट्रिक्स का उपयोग करके इन मॉडलों के कोने को बदल देंगे। प्रत्येक ऑब्जेक्ट की अपनी विश्व मैट्रिक्स होती है जो परिभाषित करती है कि ऑब्जेक्ट दुनिया में कहां है और यह कैसे उन्मुख है।

इस नई संदर्भ प्रणाली को "विश्व स्थान" (या वैश्विक स्थान) कहा जाता है। इसे प्रबंधित करने का एक सरल तरीका प्रत्येक वस्तु के लिए एक विश्व परिवर्तन मैट्रिक्स को संबद्ध करना है।

3D कैमरे के व्यवहार को कार्यान्वित करने के लिए, आपको अतिरिक्त चरण करने होंगे। आप विश्व का संदर्भ देंगे - विश्व की उत्पत्ति के लिए नहीं - बल्कि स्वयं 3D कैमरे के संदर्भ प्रणाली के लिए।

एक अच्छी रणनीति में कैमरे को 3 डी दुनिया में वास्तविक 3 डी ऑब्जेक्ट के रूप में माना जाता है। किसी भी अन्य 3 डी ऑब्जेक्ट की तरह, आप 3 डी दुनिया में वांछित स्थिति और अभिविन्यास पर कैमरा लगाने के लिए "विश्व परिवर्तन" मैट्रिक्स का उपयोग करते हैं। यह कैमरा वर्ल्ड ट्रांसफॉर्म मैट्रिक्स मैट्रिक्स को ऑब्जेक्ट को वास्तविक (xc, yc, zc) स्थिति और विश्व रोटेशन के लिए, आगे (Z- अक्ष के साथ) घूमते हुए, मूल से बदल देता है।

निम्नलिखित आंकड़ा विश्व (x, y, z) समन्वय प्रणाली और दृश्य (कैमरा) (x ', y', z ') समन्वय प्रणाली के बीच संबंधों को दर्शाता है।

यहाँ छवि विवरण दर्ज करें


5
अन्य उत्तर हैं। आपको उन्हें अपने में संपादित करने की आवश्यकता नहीं है।
जेसी दोर्से

1
@ नोक्ट्रीन, धन्यवाद। यह मेरे लिए अज्ञात था कि इंटर पेज लिंकिंग कैसे बनाई जाए।
एमडी महबूबुर रहमान

"अगले भाग में, आप इस परिप्रेक्ष्य प्रोजेक्शन फॉर्मूले का उपयोग एक्शनस्क्रिप्ट में करेंगे जिसका उपयोग आप अपनी फ़्लैश 3 डी परियोजनाओं में कर सकते हैं।" चूँकि मूल प्रश्न में Flash 3D प्रोजेक्ट का कोई उल्लेख नहीं है, इससे मुझे लगता है कि आप इसे कहीं और से कॉपी-पेस्ट कर सकते हैं, जो ठीक है, यदि आप अपने स्रोतों का हवाला देते हैं।
गिल

@Gilles, मेरी गलती के लिए क्षमा करें। मैंने अपना उत्तर संपादित कर दिया है। मैंने कई स्रोतों का अध्ययन करके उत्तर तैयार किया है। और जैसा कि आपने बताया कि बहुत-बहुत धन्यवाद। :)
एमडी महबूबुर रहमान

ध्यान दें कि glMatrixMode()और कुछ और फ़ंक्शंस जो इसमें बताए गए हैं: eng.utah.edu/~cs6360/Lectures/frustum.pdf और opengl.org/archives/resources/faq/technical/viewing.htm को हटा दिया गया है। हालाँकि गणितीय विवरण सही और उपयोगी है।
patryk.beza

28

महबूब आर अमान का जवाब काफी सही है और वे जो लिंक देते हैं, वह गणित को सही ढंग से समझाते हैं, लेकिन अगर आप कम तकनीकी / मैथी का जवाब चाहते हैं, तो मैं एक अलग तरीका आजमाऊंगा।

वास्तविक दुनिया और खेल की दुनिया में वस्तुओं के पदों को कुछ समन्वय प्रणाली के साथ परिभाषित किया गया है। एक समन्वय प्रणाली स्थिति मूल्यों को अर्थ देती है। अगर मैं आपको बताता हूं कि मैं "100,50" पर हूं, तो यह आपकी मदद नहीं करेगा, जब तक आप यह नहीं जानते कि उन नंबरों का मतलब क्या है (वे मील, किलोमीटर, अक्षांश और देशांतर, आदि)। यदि वे कार्टेशियन निर्देशांक ("सामान्य" प्रकार के निर्देशांक) हैं, तो आपको यह भी जानना होगा कि वे किस मूल के सापेक्ष हैं; अगर मैं सिर्फ कहता हूं "मैं 100 फीट पूर्व की ओर हूं, तो आपको" पूर्व क्या है , " जानने की जरूरत है , जिसे समन्वय मूल कहा जाता है।

यह सोचने का एक आसान तरीका है। आप किसी को बता सकते हैं "ट्रेन स्टेशन शहर के दक्षिण-पश्चिम कोने से 3 किलोमीटर उत्तर और 1.5 किलोमीटर पूर्व में है।" आप किसी को यह भी बता सकते हैं "ट्रेन स्टेशन 1 मील सीधे उत्तर में है जहां मैं अभी हूं।" दोनों निर्देशांक सही हैं और एक ही लैंडमार्क के स्थान की पहचान करते हैं, लेकिन उन्हें एक अलग मूल से मापा जाता है, और इसलिए अलग-अलग संख्यात्मक मान हैं।

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

एल्गोरिथ्म जो वास्तव में आपकी स्क्रीन पर एक व्यक्तिगत त्रिकोण प्रदान करता है, एक विशेष तरीके से काम करता है, और इसलिए यह प्रतिपादन करते समय दुनिया के निर्देशांक के साथ सीधे काम करने के लिए सुविधाजनक नहीं है। गणित वास्तव में ऐसी जानकारी से निपटने के लिए सेट नहीं है जैसे "वस्तु दुनिया के केंद्र के दाईं ओर 100 इकाइयां है।" इसके बजाय गणित "कैमरे के सामने सीधे वस्तु, और 20 यूनिट दूर" के साथ काम करना चाहता है। इसलिए, ऑब्जेक्ट वर्ल्ड पोज़िशन लेने और कैमरा कोऑर्डिनेट सिस्टम से उन्हें ट्रांसलेट करने के लिए रेंडरिंग मैथ में एक अतिरिक्त स्टेप जोड़ा गया है।

बेशक कैमरे की एक स्थिति और एक अभिविन्यास भी है। इसलिए यदि कोई वस्तु 20,100,50 की स्थिति में है और कैमरा 10,200, -30 की स्थिति में है, तो कैमरे के सापेक्ष वस्तु की स्थिति 10,100,80 (वस्तु की स्थिति कैमरा की स्थिति से शून्य) है। जब कैमरा किसी गेम में चलता है, तो दुनिया के निर्देशांक में वह कैमरा पोजीशन बिल्कुल वैसी ही हो जाती है, जैसी आप उम्मीद करते हैं।

ध्यान दें कि वस्तुओं को स्थानांतरित नहीं किया जाता है ; वे वहीं रह रहे हैं जहां वे पहले थे। हालांकि, उनकी स्थिति अब एक अलग समन्वय मूल के सापेक्ष व्यक्त की जा रही है। ऑब्जेक्ट की दुनिया निर्देशांक केवल तभी चलती है जब ऑब्जेक्ट स्वयं चलता है, लेकिन जब भी कैमरा चलता है, तो इसका कैमरा निर्देशांक भी बदलता है, क्योंकि वे कैमरे की स्थिति के सापेक्ष हैं।

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

यदि यह समझने में और मदद मिलती है कि गणित कैमरा निर्देशांक के बारे में क्यों परवाह करता है, तो इस अभ्यास को आज़माएं: अपने हाथों को अपने अंगूठे और अग्रभाग को छूने के लिए एक साथ रखें (आयत को "व्यूपोर्ट" कहते हैं) और कमरे में चारों ओर देखें में, एक वस्तु का पता लगाएं, और इसे देखें, फिर इसे चारों ओर देखें लेकिन सीधे उस पर नहीं। जब आप ऐसा करते हैं, तो अपने आप से पूछें, "मेरे व्यूपोर्ट में ऑब्जेक्ट कहाँ है?" उस ऑब्जेक्ट में कुछ विशिष्ट वास्तविक दुनिया के देशांतर और अक्षांश हैं जिनका उपयोग आप पृथ्वी पर स्थित स्थान को इंगित करने के लिए कर सकते हैं, लेकिन यह आपको कुछ भी नहीं बताता है कि आप क्या देख रहे हैं। हालांकि, "ऑब्जेक्ट मेरे व्यूपोर्ट के ऊपरी बाएं कोने में है और लगभग 2 मीटर की दूरी पर दिखता है" आपको काफी कुछ बताता है, हालांकि। आपने अपने सिर और आपके द्वारा दिशा के सापेक्ष एक समन्वय प्रणाली बनाई है फिर से देखना जो परिभाषित करता है कि आपकी दृष्टि के अनुसार कोई वस्तु कहां है। यह मूल रूप से OpenGL / Direct3D के त्रिभुज रेखापुंज भाग की जरूरत है, और यही गणित की आवश्यकता है कि वस्तु स्थिति और अभिविन्यास उनके सुविधाजनक दुनिया निर्देशांक से कैमरा निर्देशांक में तब्दील हो।


यद्यपि मेरे लिए गणितीय स्पष्टीकरण स्पष्ट और समझने योग्य है, यह भी एक महान व्याख्या है! मेरा मानना ​​है कि आपने एक ही प्रश्न के साथ कई अन्य लोगों की मदद की।
डनिजार

+1 यह स्पष्ट करने के लिए कि क्या कैमरा चलता है या दुनिया सिर्फ एक फ़ंक्शन है जिसमें आप जिस समन्वय प्रणाली के बारे में बात कर रहे हैं।
डेविड मोल्स

11

बस अन्य दो (उत्कृष्ट) को जोड़ने से एक बिंदु पर कुछ और विस्तार का जवाब मिलता है जिसे महबूब आर आरमन ने स्पर्श किया: "कोई कैमरा नहीं है"।

यह काफी सच है और सामान्य "कैमरा" सादृश्य की विफलता का प्रतिनिधित्व करता है, क्योंकि "कैमरा" वास्तव में मौजूद नहीं है। यह महसूस करना महत्वपूर्ण है कि कैमरा सादृश्य सिर्फ इतना ही है - एक सादृश्य। यह वर्णन नहीं करता है (या वर्णन करने का नाटक) जिस तरह से चीजें वास्तव में पर्दे के पीछे काम करती हैं।

तो देखें (यह आप के लिए नया है) यह आपके सिर को गोल करने में मदद करने के साधन के रूप में है, लेकिन यह हमेशा याद रखें कि यह सिर्फ एक सहायक है और किसी भी तरह का वर्णन नहीं है जिस तरह से चीजें वास्तव में हैं।

अब, आपके पास ऑब्जेक्ट के दो वर्ग हैं जो यहां प्रासंगिक हैं: दृश्य बिंदु और दुनिया में सब कुछ। आप व्यू पॉइंट को कुछ ऑब्जेक्ट्स के करीब ले जाना चाहते हैं, लेकिन इस मूव के लिए अंतिम परिणाम वही होता है, जब व्यू ऑब्जेक्ट्स के करीब जाता है या फिर ऑब्जेक्ट्स व्यू के करीब जाते हैं या नहीं। आप जो कुछ भी कर रहे हैं, वह उनके बीच की दूरी को बदल रहा है; चूँकि वर्तमान दूरी X है और आप चाहते हैं कि नई दूरी Y हो, इससे कोई फर्क नहीं पड़ता कि आप किस ओर बढ़ते हैं, बस इतनी देर तक कि इस कदम के बाद नई दूरी Y है। इसलिए आप वास्तव में बिल्कुल नहीं बढ़ रहे हैं, आप 'बस एक दूरी बदल रहा हूँ। (मैं इस में सभी आइंस्टीन से अधिक आने का मतलब नहीं था ... ईमानदार!)

लेकिन, हालांकि, चूंकि कैमरा मौजूद नहीं है, केवल एक चीज जिसे आप बदल सकते हैं वह है ऑब्जेक्ट। तो आप वस्तुओं की दूरी को बदल देते हैं और बाहर भी वही परिणाम आता है। चूँकि सभी वस्तुएँ किसी भी तरह से रूपांतरित हो जाती हैं , यह कम या ज्यादा महंगी नहीं है।

एक सरल गणितीय व्याख्या अधिक मदद कर सकती है। आइए दिखाते हैं कि सभी निर्देशांक 1 डी हैं - दृष्टिकोण 0 पर है, आपकी वस्तुएं 4 पर हैं और आप चाहते हैं कि दृष्टिकोण 3 पर जाए। इसका मतलब है कि उनके बीच की दूरी 4 (4 - 0) से 1 तक बदल जाएगी (4) 3)। लेकिन चूँकि कैमरा मौजूद नहीं है आप उस 0 को नहीं बदल सकते; यह हमेशा 0 होने वाला है। इसलिए 3 से 0 जोड़ने के बजाय (जो आप नहीं कर सकते हैं) आप 4 से 3 घटाते हैं (जो आप कर सकते हैं) - ऑब्जेक्ट अब 1 पर हैं, और अंतिम परिणाम बहुत समान है - के बीच की दूरी दृष्टिकोण और वस्तुएं 1 है।


हालांकि जब कैमरा मौजूद नहीं है, तब भी आप परिवर्तन से पहले इसकी स्थिति की गणना कर सकते हैं। हालांकि कुछ मामलों में (गैर-अक्ष-संरेखित समानांतर प्रक्षेपण) आप "अनंत पर" (सकारात्मक या नकारात्मक), जो परिवर्तन मैट्रिक्स की तुलना में कम उपयोगी है, में से एक के साथ समाप्त हो जाएगा।
मार्टिन सोजका

7

कैमरा ले जाना या दुनिया को हिलाना दो समान रूप से मान्य विकल्प हैं जो दोनों एक ही चीज़ पर निर्भर करते हैं। दिन के अंत में आप एक समन्वय प्रणाली से दूसरे में बदल रहे हैं। उपरोक्त उत्तर सही हैं लेकिन आप किस तरह से कल्पना करते हैं यह एक ही सिक्के के दो पहलू हैं। ट्रांसफ़ॉर्मेशन किसी भी तरह से जा सकते हैं - वे एक दूसरे के व्युत्क्रम हैं।

रेंडरिंग प्रक्रिया का हिस्सा दुनिया के निर्देशांक से आँख के निर्देशांक में परिवर्तित होता है। हालांकि यह मॉडल करने का एक आसान तरीका आपके एप्लिकेशन में वर्चुअल कैमरा ऑब्जेक्ट के साथ है। कैमरा दोनों प्रक्षेपण मैट्रिक्स का प्रतिनिधित्व कर सकता है (जो कि परिप्रेक्ष्य प्रभाव के लिए ज़िम्मेदार है) और यह भी देखने वाला मैट्रिक्स है जिसका उपयोग विश्व अंतरिक्ष से नेत्र स्थान में परिवर्तित करने के लिए किया जाता है।

इसलिए हालांकि वर्टेक्स शेडर आपके ज्यामिति के निर्देशांक को नेत्र स्थान में बदलने के लिए व्यू मैट्रिक्स का उपयोग करता है, यह अक्सर आपके आभासी दुनिया के चारों ओर घूमने वाले एक कैमरा ऑब्जेक्ट के बारे में सोचना आसान होता है, क्योंकि यह दृश्य मैट्रिक्स को फिर से गणना करता है।

तो आपके आवेदन में, आप कैमरा को वर्ल्ड कॉर्ड्स में स्थानांतरित करते हैं, कैमर के व्यू मैट्रिक्स को अपडेट करते हैं, नए व्यू मैट्रिक्स को वर्टेकर शेल्डर में एक समान या ब्लॉक के हिस्से के रूप में पास करते हैं, अपने दृश्य को रेंडर करते हैं।


5

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

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


4

मुझे नहीं लगता है कि यह दावा स्पष्ट रूप से सच है, क्योंकि एक खेल में दुनिया केवल निर्देशांक को "स्थानांतरित" करती है, लेकिन वास्तव में आभासी कैमरे के निर्देशांक को बदल देती है।

कैमरे की अवधारणा वास्तव में क्या करती है, परिमित देखने वाले फ्रिज़म को बदल देती है - जो कि 8 कोने बिंदुओं (या 6 विमानों के प्रतिच्छेदन द्वारा परिभाषित) के साथ एक छोटा पिरामिड है, जो ओपनगेल के अंतिम चरणों में क्लिप स्पेस का प्रतिनिधित्व करता है। रेंडरिंग पाइपलाइन।

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


2

कैमरा ले जाना या दुनिया को हिलाना दो समान रूप से मान्य विकल्प हैं (और दोनों सच हैं)। दिन के अंत में हम एक समन्वय प्रणाली से दूसरे में बदल रहे हैं। ट्रांसफ़ॉर्मेशन किसी भी तरह से जा सकते हैं - वे एक दूसरे के व्युत्क्रम हैं।


2

यहाँ बहुत सारे अच्छे उत्तर हैं। मैं उनमें से किसी को भी दोहराने की कोशिश नहीं करूँगा। कभी-कभी कैमरे के संदर्भ में यह सोचना आसान होता है, जैसे कि Direct3D यह कैसे करता है (नोट: 9.0 पोस्ट के बहुत से नहीं खेला गया है)

"दुनिया को आगे बढ़ाना" जैसे कि फुतुराम अर्थ में कि किसी ने उद्धृत किया है, इसे देखने का एक बहुत अच्छा तरीका है ("इंजन जहाज को बिल्कुल भी नहीं हिलाते हैं। जहाज वही रहता है जहां वह है और इंजन ब्रह्मांड को चारों ओर घुमाते हैं।" यह! ")। यह वास्तव में 2D खेलों के लिए काफी सामान्य था। आपके पास शाब्दिक रूप से एक व्यूपोर्ट था कि आपके पास एक कठिन समय समायोजन होगा, और वह कभी-कभी आपकी वीडियो रैम या यूआई विंडो थी। यदि ओपनजीएल उन कारणों के लिए ऐसा करता है, तो यह बताना मुश्किल है।

आप निश्चित रूप से एक कैमरे के संदर्भ में 2 डी गति के बारे में सोच सकते हैं, और इस तरह की सोच प्रक्रिया से प्रभावों का पता लगाना आसान हो सकता है।


1
देर से, लेकिन अच्छा जवाब, भी!
दानीजार

धन्यवाद! मैंने हमेशा पाया कि खोज इंजन के माध्यम से मिलने वाले पृष्ठों पर चर्चा को जोड़ना बहुत सराहा जाता है, खासकर यदि जानकारी आसान या दिलचस्प है
जो प्लांट

2

ओपनगेट डॉक्स के लेखकों से शुरू होने वाली, यहाँ पूरी तरह से गलतफहमी होने लगती है ...

मुझे जल्दी से अपनी पवित्रता को बहाल करने दो: दुनिया चलती नहीं है , यह पुट रहता है। जो भी खिलाड़ी के चारों ओर घूमने के रूप में दुनिया को लागू करने की कोशिश करता है वह मल्टीप्लेयर मोड में जल्दी से मुसीबत में चला जाएगा। ऐसा नहीं है कि प्रत्येक खिलाड़ी के कदम पर दुनिया में लाखों (या अरबों) वस्तुओं की स्थिति को अपडेट करने के बजाय एक धीमी गेमप्ले बना देगा ...

तो, वहाँ वास्तव में क्या होता है, और बोली के साथ क्या हो रहा है?

ठीक है, सबसे पहले आपको एक समन्वय प्रणाली की अवधारणा को समझने की आवश्यकता है। आम तौर पर, आप दुनिया में एक बिंदु चुनते हैं और इसे "मूल" घोषित करते हैं, यह निर्देशांक (0,0,0) के साथ एक बिंदु है। आप तीन "मुख्य" दिशाओं को भी चुनते हैं, जिन्हें आप एक्स, वाई और जेड कहते हैं। जाहिर है, एक समन्वय प्रणाली आवंटित करने के कई तरीके हैं। आमतौर पर एक "विश्व समन्वय प्रणाली" है, इस प्रणाली में दुनिया स्थिर (कम या ज्यादा) है। एक गेम में इस प्रणाली को स्तरीय डिजाइनर द्वारा चुना जाएगा।

अब, यह भी एक और समन्वय प्रणाली पर विचार करने के लिए सुविधाजनक है, खिलाड़ी की आंख से बंधा हुआ है। इस समन्वय प्रणाली में खिलाड़ी हमेशा निर्देशांक (0,0,0) पर होता है, और दुनिया उसके चारों ओर घूमती और घूमती है। इस प्रकार उद्धरण सही है यदि आप समझते हैं कि खिलाड़ी के समन्वय प्रणाली में बनाया जा रहा है

हालाँकि दुनिया खिलाड़ी के निर्देशांक में काम नहीं करती है, यह दुनिया के निर्देशांक में काम करती है। और जहां दो समन्वय प्रणाली शामिल हैं, हमेशा एक तरह के निर्देशांक को दूसरे में बदलने का एक तरीका है। ओपनजीएल में यह 4x4 व्यू मैट्रिक्स का उपयोग करके किया जाता है।

अंततः, जब कोई खिलाड़ी चलता है, तो दुनिया स्थिर रहती है, जबकि खिलाड़ी को स्थानांतरित कर दिया जाता है। यह दुनिया के निर्देशांक में है, जिस तरह से आपके खेल में वस्तुओं को संग्रहीत किया जाता है। खिलाड़ी के पास एक दृश्य कैमरा भी होता है, और यह कैमरा उसी तरह दुनिया भर में घूमता है (इसके बावजूद कि OpenGL डॉक्स क्या कहते हैं)। हालांकि, उपयोगकर्ता की स्क्रीन पर दुनिया को दिखाने के लिए, सभी दृश्यमान वस्तुओं के निर्देशांक को ट्रांसफ़ॉर्मेशन मैट्रिक्स का उपयोग करके खिलाड़ी के समन्वय प्रणाली में अनुवादित किया जाता है, और फिर परिप्रेक्ष्य प्रभाव बनाने के लिए अतिरिक्त प्रक्षेपण लागू किया जाता है। इस खिलाड़ी की समन्वय प्रणाली में दुनिया वास्तव में खिलाड़ी के चारों ओर घूमती दिखाई देती है। लेकिन यह इसके बारे में सोचने का एक बहुत ही अनपेक्षित और भ्रामक तरीका है।


" ओपनजीएल डॉक्स के लेखकों से शुरू " सही, क्योंकि मुझे यकीन है कि ओपनग्ल के निर्माता स्पष्ट रूप से बहुत बेवकूफ हैं जो किसी दुनिया की प्रस्तुति (जिसके बारे में सभी ओपनजीएल के बारे में परवाह है) और उस दुनिया के वैचारिक प्रतिनिधित्व के बीच अंतर को समझना होगा ( कुछ नहीं है जो OpenGL से संबंधित है)।
निकोल बोलस

" लेकिन यह इसके बारे में सोचने का एक बहुत ही अनपेक्षित और भ्रमित करने वाला तरीका है। " यह सच्चाई भी है । और सच हमेशा झूठ से ज्यादा मददगार होता है। क्योंकि जल्दी या बाद में, वह झूठ आपको पकड़ लेगा और आपको सच्चाई का सामना करना पड़ेगा।
निकोल बोलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.