Unity3D में एक पोर्टल के माध्यम से यात्रा करते समय दो कैमरों को कैसे मिलाएं


18

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

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

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

इस समय मेरा सबसे अच्छा नेतृत्व संभवतः प्रत्येक पोर्टल के पीछे एक गहन मुखौटा shader प्रोजेक्ट करना है, फिर उस पोर्टल से कैमरा बनाएं जिसे आप केवल गहराई तक यात्रा कर रहे हैं। फिर किसी तरह दोनों कैमरों को मिलाया। मेरी मुख्य समस्या यह पता लगाना है कि मैं यह कैसे करूँगा, दूसरे कैमरे को केवल पोर्टल के बाहर क्या प्रस्तुत करना है, और एक पूर्ण स्क्रीन प्रक्षेपण प्राप्त करने के लिए कैमरा 1 के बाकी डिफ़ॉल्ट हैं।

यदि आप मुझे विचार दे सकते हैं, या समझा सकते हैं कि मैं यह कैसे गहन मुखौटा shader के साथ कर सकता हूं जो एक जबरदस्त मदद होगी। मैं इस पर काम करना जारी रखूंगा और अपडेट करूंगा क्योंकि मैं ब्रेक थ्रू बनाता हूं।


5
क्या आप विस्तृत कर सकते हैं कि "कैमरा मिश्रण प्रभाव वाल्व क्या करता है"? मैं समझ गया हूँ कि पोर्टल में एक ही कैमरा रेंडर करना काफी है। पहले व्यक्ति के खेल में यह खिलाड़ी से जुड़ा होता है और खिलाड़ी के साथ मिलकर पोर्टल को ट्रोल करते समय स्वचालित रूप से नए स्थान पर बदल जाता है। पोर्टल प्रभाव प्रदान करने के लिए दृश्य की एक रूपांतरित प्रति प्रदान की जाती है। यह एक दूसरे कैमरे के साथ भी प्राप्त किया जा सकता है, लेकिन इन कैमरों के बीच सम्मिश्रण की कोई आवश्यकता नहीं होनी चाहिए।
एमएसल

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

1
मुझे यकीन है कि कई लोग समस्या के साथ आपकी मदद करना चाहेंगे अगर वे समझ गए कि यह क्या था। आपको वास्तव में इस मुद्दे को बेहतर ढंग से समझाने की ज़रूरत है, शायद तस्वीरें या यहां तक ​​कि गलत क्या है, यह कल्पना करते हुए एक वीडियो जोड़ें।
5

2
क्या आप प्रभाव के उदाहरण वीडियो का लिंक जोड़ सकते हैं?
माइक बैक्सटर

2
क्या होगा यदि आपने केवल एक कैमरा / एफपीएस नियंत्रक का उपयोग किया है? जब कैमरा पोर्टल के माध्यम से आगे बढ़ता है, तो आप इसे नए स्थान और अभिविन्यास में बदल सकते हैं। यदि पोर्टल रेंडरिंग सही है, तो संक्रमण सहज होना चाहिए और किसी सम्मिश्रण की आवश्यकता नहीं है।
एमएसल

जवाबों:


6

समस्या को समझना

मैं जिस समस्या का वर्णन कर रहा हूं उसे आप देख सकते हैं, यह पोर्टल द्वारा परिभाषित विमान को समतल करने वाले कैमरे के पास का परिणाम है। जबकि यह चौराहा होता है आप उस दीवार के पीछे देख सकते हैं जिस पर पोर्टल है।

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

यदि मैं सही हूं, तो आप प्रक्षेपण मैट्रिक्स को परिभाषित करते समय इस विमान की स्थिति को बदलकर इसकी पुष्टि कर सकते हैं। जैसे-जैसे कैमरे की उत्पत्ति से समीप के विमान की दूरी बढ़ती है, वैसे-वैसे समस्या भी होनी चाहिए।

आसान उपाय

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

पूर्ण समाधान

यदि बस पास के कैमरे को कैमरे के करीब रखने से संतुष्टि नहीं मिलती है, तो आप खिलाड़ी और पोर्टल परिप्रेक्ष्य से दृश्य प्रदान करके उत्पन्न चित्रों को मिश्रण करने के लिए "मुखौटा" बना सकते हैं।

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

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

इस लिंक को लाइन खोजने के लिए गणित के साथ मदद करनी चाहिए। नीचे दिया गया कोड लगभग सही होना चाहिए।

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

Vector3 intersectionDir = Vector3.cross(portalNorm, viewDir);
Ray ray = new Ray(camPos + viewDir * camNearPlaneDist, portalNorm);
Vector3 intersectionPos = ray.intersects(new Plane(portalVert1, portalVert2, portalVert3);

सुनिश्चित करें कि व्यूअर एक इकाई वेक्टर है। portalVert1, 2 और 3, पोर्टल decal के लिए इस्तेमाल किए गए 4 वर्टिकल में से केवल 3 हैं या यह जिस सतह पर है। विमान को परिभाषित करने के अन्य तरीके हैं, जिस पर पोर्टल निहित है, लेकिन मुझे लगता है कि यह सबसे आसानी से उपलब्ध जानकारी है।

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

फिर आप इन चित्रों को ब्लेंड करने के लिए एक पोस्ट प्रक्रिया shader का उपयोग कर सकते हैं। आप प्रत्येक पिक्सेल पर किस छवि का उपयोग करके यह निर्धारित करते हैं कि वर्तमान पिक्सेल किस विभाजन रेखा के किनारे स्थित है। यह पिक्सेल स्थिति को ले कर किया जाता है (जो रेंडर टारगेट टेक्सल देखने के लिए आपके द्वारा उपयोग की जाने वाली स्थिति भी है) और कर रहा है;

float d = (pixelX - intersectionPos.X) * intersectionDir.Y - (pixelY - intersectionPos.Y) * intersectionDir.X;

पक्ष द्वारा दिया गया है कि क्या d अधिक है या कम से कम 0. यदि यह ठीक 0 है, तो आप लाइन पर हैं।

ऊपर दिए गए गणित पर संदर्भ के लिए इसे देखें ।

पोर्टल परिप्रेक्ष्य से रेंडर करने से पहले उपयोग के लिए गहराई मास्क / स्टैंसिल बफर बनाते समय इस पद्धति का उपयोग किया जा सकता है। आप एक पूर्ण स्क्रीन क्वाड बना सकते हैं और इसे स्लाइस करने के लिए लाइन का उपयोग कर सकते हैं।


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

खिलाड़ी के माध्यम से यात्रा के रूप में मामूली झटका। इस विचार को आप काफी आशाजनक लगता है। तो अनिवार्य रूप से मुझे जो करना है वह स्क्रीन के साथ लाइन की गणना करता है कि विमान और पोर्टल विमान के पास कैमरा किस दिशा में घूम रहा है, दिशा मुझे बताती है कि लाइन किस दिशा में जा रही है, और बिंदु लाइन के विभिन्न बिंदु हैं। फिर मैं एक shader / script में कैसे निर्धारित करूंगा कि कौन सी रेखा एक तरफ पिक्सेल रेखा को विभाजित करती है?
टिमोथी विलियम्स

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


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

3

सुझाए गए उत्तर बहुत अच्छे थे, लेकिन मैंने एक गहन मुखौटा का उपयोग करके एक अलग तकनीक के लिए जाना समाप्त कर दिया।

आप क्या करते हैं यह स्क्रिप्ट और शेडर है, आप अपने दृश्य में रेंडर के साथ हर ऑब्जेक्ट पर स्क्रिप्ट डालते हैं और रेंडर कतार को 3020 पर सेट करते हैं (मैं बाद में इसे आसान बनाने के लिए स्क्रिप्ट पोस्ट करूँगा)।

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

फिर आप मुख्य कैमरा लेते हैं और अपनी विशेष परत को अनचाहे मुखौटे (मैं अनचेकड डेप्समस्क लेयर) से अनचेक करते हैं और इसकी गहराई 0 पर सेट कर देते हैं। यहाँ छवि विवरण दर्ज करें

फिर जब आप कैमरा के माध्यम से टेलीपोर्ट कर रहे होते हैं, तो दूसरे कैमरे के स्पष्ट झंडे को "केवल गहराई" पर सेट करें और इसकी गहराई 1 हो जाए। यहाँ छवि विवरण दर्ज करें

फिर आपको दो कैमरा दृश्यों के बीच एक निर्बाध स्क्रीन मिश्रित होती है।

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