संक्षेप में: हम Unreal Engine के लिए एक पानी प्रणाली बना रहे हैं, दो वादों के साथ: पानी जो सही दिखता है क्योंकि प्रकाश, रंग और झाग भौतिक रूप से गणना किए जाते हैं (न कि हर दृश्य के लिए हाथ से ट्यून किए जाते हैं) और पानी जो बर्ताव करता है: किसी भी मेश को सतह पर गिराएँ और वह बिना किसी सेटअप के सही ढंग से तैरता है, झुकता है या डूबता है। यह सक्रिय विकास में है। यह पोस्ट समझाती है कि यह क्या कवर करता है, हम संदर्भ तस्वीरों से ख़ुद को कैसे जवाबदेह रखते हैं, उछाल वह कठिन हिस्सा क्यों है जिसे सब छोड़ देते हैं, और यह बाक़ी टूलकिट के साथ कहाँ बैठता है।
वह मानक जिसे मात देना है। ध्यान दें कि इसे असली क्या बनाता है: टूटती लहरों से जन्मा झाग, चट्टानों को खाती धुंध, पूरी लहर पर सफ़ेद-चोटियों का आँकड़ा: कुछ भी हाथ से नहीं रखा, सब भौतिकी। यही वह पट्टी है जो हमने रखी है।
एक और पानी प्रणाली क्यों?
ज़्यादातर गेम-पानी ठीक एक प्रकाश-स्थिति में शानदार दिखता है: वह जो स्टोर के स्क्रीनशॉट में है। सूरज हिलाएँ, बादलों में बदलें, कैमरे को जल-रेखा से आधा नीचे रखें, और यह बिखर जाता है।
एक दूसरी, शांत नाकामी है जो उतनी ही मायने रखती है: लगभग हर पानी प्रणाली तैरती वस्तुओं को बाद की सोच मानती है। आपको एक नाव टेम्पलेट, पोंटून-रिगिंग निर्देशों का एक पन्ना, और यह अनकही मान्यता मिलती है कि कोई कभी समुद्र में यूँ ही एक बक्सा नहीं फेंकेगा। खिलाड़ी लगातार समुद्र में बक्से फेंकते हैं।
हम दो चीज़ें चाहते थे जो फ़िलहाल एक ही पैकेज में साथ नहीं रहतीं: फ़िल्म-गुणवत्ता वाला रूप जो किसी भी प्रकाश को झेल ले, और भौतिक बर्ताव जिसे किसी सेटअप की ज़रूरत न हो। इनमें से कोई भी पैरामीटर तब तक छेड़कर हासिल नहीं होता जब तक स्क्रीनशॉट सुंदर न लगे, क्योंकि स्क्रीनशॉट एक सूरज के नीचे एक फ़्रेम है, और जैसे ही कोई एक बदलता है, स्वाद के हिसाब से ट्यून किया पानी अपने जोड़ दिखा देता है। तो परियोजना की नींव फ़ीचर-सूची नहीं है। यह एक स्वीकृति परीक्षण है जिससे इंसान बहस नहीं कर सकता: एक तस्वीर।
स्वाद के मुक़ाबले नहीं, तस्वीरों के मुक़ाबले परखा जाता है
विकास संदर्भ तस्वीरों से गेट होता है जिनके निश्चित कैमरा और प्रकाश अनुबंध होते हैं: भौतिक प्रकाश इकाइयाँ, एक लॉक किया टोनमैपर, और पास या फ़ेल तय करता एक अवधारणात्मक अंतर-मापक, न कि उस दिन आर्ट डायरेक्टर का मूड।
दो संदर्भ प्रामाणिक हैं, और उन्हें विपरीत होने के लिए चुना गया:
- एक साफ़ झील, कैमरा जल-रेखा में। आधी हवा, आधा पानी, बिना आर्टिफ़ैक्ट-पट्टी की एक लहराती सीमा; हरा तटीय-प्रकार का पानी जिसका रंग दूरी के साथ गहराता है; चट्टानों पर कॉस्टिक जो ऊपर की सतह से मेल खाते हैं; डूबे लट्ठे जो अंतरापृष्ठ पर सही मुड़ते हैं। यह अपवर्तन, जल-रेखा पार करने और पानी के भीतर रंग अवशोषण: तीनों को एक साथ परखता है।
- पूरे बादलों तले एक तूफ़ानी तट। न सूरज, न चमक-पट्टी: समुद्र को नरम आकाश-प्रतिबिंब, विसंतृप्त धूसर-हरे, सफ़ेद-चोटियों के आँकड़े, और चट्टानों पर धुंध से पढ़ा जाना चाहिए। एक बोया विश्वसनीय आवर्त और झुकाव के साथ लहर पर सवार होती है; बर्ताव स्वीकृति का हिस्सा है, सिर्फ़ स्थिर छवि नहीं।
बादलों वाला संदर्भ जानबूझकर दोनों में से एक है। धूप वाला पानी धरती के हर रेंडरर की चापलूसी करता है: स्पेकुलर चमक असंख्य पापों को ढक लेती है। सूरज हटा दें, और पानी को फ़्रेम केवल प्रतिबिंब खुरदरेपन, रंग और गति से उठाना होगा। वही ईमानदार परीक्षा है, और वही जिससे ज़्यादातर प्रणालियाँ चुपचाप कतराती हैं। जो महासागर सिर्फ़ धूप में अच्छा दिखे, वह रिलीज़ नहीं होता।
कैमरा-पक्ष उतनी ही सख़्ती से निर्दिष्ट है जितना पानी-पक्ष, क्योंकि तस्वीर तुलना तभी निष्पक्ष है जब कैमरा धोखा न दे सके। इसका अर्थ है असली भौतिक प्रकाश तीव्रताएँ (दोपहर का सूरज लगभग 100,000 लक्स, न कि कोई मनमाना चमक स्लाइडर), एक निश्चित एक्सपोज़र, और प्रति संदर्भ एक निश्चित टोनमैपिंग व ब्लूम विन्यास। टोनमैपर बदल दें और किसी भी पानी को किसी भी तस्वीर से मिलाया जा सकता है: ठीक इसीलिए टोनमैपर सबसे पहले ठोक दिया जाता है।
Drop-a-Mesh: बिना गृहकार्य के तैरना
किसी भी मेश को एक Numivo जल-निकाय पर खींचें और वह तुरंत सही बर्ताव करता है: प्रणाली एक भौतिकी प्रॉक्सी स्वतः बनाती है, वास्तविक लहर ऊँचाई से प्रति फ़्रेम विस्थापित आयतन गणना करती है, और वास्तविक घनत्व से तैरे-या-डूबे निकालती है।
पानी के भीतर एक जगह है, कोई पोस्ट-प्रोसेस नहीं। रंग गहराई के साथ अवशोषित होता है, प्रकाश शहतीरों में छनकर उतरता है, और सिर के ऊपर का अंतरापृष्ठ साफ़ पार होना चाहिए: झील संदर्भ इसलिए मौजूद है कि तीनों को एक साथ ईमानदार रखे।
एक लट्ठा तैरता है और अपने लंबे किनारे पर लुढ़क जाता है। एक बक्सा हिलता-डुलता है। एक पत्थर की मूर्ति डूब जाती है। कोई रिगिंग नहीं, कोई पोंटून-प्लेसमेंट नहीं, कोई स्क्रिप्ट नहीं। बोनट के नीचे:
- टकराव आकृति स्वतः वोक्सलाइज़ की जाती है (अतुल्यकालिक रूप से, और प्रति एसेट कैश की जाती है ताकि केवल एक बार हो) वस्तु का असली आयतन नापने के लिए;
- उछाल हर फ़्रेम भौतिक रूप से गणना होता है: विस्थापित आयतन बनाम पानी का घनत्व, और मीठा व खारा पानी सचमुच अलग हैं (खारा अधिक घना है, तो वही बक्सा झील से समुद्र में ऊँचा सवार होता है);
- तैरे-या-डूबे घनत्व से आता है, द्रव्यमान बँटा प्रॉक्सी आयतन: डिफ़ॉल्ट रूप में "क्या इसे तैरना चाहिए?" का कोई चेकबॉक्स नहीं, क्योंकि डिफ़ॉल्ट ही भौतिकी है;
- स्थिरता उभरती है इससे कि प्रॉक्सी का आयतन कैसे बँटा है: ऊपर से भारी बक्से पलट जाते हैं, कील-भारित पतवारें ख़ुद सीधी हो जाती हैं, एक तख़्ता सपाट लेटता है;
- तैरती वस्तुएँ सतह में वापस युग्मित होती हैं: लहरियाँ, धार-रेखाएँ, जल-रेखा पर झाग का एक छल्ला, और टकराव पर छींटा प्रभाव।
Actor पर ओवरराइड के लिए एक छोटा पैनल है (तैरना बाध्य करें, डूबना बाध्य करें, एक अवमंदन स्लाइडर, धार-रेखा व छींटा टॉगल) पर एक ओवरराइड भौतिकी को बदलने के बजाय भौतिकी को स्केल करता है। किसी विशाल शिला को तैरने के लिए बाध्य करें और वह फिर भी सही आवर्त से हिलती है और सही धार-रेखा छोड़ती है; वह बस ऐसे बर्ताव करती है मानो हल्की हो। यह भेद मायने रखता है: सॉल्वर को अनदेखा करते बाध्य परिणाम एक समतल पर चिपके प्रॉप जैसे दिखते हैं, और खिलाड़ी तुरंत भाँप लेते हैं।
डिज़ाइन लक्ष्य बेलौस है, और यह एक डेमो है जिसे हम लाइव चला पाना चाहते हैं: कोई बीस यादृच्छिक प्रॉप समुद्र में खींचता है, और सब कुछ यूँ ही बर्ताव करने लगता है: पहले एक भी सेटिंग विंडो खोले बिना। अगर उस डेमो को ट्यूटोरियल चाहिए, तो फ़ीचर विफल हुआ।
यह क्या कवर करता है
तट-निकट पानी, खुला महासागर, पानी के भीतर और गुफा-कुंड सभी प्रथम श्रेणी हैं: स्पेक्ट्रम-आधारित लहरें जिनमें लंबी लहर और आड़ा समुद्र अलग हैं, सचमुच टूटती लहरों से झाग, पानी के भीतर प्रकाश-शहतीरों को चलाते कॉस्टिक, और सिनेमाई प्रभावों के तहत स्थिरता।
अगर आप पानी की परवाह करते हैं तो मायने रखते विवरण:
- लहरें समुद्रविज्ञानीय स्पेक्ट्रा से आती हैं (वही सांख्यिकीय मॉडल जो असली समुद्रों का वर्णन करते हैं), दिशात्मक फैलाव और स्वतंत्र रूप से नियंत्रित लंबी लहर के साथ। समुद्र-अवस्था एक मौसम-निर्णय बन जाती है ("उठता तूफ़ान, पश्चिम से लंबी लहर") न कि तीस असंबद्ध स्लाइडर जिन्हें आप तब तक धकेलते हैं जब तक तूफ़ानी न लगे।
- झाग कोई रँगा हुआ मास्क नहीं है। यह वहीं जन्मता है जहाँ लहरें सचमुच टूटती हैं, समय के साथ पुराना होता है, और हवा में धारियाँ बनाता है। रँगा झाग नक़ली पानी का सबसे आम भेद है, क्योंकि यह उस भौतिकी के साथ नहीं चलता जिसे इसे दर्शाना चाहिए।
- पानी के भीतर एक असली जगह है। गहराई के अनुसार सही रंग अवशोषण (लाल पहले जाता है, फिर हरा, वह गहरा नीला छोड़ जाता है जिसे सब गोताखोरी फ़ुटेज से जानते हैं), उसी कॉस्टिक क्षेत्र से निकले प्रकाश-शहतीर जो तल को रोशन करता है, और जल-रेखा पर एक ऐसा पार जिसमें क्लासिक कठोर आर्टिफ़ैक्ट-पट्टी नहीं।
- गुफा-कुंड अपना ख़ुद का उपचार पाते हैं (स्थिर या बमुश्किल हिलता पानी, बूँदों की गड़बड़ी, लगभग अँधेरे में प्रतिबिंब) क्योंकि एक शांत भीतरी कुंड खुले महासागर से अलग नाकामियाँ उजागर करता है।
- सिनेमैटिक्स स्वीकृति मानदंड हैं, बाद की सोच नहीं। सतह को क्षेत्र-गहराई, मोशन ब्लर और फ़िल्म ग्रेन के तहत स्थिर रहना चाहिए: कोई स्पेकुलर fireflies नहीं जो ग्रेन लगाने पर ही दिखें, कोई झिलमिलाहट नहीं जिसे धीमा कैमरा स्ट्रोबिंग में बदल दे।
उछाल वह हिस्सा क्यों है जिसे सब छोड़ देते हैं
रूप एक अच्छे शेडर से नक़ली बनाया जा सकता है, पर बर्ताव नहीं: विश्वसनीय तैरना-और-डूबना एक रियल-टाइम आयतन अनुमान और एक स्थिर सॉल्वर माँगता है, जो सचमुच कठिन है, तो ज़्यादातर प्रणालियाँ एक नाव प्रीफ़ैब देकर रुक जाती हैं।
असुविधाजनक इंजीनियरिंग सच्चाई यह है कि एक सुंदर पानी शेडर एक हल की गई समस्या है और एक सामान्य उछाल सॉल्वर नहीं। किसी लहर का रूप नक़ली करना एक टेक्सचर-और-नॉर्मल समस्या है; किसी यादृच्छिक, पहले कभी न देखे मेश को उस लहर में सही बैठाना एक भौतिकी समस्या है जिसे फ़्रेम-दर पर चलना है, तेज़ टाइम-स्टेप झेलने हैं, और तब न फटना है जब एक हज़ार-त्रिभुज की चट्टान एक तूफ़ानी लंबी लहर से मिले। वही खाई है कि ज़्यादातर इंजनों में "पानी" का मतलब "एक सुंदर समतल जिससे आप इंटरैक्ट नहीं कर सकते" होता है, और क्यों इंटरैक्टिव हिस्सा, जब मौजूद हो, हाथ से बनाई एक नाव होती है।
उस खाई को पाटना (बर्ताव को रूप जितना स्वतः बनाना) इस परियोजना के अस्तित्व का कारण है, और इसका कारण भी कि इसे एक सप्ताहांत के शेडर काम के बजाय संदर्भ-तस्वीर अनुशासन जमा एक असली सॉल्वर चाहिए।
आप इसे कब इस्तेमाल कर सकेंगे?
यह Unreal Engine विस्तार के रूप में विकास में है, एक चरणबद्ध रोलआउट के साथ: एक किनेमैटिक तैराव पूर्वावलोकन पूर्ण भौतिकी सॉल्वर से पहले उतरता है, ताकि दृश्य जल्दी आबाद किए जा सकें। हम कोई तारीख़ घोषित नहीं करते; संदर्भ छवियाँ तय करती हैं कि कब पूरा हुआ।
चरणबद्धता जानबूझकर है। एक किनेमैटिक पूर्वावलोकन (वस्तुएँ पूर्ण बल-सिमुलेशन के बिना लहर-सतह का अनुसरण करती हैं) पहले आता है, ताकि कलाकार मेश गिराकर एक समुद्र आबाद कर सकें जबकि भारी सॉल्वर अभी कठोर किया जा रहा हो: आप भौतिकी अंतिम होने से बहुत पहले परिणाम महसूस करते हैं। पूर्ण सॉल्वर, ऑटो-प्रॉक्सी और पूरा पैनल बाद में आते हैं। प्रगति और मील के पत्थर सार्वजनिक रोडमैप पर दिखते हैं, किसी लॉन्च-दिवस के आश्चर्य में नहीं।
जिस टूलकिट के साथ यह जारी होगा (स्कैटर, मेश ब्लेंडिंग, ग्रिड, मापन) आज ही मुफ़्त आज़माया जा सकता है। अगर आप उस क्षण सूचित होना चाहते हैं जब एक सार्वजनिक पानी बिल्ड मौजूद हो, तो साइट से लिंक किया Discord वह जगह है जहाँ इसे सबसे पहले घोषित किया जाएगा, और जहाँ संदर्भ छवियों की पास/फ़ेल तुलनाएँ जैसे-जैसे होंगी पोस्ट की जाएँगी।
मिनी-FAQ
क्या इसे Numivo के अन्य टूल चाहिए होंगे? नहीं: यह उसी परिवार का एक विस्तार है, अकेले खड़े होने के लिए डिज़ाइन किया गया। फिर भी यह वही सिद्धांत साझा करता है: परिणाम जहाँ भौतिक रूप से संभव हो इंजन-नेटिव डेटा में बेक होते हैं, ताकि जो आप बनाते हैं वह आपका हो।
कौन-से इंजन संस्करण? वर्तमान Unreal Engine 5 रिलीज़। विवरण रोडमैप पर तब उतरते हैं जब विस्तार एक सार्वजनिक बिल्ड के पास आता है, न कि अभी वादा करके बाद में संशोधित।
यह इंजन के अंतर्निर्मित पानी से कैसे अलग है? अंतर्निर्मित पानी प्रणालियाँ रूप में मज़बूत और सामान्य इंटरैक्शन में कमज़ोर होती हैं: उछाल आमतौर पर एक अलग, हाथ से ट्यून किया घटक होता है। यहाँ पूरा बिंदु यह है कि रूप और बर्ताव एक ही भौतिक रूप से आधारित प्रणाली से आते हैं, और संदर्भ-तस्वीर द्वार रूप को प्रकाश-भर ईमानदार रखता है।
रिलीज़ से पहले घोषणा क्यों? क्योंकि संदर्भ-तस्वीर विधि ख़ुद ही बिंदु है। हम पट्टी सार्वजनिक रूप से दिखाकर उसके मुक़ाबले मापे जाना पसंद करते हैं, बजाय एक तैयार चीज़ खोलने के जिसकी कोई जाँच न कर सके। यह पोस्ट वही पट्टी है, लिखित रूप में: इसी से हमें कठघरे में रखें।