एक 2 डी अंतरिक्ष खेल में फेकिंग आइसोमेट्रिक ग्राफिक्स


15

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

मैं एक 2D, बर्ड-आई व्यू गेम लिख रहा हूं जो अंतरिक्ष में होता है। मैं एक ऐसी दुनिया में आइसोमेट्रिक ग्राफिक्स का उपयोग करने की कोशिश कर रहा हूं, जहां अप नॉर्थ है, पारंपरिक आइसोमेट्रिक गेम्स की तरह खेल की दुनिया का कोई घूर्णन नहीं है (याद रखें, खेल अंतरिक्ष में जगह लेता है, कोई इलाक़ा नहीं)। यहाँ एक उदाहरण दिया गया है जिसे मैं इस्तेमाल करने की कोशिश कर रहा हूं: http://cell.stat-life.com/images/stories/AsteroidOutpost/Spaceship64.png 64 बार घुमाया गया, इसके बारे में 35 डिग्री के व्यूइंग कोण के साथ खुद का ऊर्ध्वाधर अक्ष है (उर्फ, आईएसओ)। छवि उत्पन्न की गई थी, इसलिए इसे बदला जा सकता है।

स्पष्टता के लिए, मैंने तय किया है कि उत्तर (ऊपर) 0 डिग्री है, और पूर्व (दाएं) 90 है।

मेरी समस्या यह है कि मेरा स्प्राइट हमेशा ऐसा नहीं दिखता है जैसे यह सामना कर रहा है जहां खेल को लगता है कि यह इस्तेमाल किए गए 3 डी विमानों में अंतर के कारण है। यकीन नहीं होता कि मैं शब्दावली का सही ढंग से उपयोग कर रहा हूं, लेकिन मेरा अंतरिक्ष यान एक विमान पर घुमाया गया था, और दृश्य विमान अपने स्वयं के विमान पर चीजों को घुमाए जाने की उम्मीद कर रहा है। यहाँ समस्या का चित्रण है:

http://cell.stat-life.com/images/stories/AsteroidOutpost/ProjectionIssue.png बाईं ओर, मेरे पास साइड व्यू हैं, दाईं ओर मेरे ऊपर-नीचे विचार हैं। शीर्ष पर, मेरे पास दुनिया का अंतरिक्ष जहाज / स्प्राइट शीट दृश्य है। तल पर, मेरे पास स्प्राइट जैसा दिखता है जब इसे स्क्रीन पर खींचा जाता है।

शीर्ष दाईं ओर एक सरलीकृत संस्करण है कि कैसे मेरा स्पेसशिप घुमाया गया था (यहां तक ​​कि प्रत्येक फ्रेम के बीच डिग्री पृथक्करण)। नीचे दाईं ओर वह कोण है जो स्प्राइट जैसा दिखता है , जब स्क्रीन पर एक विशेष कोण खींचा जाता है। समस्या लगभग 45 डिग्री पर स्पष्ट है। यहाँ एक छवि है जो एक "स्क्रीन प्लेन" लाइन के साथ ओवरलैड है जो इस दिशा में इंगित की गई है कि जहाज का सामना करना पड़ रहा है: http://cell.stat-life.com/images/stories/AsteroidOutpost/SpaceshiphipRedLine.png लाल रेखा को हमेशा जहाज के समान सटीक दिशा में इंगित किया जाना चाहिए , लेकिन जैसा कि आप देख सकते हैं, प्रक्षेपण मुद्दा एक समस्या पैदा कर रहा है। मुझे उम्मीद है कि मैं इस मुद्दे का अच्छी तरह से वर्णन कर रहा हूं।

EDIT: लाल रेखा को स्क्रीन प्लेन पर घुमाया जाता है, जबकि अंतरिक्ष जहाज को "शिप प्लेन" पर घुमाया जाता है, इसलिए इसे खींचे जाने पर जहाज के एंगल और स्क्रीन एंगल के बीच बड़ा अंतर होता है। END EDIT

यह अजीब लगता है जब यह जहाज एक लक्ष्य पर एक लेजर बीम की शूटिंग कर रहा है जो एक तरफ से दूर है, जब इसे सीधे आगे की शूटिंग की जानी चाहिए।

तो ... मैं जिन समाधानों के साथ आया हूं वे हैं:

  1. एक आइसोमेट्रिक दृश्य नकली करने की कोशिश करना बंद करो, बड़ा हो या घर जाओ। मेरी दुनिया को पहले से ही घुमाओ। (पुनश्च: यह मेरी समस्या को ठीक करेगा?)
  2. मेरी स्प्राइट शीट (किसी तरह) को फ्रेम करें जो "स्क्रीन कोण" का प्रतिनिधित्व करता है कि मॉडल को देखा जाएगा। इसलिए जब मैं 45 डिग्री की छवि मांगता हूं, तो यह वास्तव में ऐसा लगेगा जैसे यह स्क्रीन पर 45 डिग्री का सामना कर रहा है।
  3. स्प्राइट शीट (किसी तरह) से एक अलग फ्रेम को हथियाने के लिए मेरी स्प्राइट रेंडरिंग प्रणाली को सचेत करें, यह जानते हुए कि "सामान्य" फ्रेम को हथियाना मज़ेदार लगेगा। तो 45 डिग्री के फ्रेम हथियाने के बजाय, यह ... 33 डिग्री फ्रेम (सिर्फ अनुमान लगा) इतना है कि यह हड़पने जाएगा लग रहा है उपयोगकर्ता के लिए सही।
  4. बस 3 डी का उपयोग करें! यह इतना आसान आदमी है

एक के लिए: आप किस समाधान की सिफारिश करेंगे? मैं 2 की ओर झुक रहा हूं, हालांकि मुझे पता है कि यह गलत है। याद रखें कि स्प्राइट जनरेशन टूल तक मेरी पूरी पहुंच है। विधि 3 मेरी दूसरी पसंद होगी। इन दोनों विधियों को बस यह चाहिए कि मैं अपना वांछित परिणाम प्राप्त करने के लिए कोण पर कुछ गणित लागू करूं। Btw, मैंने एक मजाक के रूप में # 4 को जोड़ा, मैं 3 डी में नहीं जाना चाहता।

दो के लिए: विधियों 2 या 3 का उपयोग करना, मैं इनपुट या आउटपुट कोणों को कैसे समायोजित करूंगा? मैं 3D अनुमानों और 3D मैट्रिसेस (अकेले 2D 2D मैट्रिसेस) के साथ वह सब अच्छा नहीं कर रहा हूँ, और मुझे वांछित परिणाम प्राप्त करने के लिए अन्य किसी भी गणित का उपयोग किया जा सकता है।

यहाँ ज़ोर से सोचना: अगर मैं एक यूनिट वेक्टर का सामना उस दिशा में कर रहा हूँ जो मैं चाहता हूँ कि जहाज स्क्रीन पर (स्क्रीन प्लेन पर) दिखे, तो प्रोजेक्ट करें कि जहाज प्लेन पर है, तो यह पता लगाएँ कि उस अनुमानित लाइन और प्लेन के बीच का कोण क्या है उत्तर है, मेरे पास जहाज के ग्राफिक का कोण होना चाहिए जिसे मैं प्रदर्शित करना चाहता हूं। सही? (# 3 के लिए समाधान?) यार ... मैं यह काम नहीं कर सकता।

संपादित करें:

मुझे पता है कि समस्या स्थैतिक छवियों के साथ कल्पना करना कठिन है, इसलिए मैंने इस मुद्दे को प्रदर्शित करने के लिए अपने स्प्राइट लाइब्रेरी विज़ुअल टेस्टर का अनुपालन किया है: http://cell.stat-life.com/downloads/SpriteLibVisualTest.zip यह XNA 4.0 है। यह एप्लिकेशन है बस स्प्राइट को घुमाना, और इसके केंद्र बिंदु से एक रेखा खींचना कोण पर खेल को लगता है कि जहाज का सामना करना चाहिए।

EDIT 8 सितंबर

मेरी "ज़ोर से सोच" पैराग्राफ से जारी: एक प्रक्षेपण का उपयोग करने के बजाय (क्योंकि यह कठिन लग रहा है) मैं सोच रहा हूं कि मैं एक उत्तर का सामना करना पड़ रहा इकाई वेक्टर (0x, 1y, 0z) ले सकता हूं, इसे कोण पर घुमाने के लिए एक मैट्रिक्स का उपयोग करें। स्प्राइट वास्तव में सामना कर रहा है, फिर एक्स अक्ष के चारों ओर "स्प्राइट प्लेन" के लिए "देखने वाले विमान" से इसे फिर से घुमाएं, फिर ... समतल करें? सदिश (अनिवार्य रूप से यह प्रोजेक्ट) केवल एक्स और वाई (ज़ेड को अनदेखा करते हुए) का उपयोग करके देखने वाले विमान पर वापस। फिर उस नए चपटा वेक्टर का उपयोग करते हुए, मैं इसके कोण को निर्धारित कर सकता हूं और इसका उपयोग कर सकता हूं ... कुछ कुछ। मैं बाद में सोचूंगा।

EDIT 8 सितंबर (2)

मैंने कुछ सफलता के साथ ऊपर से अपने विचार का पालन करने की कोशिश की, याय! तो ... यह देखने के लिए कि यह मेरे स्पेसशिप से सीधे आ रहा है (केवल परीक्षण के उद्देश्य) के लिए एक लाल रेखा प्राप्त करने के लिए , मैंने निम्नलिखित कार्य किया:

Vector3 vect = new Vector3(0, 1, 0);
vect = Vector3.Transform(vect, Matrix.CreateRotationZ(rotation));
vect = Vector3.Transform(vect, Matrix.CreateRotationY((float)((Math.PI / 2) - MathHelper.ToRadians(AngleFromHorizon))));
Vector2 flattenedVect = new Vector2(vect.X, vect.Y);

float adjustedRotation = (float)(getAngle(flattenedVect.X, flattenedVect.Y));

rotationस्क्रीन एंगल कहां है और adjustedRotationअब स्क्रीन एंगल स्प्राइट प्लेन पर दिखता है। मुझे नहीं पता कि मुझे X के बजाय Y को घुमाने की आवश्यकता क्यों थी, लेकिन यह शायद 3D के साथ कुछ ऐसा है जिसके बारे में मुझे नहीं पता है।

तो, अब मेरे पास जानकारी का एक अतिरिक्त टुकड़ा है, लेकिन मैं इसका उपयोग अधिक उपयुक्त फ्रेम चुनने के लिए कैसे करूं? हो सकता है कि दृश्य विमान से स्प्राइट विमान में घूमने के बजाय, फिर वापस प्रोजेक्ट करते हुए, मुझे इसे दूसरे तरीके से करने की कोशिश करनी चाहिए। यहाँ एक समायोजित लाल रेखा के साथ मेरा स्प्राइट है, लेकिन मैं वास्तव में जो करना चाहता हूं वह मॉडल को समायोजित करना है, न कि रेखा: http://cell.stat-life.com/images/stories/AsteroidOutpost/Spaceship64RedLorCorrected.png

EDIT 9 सितंबर

Horay! यह तय हो चुका है! मैं वर्णन करूँगा कि मैंने इसे ठीक करने के लिए क्या किया:

मैंने दुनिया के समन्वय प्रणाली (या फैला हुआ ...?) के द्वारा eBusiness की सलाह और "स्क्वीड" का पालन किया। यह अनिवार्य रूप से # 1 समाधान है, हालांकि मैं इस धारणा के तहत था कि मुझे स्क्रीन समन्वय प्रणाली के संबंध में अपनी विश्व समन्वय प्रणाली को घुमाना होगा। सच नहीं! ऊपर अभी भी + y है, और राइट अभी भी + x है। मैंने अपनी WorldToScreen और ScreenToWorld विधियों को दुनिया और स्क्रीन निर्देशांक के बीच ठीक से परिवर्तित करने के लिए संशोधित किया है। ये विधियाँ इष्टतम नहीं हो सकती हैं, लेकिन यहाँ मेरे कोडबेस में केवल दो विधियाँ हैं जिन्हें बदलना था।

public Vector2 ScreenToWorld(float x, float y)
{
    float deltaX = x - (size.Width / 2f);
    float deltaY = y - (size.Height / 2f);

    deltaX = deltaX * scaleFactor / (float)Math.Sqrt(3);
    deltaY = deltaY * scaleFactor;

    return new Vector2(focusWorldPoint.X + deltaX, focusWorldPoint.Y + deltaY);
}

public Vector2 WorldToScreen(float x, float y)
{
    float deltaX = x - focusWorldPoint.X;
    float deltaY = y - focusWorldPoint.Y;

    deltaX = deltaX / scaleFactor * (float)Math.Sqrt(3);
    deltaY = deltaY / scaleFactor;

    return new Vector2(size.Width / 2f + deltaX, size.Height / 2f + deltaY);
}

वह यह था! उन दो तरीकों को बदलने से बाकी सब प्रभावित हुआ: जो मैं देख रहा था, जहां वस्तुएं खींची गईं, जहां मैं क्लिक कर रहा था, सब कुछ। मेरा अंतरिक्ष यान अब सीधे उस लक्ष्य पर नज़र आ रहा है, जिसकी वह शूटिंग कर रहा है, और सब कुछ घट रहा है। मैं ऑर्थोग्राफिक प्रोजेक्शन के साथ प्रयोग करूंगा, देखें कि क्या यह सब कुछ अधिक वास्तविक लगता है।


बधाई हो। एक बार आप कुछ खेलने योग्य होने पर मुझे प्रहार करना न भूलें, मैं यह देखना चाहता हूं कि यह कहां जाता है।
आआआआआआआआआआआआआ आआआआ आआआआ

@eBusiness जैसा वादा किया गया: cell.stat-life.com/images/stories/AsteroidOutpost/… और cell.stat-life.com/images/stories/AsteroidOutpost/AOOhNoes.png ध्यान दें कि जहाज कैसा लग रहा है जैसे कि वह उस टॉवर को देख रहा है? : D धन्यवाद!
जॉन मैकडोनाल्ड

@eBusiness, एक वीडियो youtube.com/watch?v=Q8pR9KDBsCo डाउनलोड करने के लिए एक लिंक भी है, जब से आपने पूछा था।
जॉन मैकडोनाल्ड

जवाबों:


4

जब आपने आइसोमेट्रिक दृष्टिकोण चुना है, तो आपको एक्स और वाई-अक्ष के बीच के पैमाने को सही करने की आवश्यकता है। यदि कोई दी गई दूरी Y- अक्ष पर 1 पर प्रोजेक्ट करती है तो वही दूरी स्क्रीन X- अक्ष पर sqrt (3) के लिए प्रोजेक्ट करेगी। इसलिए यदि आप स्क्रीन पर सामान समतल करते हैं तो आप कुछ ऐसा करेंगे:

draw(object.image, object.x*sqrt(3), object.y)

गैर-उत्तर नोट:

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

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

5

घुमाया हुआ स्प्राइट कैसे उत्पन्न होता है? क्या ये घूर्णन 3D मॉडल के स्क्रीनशॉट हैं? 3D मॉडलिंग टूल के कैमरा परिप्रेक्ष्य के कारण फेसिंग एंगल बंद हो सकता है। आइसोमेट्रिक परिप्रेक्ष्य 3 डी अंतरिक्ष का एक सटीक प्रतिनिधित्व नहीं है। 'कैमरा ’से दूर का स्टफ छोटा नहीं होता।

यदि आप बस एक त्वरित सुधार चाहते हैं। समाधान 2 सही होना मुश्किल हो सकता है। समाधान 3 को लगता है कि कोण को बेहतर तरीके से फिट करने वाले फ्रेम से स्वैप नहीं करना आसान है।

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

संपादित करें:

आपकी समस्या यह है कि उत्पन्न स्क्रीनशॉट आइसोमेट्रिक परिप्रेक्ष्य नहीं हैं, लेकिन एक सामान्य 3 डी कैमरा दृश्य है।

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

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

आपका स्पेस शिप स्क्रीनशॉट 3 डी कैमरा के नजरिए से बनाया गया है। Thats क्यों लेजर शूटिंग बंद है। 'आइसोमेट्रिक' और 'परिप्रेक्ष्य' में लाल रेखा की तुलना करें।

आपका स्प्राइट जनरेटर का उपयोग करना चाहिए Matrix.CreateOrthographic () के बजाय Matrix.CreatePerspective () प्रक्षेपण मैट्रिक्स के लिए।


स्प्राइट एक 3 डी से 2 डी टूल का उपयोग करके उत्पन्न होता है जिसे मैं विकसित कर रहा हूं, इसलिए समस्या उस टूल में बहुत अच्छी तरह से हो सकती है। उपकरण केवल एक 3D मॉडल को लोड करता है, फिर Spaceship64.png (ऊपर) प्राप्त करने के लिए, यह मॉडल को (360/64) = 5.625 डिग्री से घुमाता है, एक फ्रेम के रूप में बचाता है, फिर इसे उसी राशि से फिर से घुमाता है जब तक कि यह सब नहीं हो जाता 64 फ्रेम। मॉडल को रेंडर करने के लिए उपयोग किया जाने वाला कोड यहां है: code.google.com/p/sprite-maker/source/browse/trunk/XNAWindow/… घूर्णन एक अन्य वर्ग में किया जाता है। मैं यह भी सोच रहा था कि समाधान 2 और 3 एक दूसरे के विलोम हैं, नहीं?
जॉन मैक्डोनाल्ड

मेरे उत्तर का संपादन किया। ऊपर देखो।
स्टीफन

मुझे लगता है कि मुझे दोनों करने की आवश्यकता हो सकती है: मेरे स्प्राइट जनरेटर को ऑर्थोग्राफिक प्रोजेक्शन का उपयोग करें और मेरे विश्व समन्वय प्रणाली को बदल दें जैसे @eBusiness कह रहा है। मैंने कल रात ऑर्थोग्राफिक प्रक्षेपण की कोशिश की, और यह निश्चित रूप से बदल गया कि मेरा जहाज कैसा दिखता है, लेकिन यह अकेले उस कोण समस्या को ठीक नहीं करता है जो मैं अनुभव कर रहा हूं।
जॉन मैकडॉनल्ड्स

बस अपना एडिट देखा। सही स्प्राइट ऐसा लगता है जैसे जहाज का केंद्र लाल रेखा के केंद्र से दूर है। हो सकता है कि यह जहाज एक या दो पिक्सल्स ऊंचा खींचने के लिए पर्याप्त हो, फिर लाल रेखा का प्रारंभिक बिंदु। क्या जहाज की दुनिया से दूर जाने के दौरान दृश्यमान त्रुटि बदल जाती है? फिर एक्स-एक्सिस को स्केल करना इसे ठीक कर सकता है।
स्टीफन

1

मुझे लगता है कि आपको यहां जो कुछ मिला है, वह है कि कैसे आइसोमेट्रिक दिखता है। आप सही कह रहे हैं, नेत्रहीन बोलने में, 0deg और 10deg के बीच 90deg और 100gg की तुलना में बड़ा अंतर प्रतीत होता है। । । लेकिन ऐसा इसलिए है क्योंकि आइसोमेट्रिक आंतरिक रूप से एक अक्ष को संपीड़ित करता है। यदि आप ऐसा नहीं चाहते हैं, तो आप आइसोमेट्रिक नहीं चाहते हैं।

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

अब, यह पता लगाना है कि अपने उपयोगकर्ताओं को कैसे प्राप्त करें। । । यह एक और मामला है।


क्या मुझे इस पद्धति (प्रश्न में विधि # 1) का उपयोग करके भ्रम को पूरा करने के लिए विश्व अक्ष को घुमाने की आवश्यकता नहीं होगी?
मैक पर जॉन मैकडॉनल्ड्स

जैसा कि मैं बता सकता हूं, जहाज पहले से ही सही ढंग से प्रस्तुत किया जा रहा है - साइड व्यूज इसे "सही" दिखने के लिए आइसोमेट्रिक कोण पर होना चाहिए। मुझे लगता है मुझे यकीन नहीं है कि आप "दुनिया की धुरी घुमाएं" से क्या मतलब है।
ज़ोरबातुत

"वर्ल्ड एक्सिस को घुमाएं" से मेरा मतलब है कि "नॉर्थ" को "नॉर्थ" की बजाय सीधा सीधा ऊपर की ओर स्क्रीन के टॉप-राइट या टॉप-लेफ्ट की ओर करने के लिए कैमरे को 45 डिग्री तक घुमाएं। स्क्रीन के शीर्ष की ओर।
जॉन मैकडॉनल्ड्स


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