मैं ब्लॉक-आधारित 2D गेम में रोशन रोशनी को कैसे लागू करूं?


11

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

मान लीजिए कि मेरे पास 10x10 की दुनिया है और मैं 1x1 पर एक रोशनी रखता हूं और उस रोशनी के चारों तरफ दीवारें खड़ी करता हूं। मैं 1x1 पर प्रकाश स्रोत को देखने में सक्षम होना चाहता हूं, लेकिन कहीं और नहीं, क्योंकि यह दीवारों द्वारा अवरुद्ध है।

मैंने प्रकाश किरणों को काम करने के बारे में सुना है, लेकिन यह वास्तव में कैसे काम करता है?


1
इस प्रश्न के कुछ भाषा-अज्ञेयवादी उत्तर देखना चाहेंगे।
दश्तो

2
@ डश्टो: आपके द्वारा उपयोग की जाने वाली भाषा में आपको काम करने वाले कोड की आवश्यकता है? यह पूछने के लिए एक गलत जगह है ..
क्रॉमस्टर

आपने क्या प्रयास किया है? जब आप कहते हैं "कहीं और कोई प्रकाश स्रोत नहीं है", तो आपका क्या मतलब है? बस तुम 1,1 ब्लॉक जलाया और यह बात है। हो सकता है कि मुझे आपका प्रश्न न मिले, क्या आप एक चित्रण पोस्ट कर सकते हैं?
लॉरेंट कौविदो

1
@ क्रॉम स्टर्न: मैं वास्तव में इसके विपरीत पूछ रहा हूं - एक वैचारिक उत्तर जो भाषा पर निर्भर नहीं करता है। डुप्लिकेट के रूप में जुड़े दो धागे अवधारणाओं के बारे में बहुत बात नहीं करते हैं। वास्तव में इस साइट पर इसी तरह के अधिकांश सवालों के जवाब में केवल यह कहा जाता है कि "इस पुस्तकालय का उपयोग करें!" जो किसी ऐसे व्यक्ति के लिए कम सहायक है जो यह समझना चाहता है कि यह कैसे काम करता है।
Dashto

@ डश्टो: यह महत्वपूर्ण जानकारी का टुकड़ा है, आपको इसे इस प्रश्न में जोड़ना चाहिए;)
क्रॉस्टर

जवाबों:


13

अमित पटेल ने 2 डी रे कास्टिंग पर बहुत अच्छा लेख लिखा है

इसमें प्रकाश स्रोत का निर्माण करने के लिए प्रकाश स्रोत की सीमा के अंदर प्रत्येक कोने में किरणों को शामिल करना शामिल है।

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

दृश्य उदाहरणों के सभी पोस्ट में इंटरैक्टिव हैं और समझने में बहुत आसान हैं।

आपको अपने आप को एक बॉक्स में सीमित करने की आवश्यकता नहीं है, आप जिस परिधि का पता लगाते हैं वह आपकी पसंद का कोई भी आकार हो सकता है।


1

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

यहाँ है कि यह कैसे दिख सकता है


मैंने बस पूछा कि मैं कैसे रे कास्टिंग का उपयोग करूंगा। मुझे इसके बारे में पता है।
लिक्विडफलाइन

0

यदि आप जानते हैं कि रे कास्टिंग क्या है, तो आपको वास्तव में यह करने की आवश्यकता है कि यह कठिन कोड है। जब तक आप प्रत्येक शीर्ष के लिए निर्देशांक नहीं है तब तक यह जटिल नहीं है।

सबसे पहले, एक प्रकाश-उत्सर्जक वस्तु बनाएं। अपने प्रकाश को x, y निर्देशांक पर रखें।

#include <math.h>
int i = 0;
if ( sqrt( abs( light.x - vertex.x )^2 + abs( light.y - vertex.y )^2 ) <= light.radius)
{
    lightOccludingVertices[i] = vertex;
    i++;
}

//If two or more vertices are both a member of an individual wall,
//illuminate the triangular area between the light, the furthest 
//vertex on the x-axis, and the furthest vertex on the y-axis

यह एक अवतल बहुभुज के लिए काम करने की गारंटी नहीं है, लेकिन यह किसी भी उत्तल बहुभुज के लिए ठीक काम करना चाहिए।

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

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

अवतल और उत्तल बहुभुज पर अधिक जानकारी

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