खेल के विकास में क्षेत्र


19

मैं प्रोग्रामिंग और गेम प्रोग्रामिंग में नया हूं। मैंने वैक्टर और गणित के बारे में कुछ पढ़ा है, लेकिन मेरा एक सवाल है - मैं गेम प्रोग्रामिंग में वैक्टर का उपयोग कहां करूं? शायद कोई भी एक सरल उदाहरण दे सकता है जहां आप वैक्टर (2 डी में) का उपयोग कर रहे हैं?

मुझे उदाहरण मिले हैं, लेकिन ज्यादातर वे कंसोल में हैं जहां वे संख्याओं का उत्पादन करते हैं, और बड़े उदाहरण जो मुझे समझ में नहीं आते हैं।


बेसिक टीएल; डीआर वैक्टर रैखिक बीजगणित विषय का हिस्सा है और मैट्रिकीज का नेतृत्व करता है। मैट्रिकीज़ और लीनियर अलजेब्रा के साथ आप एक माइनस्वीपर सॉल्वर से 3 डी दुनिया के प्रक्षेपण के लिए कुछ भी लिखते हैं यह देखने के लिए कि आपके कर्सर के नीचे कौन सी वस्तु है। रेखीय बीजगणित किसी भी गेम डेवलपर के लिए गणित की सबसे उपयोगी और आवश्यक शाखा है। अब इसे जानें; आपको इसका पछतावा नहीं होगा।
रॉबर्ट मैसैलो

सभी भयानक जवाब के लिए धन्यवाद! लेकिन इस ट्यूटोरियल में वेक्टर का उपयोग क्यों नहीं किया गया है ?: zetcode.com/tutorials/javagamestutorial या एक डेवलपर का उपयोग अन्य नहीं?
vqwer

कहना मुश्किल है, शायद लेखक इसे शुरुआती लोगों के लिए सरल और बुनियादी रखना चाहते थे।
माईक सेमर

वास्तव में लेखक उनका उपयोग करता है, अंक-सरणी को class Star यहाँ देखें
Maik Semder

इसके अलावा यहाँ है Point2Dमें इस्तेमाल कियाclass ResizeRectangle
माइक Semder

जवाबों:


31

वैक्टर क्या हैं?

क्षेत्र अलग-अलग आयाम के निर्देशांक के सेट हैं। वेक्टर में प्रत्येक निर्देशांक वेक्टर के स्थान की उस दिशा में कुछ निरपेक्ष स्थिति का प्रतिनिधित्व करता है।

  • 1-डी वेक्टर {1} होगा । यह हो सकता है, उदाहरण के लिए, X = 1. या समय t = 1 पर एक स्थिति।
  • एक 2-D वेक्टर {-4,3} होगा । यह, उदाहरण के लिए, X- अक्ष पर -4, और Y- अक्ष पर 3 पर हो सकता है। यह एक्स-अक्ष पर वापस एक स्थिति (-4 मीटर) पर तापमान (3 डिग्री) भी हो सकता है।
  • 3-डी वेक्टर {1,2,3} होगा । यह एक्स-अक्ष के साथ अंतरिक्ष 1 में एक स्थिति, वाई-अक्ष पर 2 पीछे और जेड-अक्ष पर 3 अप हो सकता है। या यह एक रंग में 1 लाल, 2 हरा और 3 नीला हो सकता है। या, यह किसी समय T ( {3} ) पर XY स्थिति ( {1,2} ) हो सकता है ।

ध्यान दें कि सभी मामलों में, हमने अपनी समस्या के लिए वैक्टर को अर्थ सौंपा है। जब आप आमतौर पर खेलों में ज्यामिति के लिए उपयोग किए जा रहे वैक्टर पाएंगे, तो कोई कारण नहीं है कि आप उनके साथ कुछ और नहीं कर सकते।

मैं वैक्टर का उपयोग क्यों करूं?

सबसे पहले, आपको वैक्टर का उपयोग करने की आवश्यकता नहीं है । जब तक आप x और y का ट्रैक रख रहे हैं, या जो भी निर्देशांक आपकी परवाह करते हैं, किसी तरह से आप ठीक हैं।

हालांकि, वैक्टर का उपयोग करने का लाभ यह है कि वे बड़े करीने से दिशा और स्थिति जैसी चीजों का प्रतिनिधित्व करते हैं, और उन पर कई गणितीय संचालन भी परिभाषित होते हैं जो आपके जीवन को आसान बनाते हैं।

इन के एक साधारण उदाहरण के लिए, डॉट उत्पाद पर विचार करें

मान लीजिए कि आपके पास एक टॉप-डाउन स्टाइल गेम में रडार सिस्टम है। रडार के क्षेत्र में दिखाई देने वाले प्रत्येक दुश्मन (2 डी में कुछ पाई-आकार की कील) को आपकी स्क्रीन में थोड़ा लाल डॉट मिलना चाहिए। तो, आपको यह पता लगाने की आवश्यकता है कि आपके रडार अनुभाग में दुश्मन क्या हैं।

आप परीक्षण कर सकते हैं कि क्या दुश्मन एक त्रिकोण के अंदर हैं। आप यह भी परीक्षण कर सकते हैं कि अगर दुश्मन रडार क्षेत्र के दोनों तरफ को परिभाषित करने वाले विमानों / रेखाओं के दो आधे स्थानों के चौराहे में समाहित हैं।

या, आप चेक करने के लिए बस एक डॉट उत्पाद का उपयोग कर सकते हैं। ऐसे:

  1. रडार के केंद्र से "राडार के सामने" की ओर जाने वाला एक वेक्टर बनाएं। इसे सामान्य करें।
  2. रडार के केंद्र से जाने वाले एक वेक्टर को उस वस्तु की ओर बनाएं, जिसे हम रडार की दृश्यता की जांच करना चाहते हैं। इसे सामान्य करें।
  3. दो सामान्यीकृत वैक्टर के डॉट उत्पाद लें।
  4. उस उत्पाद का आर्कोसिन लें, और जांचें कि क्या यह रडार की चौड़ाई के आधे कोण से कम है। यदि यह है, एक ब्लिप ड्रा।

यह बहुत आसान है, और अब आपको आसानी से रडार को अलग दिशाओं में इंगित करने की सुविधा देता है (बस आगे वेक्टर को बदल दें) और अलग-अलग चौड़ाई है (बस रडार चौड़ाई कोण बदलें) - और आप उन मामलों के लिए भी समान कोड का पुन: उपयोग कर सकते हैं !

मैं वैक्टरों का उपयोग क्यों करता हूं?

यदि आप 2 डी में हैं, तो शायद जटिल प्रभाव और गति (कताई, स्केलिंग, आदि) को प्राप्त करने का सबसे अच्छा तरीका एक दृश्य ग्राफ का उपयोग करना है। एक ग्रह के पास एक परिक्रमा करने वाला जहाज है, जहाज में एक परिक्रमा करने वाला ड्रोन है। वेक्टर गणित का उपयोग किए बिना इसके लिए गणना वास्तव में, वास्तव में बदसूरत है।

वेक्टर गणित के साथ, हम एक बिंदु और एक 3x3 ट्रांसफॉर्म मैट्रिक्स के रूप में प्रत्येक का प्रतिनिधित्व करते हैं। ग्रह अपने परिवर्तन का उपयोग करता है, जहाज अपने परिवर्तन और ग्रह के परिवर्तन का उपयोग करता है, और ड्रोन अपने परिवर्तन और जहाज के परिवर्तन और ग्रह के परिवर्तन का उपयोग करता है।

जब ग्रह चलता है, तो आप इसके परिवर्तन को बदलते हैं, और जहाज और ड्रोन स्वचालित रूप से "मुफ्त में" प्राप्त करते हैं। बहुत क्लीनर कोड।

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

निष्कर्ष वैक्टर स्पष्ट कोड लिखने के लिए एक शक्तिशाली उपकरण है जो ज्यामितीय समस्याओं को साफ और सुरुचिपूर्ण ढंग से हल करता है।


14

एक 2 डी उदाहरण स्क्रीन निर्देशांक हैं, यह स्क्रीन पर एक पिक्सेल की पहचान करता है और इसमें एक x- और एक y- घटक [x, y] है। बाईं ओर ऊपरी स्क्रीन स्थिति [0, 0]

एक और उदाहरण: दायीं स्क्रीन बॉर्डर से लेफ्ट स्क्रीन बॉर्डर तक टेक्स्ट स्क्रॉल करने की कल्पना करें। अब आपको पिक्सेल प्रति सेकंड स्क्रॉलिंग पाठ के वेग को परिभाषित करने की आवश्यकता है, अर्थात [-20, 0] जिसका अर्थ है कि पाठ प्रति सेकंड बाईं ओर 20 पिक्सेल स्क्रॉल करता है और कभी भी ऊँचाई नहीं बदलता है।

एक और अधिक उन्नत उदाहरण: एक 2 डी गेम की कल्पना करें जो अलग-अलग स्क्रीन रिज़ॉल्यूशन 800x600, 1024x768 आदि पर चलने वाला है। यह आसानी से 0.0 से 1.0 तक की स्क्रीन चौड़ाई और 0.0 से 1.0 की ऊंचाई तक गेम लॉजिक को डिकूप करने के लिए आंतरिक रूप से किया जा सकता है। वास्तविक स्क्रीन रिज़ॉल्यूशन से। अब जब आप स्क्रीन पर आते हैं तो आप रिज़ॉल्यूशन वेक्टर के साथ आंतरिक वेक्टर को गुणा करते हैं:

screen_pos = internal_pos * screen_ressolution

ध्यान दें, सभी 3 चर 2 डी वैक्टर हैं यहां, उनके पास एक x- और एक y- घटक है, अर्थात इस आंतरिक_पोजिशन के लिए [0.5, 0.25]:

[400, 150] = [0.5, 0.25] * [800, 600]

इसलिए आंतरिक स्थिति [0.5, 0.25] वास्तविक स्क्रीन स्थिति में बदल जाती है [400, 150]

यह मूल सामान था। वैक्टर का असली फायदा लीनियर बीजगणित में किया गया आवेदन है, जहां आप मैट्रिस का उपयोग अपने वर्टिस (रोटेट, स्केल, मिरर आदि) को बदलने के लिए कर सकते हैं, यानी आसानी से अपनी सभी आंतरिक स्थिति को 90 डिग्री तक घुमा सकते हैं, या आपको स्क्रीन-वाई स्वैप करना होगा स्थिति 0 स्क्रीन के ऊपर से नीचे तक, क्योंकि आपके द्वारा उपयोग किया जाने वाला एक तृतीय पक्ष पुस्तकालय, इस सम्मेलन का उपयोग करता है।


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

@ स्क्रीन के लिए पूर्ण पिक्सेल डेटा को बहुआयामी सरणी के रूप में माना जा सकता है, मूल रूप से एक बिटमैप, लेकिन चौड़ाई और ऊंचाई के लिए मान, दूसरे शब्दों में, संकल्प
Maik Semder

2
ध्यान दें कि एक वेक्टर को अक्सर गणित और प्रोग्रामिंग में काफी अलग तरीके से व्यवहार किया जाता है। गणितीय रूप से, एक वेक्टर एक बहुआयामी सरणी नहीं है, हालांकि कुछ आधार के संबंध में इसके घटक एक साथ इस तरह के एक सरणी को परिभाषित करते हैं। सदिश स्वयं को समन्वित करता है। संचालन screen_pos = internal_pos * screen_resolutionकर रहा है नहीं जिस तरह से आपने लिखी है अपरिवर्तनीय समन्वय, यह अधिक उचित रूप से लिखा जा सकता है screen_pos = map_to_screen * internal_pos, जहां map_to_screenएक रेखीय मानचित्रण (जो इस मामले एक विकर्ण एक में एक मैट्रिक्स के रूप में लिखा जा सकता है,) है।
लेफ्टरनबाउट

6

यहाँ वुल्फायर गेम्स ब्लॉग पर खेल विकास में वैक्टरों की एक बड़ी व्याख्या है:

http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/


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

1

एक वेक्टर एक इकाई है जिसमें एक मूल्य और एक दिशा दोनों होती है। वास्तविक दुनिया और भौतिकी आधारित खेलों में वैक्टर के उदाहरणों में वेग और गति शामिल हैं। ऐसे गुण जिनमें केवल मूल्य होते हैं लेकिन किसी भी दिशा को स्केलर नहीं कहा जाता है और इसमें स्थान, द्रव्यमान, घनत्व और आगे शामिल होते हैं।

वैक्टर ऐसे खेलों के लिए आवश्यक हैं जो भौतिक गुणों का अनुकरण करते हैं जो वेक्टर जैसे हैं (जैसा कि उल्लेख किया गया है - गति, त्वरण और आगे)। वेक्टर गणना के लिए उपयोग किए जाने वाले गणित को रैखिक बीजगणित कहा जाता है


गति एक अदिश राशि है, इसकी वेग सदिश की लंबाई है
Maik Semder

सही - तय
Eran Galperin

1
और स्थान को सामान्य रूप से वेक्टर माना जाता है, यह दूरी है जो स्केलर है।
अली

स्थिति को एक स्केलर (या स्केलर का एक संग्रह) या एक वेक्टर दोनों माना जा सकता है जो अक्ष के प्रारंभिक बिंदु से इंगित कर रहा है।
एरन गैल्परिन

1

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

बुनियादी सामान के लिए यह वास्तव में कोई फर्क नहीं पड़ता है कि आप इन नंबरों को वैक्टर मानते हैं या नहीं, लेकिन अगर आप किसी भी प्रकार की भौतिकी करना चाहते हैं तो आपको वेक्टर गणित में देखना चाहिए।


स्थिति एक वेक्टर नहीं है
एरन गैपरिन

न तो गति है, न ही इसकी कोई
खंभा

2
@Eran Galperin मुझे पता है कि गणितज्ञों के बीच एक बहुत व्यापक दृष्टिकोण है। एक बिंदु के बीच का अंतर और इसके अनुरूप स्थिति वेक्टर हालांकि काफी अकादमिक है। भेद के बारे में उपद्रव करने का कोई व्यावहारिक कारण नहीं है।
aaaaaaaaaaaa

1
वहाँ व्यावहारिक कारण हैं, एक बार आप 4D homogenious निर्देशांक और मैट्रिक्स के साथ काम करते हैं, आप है कि गौरव बनाने के लिए। हालांकि यह इस सवाल के दायरे के लिए प्रासंगिक नहीं है।
माईक सेमर

@eBusiness यह एक "दृश्य" नहीं है यह एक तथ्य है। और मैं शिक्षाविद् द्वारा भौतिक विज्ञानी हूं, गणितज्ञ नहीं।
एरन गैल्परिन

0

बहुत सरलता से, एक स्थिति या एक दिशा के साथ कुछ भी, जो हर जगह एक खेल में वे वैक्टर का उपयोग करते हैं। एक वेक्टर एक बिंदु की तरह है

struct Point2
{
float x, y;
};

struct Vector2
{
float x, y;
};

हालाँकि वास्तव में यह अंतर कम हो गया है। एक बिंदु सिर्फ एक बिंदु है, जबकि एक वेक्टर एक तीर है।

यदि आपके पास है

Point2.x = 5;

Point2.y = 10;

आपका कहना है कि मेरा मतलब इस स्थान पर है x 5 और y 10।

हालाँकि जब आप एक वेक्टर घोषित करते हैं ...

Vector2.x = 5;

Vector2.y = 10; 

आपका वास्तव में कहा जा रहा है कि 0,0 से x 5, y 10 तक एक तीर घोषित करना;

आपके पास वह बिंदु भी हो सकता है, जहाँ से आपका वेक्टर कहीं से भी अंतरिक्ष में एक बिंदु होने की ओर इशारा कर रहा है, उदाहरण के लिए, एक बिंदु और एक वेक्टर का उपयोग करके हम अपनी वस्तु को स्थानांतरित करने के लिए एक पॉइंट 2 का उपयोग कर सकते हैं, जिससे उसका स्थान और वेक्टर 2 को स्थानांतरित किया जा सके। ।

point2.x = 10;

point2.y = 15;

अब आप इस बिंदु को स्थानांतरित करने के लिए एक वेक्टर का उपयोग कर सकते हैं, हम कहते हैं कि हम इस बिंदु को एक्स अक्ष 10 इकाइयों तक ले जाना चाहते हैं ताकि आपके पास हो

vector2.x = 10;

vector2.y = 0;

point2 += vector2;

अब वह बिंदु आ गया है जहाँ आपके वेक्टर तीर ने इसे बताया था।

बिंदु अब है

point2.x = 20;

point2.y = 15;

ध्यान देने वाली एक आखिरी बात यह है कि कभी-कभी एक वेक्टर का उपयोग बिंदु की तरह किया जाता है और इसके विपरीत सिर्फ इसलिए कि वे एक ही प्रकार का डेटा रखते हैं।


एक बिंदु है एक सदिश। यह मूल से बिंदु P पर एक वेक्टर है
कम्युनिस्ट बतख

1
@ तकनीकी रूप से बोलना सही नहीं है, सजातीय निर्देशांक का जिक्र करते हुए कहा कि वेक्टर को position_point से मूल_ बिंदु को घटाकर पाया जा सकता है, लेकिन यह उन्हें समान नहीं बनाता है: v = pos - origin इसलिए v != posमूल एक बिंदु है{0, 0, 0, 1}
Maik Semun

@ डक: एक बिंदु एक सदिश नहीं है लेकिन एक बिंदु और मूल है एक वेक्टर को परिभाषित करता है, जो कि ज्यादातर समय उतना ही अच्छा होता है यदि आपकी उत्पत्ति 0. है

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