विषयसूची:

अजनबी चीजों से उल्टा एआर पोर्टल: 10 कदम (चित्रों के साथ)
अजनबी चीजों से उल्टा एआर पोर्टल: 10 कदम (चित्रों के साथ)

वीडियो: अजनबी चीजों से उल्टा एआर पोर्टल: 10 कदम (चित्रों के साथ)

वीडियो: अजनबी चीजों से उल्टा एआर पोर्टल: 10 कदम (चित्रों के साथ)
वीडियो: मूवी में सुपरहीरो/20 अजीब पल जिससे हर सुपरहीरो खुद को जोड़ सकता है 2024, नवंबर
Anonim
अजनबी चीजों से उल्टा एआर पोर्टल
अजनबी चीजों से उल्टा एआर पोर्टल
अजनबी चीजों से उल्टा एआर पोर्टल
अजनबी चीजों से उल्टा एआर पोर्टल

यह निर्देश योग्य iPhone के लिए एक पोर्टल के साथ एक संवर्धित वास्तविकता मोबाइल ऐप बनाने के माध्यम से जाएगा जो स्ट्रेंजर थिंग्स से उल्टा होता है। आप पोर्टल के अंदर जा सकते हैं, घूम सकते हैं और वापस बाहर आ सकते हैं। पोर्टल के अंदर सब कुछ तब तक पोर्टल के माध्यम से देखा जा सकता है जब तक आप अंदर नहीं जाते। एक बार अंदर जाने के बाद, सब कुछ हर जगह प्रस्तुत होगा, जब तक कि आप वास्तविक दुनिया में वापस नहीं चले जाते। हम Apple ARKit प्लगइन के साथ Unity 3D वीडियो गेम इंजन का उपयोग करेंगे। हमारे द्वारा उपयोग किए जाने वाले सभी सॉफ्टवेयर को मुफ्त में डाउनलोड और उपयोग किया जा सकता है। साथ चलने के लिए आपको एक विशेषज्ञ होने की आवश्यकता नहीं है, हम हर कदम पर चलेंगे!

चरण 1: एक नई एकता परियोजना शुरू करें।

एक नई एकता परियोजना शुरू करें।
एक नई एकता परियोजना शुरू करें।

सबसे पहले, Unity3D डाउनलोड करें और IOS प्लेटफॉर्म के लिए बिल्ड फाइल्स को इंस्टॉल करना सुनिश्चित करें। आपको Xcode डाउनलोड करने और एक निःशुल्क Apple डेवलपर खाते के लिए साइन अप करने की भी आवश्यकता होगी। आपके iPhone को भी IOS 11 या इससे ऊपर का संस्करण चलाना होगा। आज 5 फरवरी 2018 तक, IOS 11.3 बाहर हो गया है, लेकिन xCode 9.2 के पास अभी तक इसके लिए समर्थन फ़ाइलें नहीं हैं। इसलिए यदि आप नवीनतम IOS संस्करण चला रहे हैं, तो Apple. Developer.com से नवीनतम Xcode बीटा संस्करण डाउनलोड करना सुनिश्चित करें।

एक बार जब आपके पास सभी आवश्यक कार्यक्रम हों, तो एकता खोलें और एक नई परियोजना शुरू करें, जो भी आप चाहते हैं उसे कॉल करें। हमें ऐप्पल एआरकिट प्लगइन की आवश्यकता होगी ताकि हम अपने फोन के कैमरे का उपयोग जमीन पर किसी वस्तु के स्थान का पता लगाने के लिए कर सकें। आइए अब एसेट स्टोर टैब पर जाकर इसे आयात करें और "ARKit" खोजें। आपको एक मुफ्त एकता खाता बनाना होगा यदि आपके पास पहले से एक नहीं है, तो प्लगइन प्राप्त करने के लिए आयात पर क्लिक करें।

ARKit फ़ोल्डर में उदाहरण फ़ोल्डर में नेविगेट करें और "UnityARKitScene" ढूंढें। इसे खोलने के लिए उस पर डबल क्लिक करें। हम इस दृश्य को शुरुआती बिंदु के रूप में उपयोग करने जा रहे हैं और यहां से निर्माण करेंगे। यह दृश्य डिफ़ॉल्ट रूप से आपको जमीन का पता लगाने की अनुमति देगा और जब आप स्क्रीन पर टैप करेंगे, तो उस स्थिति में एक क्यूब रखा जाएगा।

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

चरण 2: दृश्य सेट करें।

दृश्य सेट करें।
दृश्य सेट करें।

पहले बाईं ओर एक नज़र डालें और "जेनरेटप्लेन्स" नामक गेम ऑब्जेक्ट ढूंढें। उस हाइलाइट के साथ, अभी देखें और इसे अक्षम करने के लिए चेक बॉक्स पर क्लिक करें। इस तरह जब ARKit एक ग्राउंड प्लेन का पता लगाता है तो हमारे पास बदसूरत नीले वर्ग उत्पन्न नहीं होते हैं। अगला "रैंडमक्यूब" गेम ऑब्जेक्ट को हटा दें क्योंकि हम इसे अपने दृश्य में नहीं देखना चाहते हैं।

अब हमें सबसे पहले अपना पोर्टल द्वार बनाना होगा। क्यूब को हटा दें जो "हिटक्यूबपेरेंट" का एक बच्चा है। राइट क्लिक करें और खाली गेम ऑब्जेक्ट बनाएं चुनें। इसे "पोर्टल" नाम दें। अब उस ऑब्जेक्ट पर राइट क्लिक करें और एक क्यूब बनाएं, इससे वह पोर्टल का चाइल्ड बन जाएगा। इसका नाम "पोस्ट लेफ्ट" रखें और यह हमारे पोर्टल का लेफ्ट पोस्ट होगा। इसे स्केल करें ताकि x 1 हो, y 28 हो और z एक हो। सही पोस्ट के लिए भी ऐसा ही करें। अब शीर्ष पोस्ट बनाएं और y को 14 तक स्केल करें। इस तरफ मुड़ें और इसे इस तरह से स्थानांतरित करें कि यह अन्य पदों को जोड़ता है। संपूर्ण पोर्टल स्केल १.३ x १.४ x १ बनाएं।

Google पर जाएं और लकड़ी या छाल की बनावट टाइप करें। उन छवियों में से एक को डाउनलोड करें और इसे एकता में अपने संपत्ति फ़ोल्डर में खींचें। अब उस इमेज को अपने सभी पोर्टल पोस्ट पर ड्रैग करें।

"पोर्टल" ऑब्जेक्ट पर फिर से क्लिक करें और दाईं ओर घटक जोड़ें पर क्लिक करें। इसमें "UnityARHitTestExample" स्क्रिप्ट जोड़ें। "हिट ट्रांसफॉर्म" के लिए वहां एक खाली स्लॉट है, "हिटक्यूबपैरेंट" ऑब्जेक्ट को उस स्लॉट में खींचें।

चरण 3: चलो कुछ कण बनाते हैं।

चलो कुछ कण बनाते हैं।
चलो कुछ कण बनाते हैं।

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

अपने पोर्टल के अंदर दो खाली गेम ऑब्जेक्ट बनाएं और एक को "स्मोकपार्टिकल्स" और दूसरे को "फ्लोटिंग पार्टिकल्स" कहें।

धुएं के कणों में एक कण प्रणाली घटक जोड़ें।

इस घटक में विकल्पों का एक समूह है लेकिन हमें केवल एक जोड़े को बदलने की जरूरत है।

लगभग 50% पारदर्शिता के साथ प्रारंभ रंग को गहरे नीले रंग में बदलें। उत्सर्जन दर 100 करें। आकार के अंदर, त्रिज्या.01 बनाएं। नीचे दिए गए रेंडरर भाग में न्यूनतम आकार को.8 और अधिकतम आकार को 5 में बदलें। सामग्री घटक पर केवल सूची से धूम्रपान सामग्री चुनें, लेकिन हम इसे बाद में बदलने जा रहे हैं।

अब फ्लोटिंग पार्टिकल्स गेम ऑब्जेक्ट में एक पार्टिकल सिस्टम जोड़ें और उत्सर्जन को ५०० पर सेट करें। प्रारंभ जीवनकाल को २ पर, त्रिज्या को १०, न्यूनतम कण आकार को.०१, और अधिकतम कण आकार को.०१५ पर सेट करें। सामग्री को अभी के लिए डिफ़ॉल्ट कण पर सेट करें।

अंत में दोनों गेम ऑब्जेक्ट लें और उन्हें x पर 90 डिग्री तक घुमाएं और उन्हें हवा में ऊपर उठाएं ताकि वे पोर्टल द्वार पर नीचे निकल रहे हों।

चरण 4: कणों को धीमा करना।

कणों को धीमा करना।
कणों को धीमा करना।

चूंकि हम चाहते हैं कि ये कण एक बड़े क्षेत्र को कवर करें, लेकिन धीमी गति से आगे बढ़ें, इसलिए हमें अपना स्वयं का नमूना फ़ंक्शन बनाने की आवश्यकता है। तो संपत्ति फ़ोल्डर में राइट क्लिक करें और एक नई सी # स्क्रिप्ट बनाएं और इसे "कण नमूना" कहें। इस कोड में कॉपी और पेस्ट करें:

सिस्टम का उपयोग करना। संग्रह;

System. Collections. Generic का उपयोग करना; यूनिटीइंजिन का उपयोग करना; पब्लिक क्लास पार्टिकल सैंपल: मोनोबिहेवियर {निजी पार्टिकलसिस्टम पीएस; // इसे प्रारंभ करने के लिए उपयोग करें शून्य प्रारंभ () {ps = GetComponent (); StartCoroutine (SampleParticleRoutine ()); } IEnumerator sampleParticleRoutine(){ var main = ps.main; main.सिमुलेशन स्पीड = 1000f; पीएस.प्ले (); उपज वापसी नया WaitForSeconds (.1f); main.सिमुलेशन स्पीड =.05f; } }

अब इस स्क्रिप्ट को अपने प्रत्येक कण सिस्टम गेम ऑब्जेक्ट पर खींचें।

चरण 5: पोर्टल बनाना

पोर्टल बनाना!
पोर्टल बनाना!

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

शेडर "पोर्टल/पोर्टलविंडो"

{ सबशैडर {Zराइट ऑफ कलरमास्क 0 कल्ल ऑफ स्टैंसिल{ रेफरी 1 पास रिप्लेस } पास { } }

पदानुक्रम में राइट क्लिक करें और एक नई सामग्री बनाएं, इसे पोर्टलविंडोमैट कहें, इस सामग्री के लिए ड्रॉपडाउन में पोर्टल अनुभाग ढूंढें, और पोर्टल विंडो चुनें। इस सामग्री को अपने पोर्टल क्वाड पर खींचें।

चरण 6: कण शेडर्स।

कण शेडर्स।
कण शेडर्स।

फिर से एसेट फोल्डर में राइट क्लिक करें और एक नया शेडर बनाएं। हमें पोर्टल के अंदर जाने वाले कणों के लिए शेडर बनाने की जरूरत है। इसके साथ सभी कोड बदलें:

शेडर "पोर्टल/कण" {

गुण { _TintColor ("टिंट कलर", कलर) = (0.5, 0.5, 0.5, 0.5) _MainTex ("पार्टिकल टेक्सचर", 2D) = "व्हाइट" {} _InvFade ("सॉफ्ट पार्टिकल्स फैक्टर", रेंज (0.01, 3.0)) = 1.0 _Stencil("stencil", int) = 6 } श्रेणी { टैग { "कतार" = "पारदर्शी" "अनदेखा प्रोजेक्टर" = "सच" "रेंडर टाइप" = "पारदर्शी" "पूर्वावलोकन प्रकार" = "विमान" } ब्लेंड SrcAlpha OneMinusSrcAlpha कलरमास्क आरजीबी क्यूल ऑफ लाइटिंग ऑफ जेडराइट ऑफ सबशैडर {स्टैंसिल {रेफरी 1 कॉम्प [_ स्टैंसिल]} पास {सीजीप्रोग्राम #pragma वर्टेक्स वर्ट #pragma फ्रैगमेंट फ्रैग #pragma टारगेट 2.0 #pragma multi_compile_particles #pragma multi_compile_fog #include "UnityCG"; फिक्स्ड 4 _ टिंटकलर; struct appdata_t {float4 vertex: POSITION; फिक्स्ड 4 रंग: रंग; फ्लोट 2 टेक्सकोर्ड: टेक्सकोर्ड0; UNITY_VERTEX_INPUT_INSTANCE_ID }; संरचना v2f {float4 शीर्ष: SV_POSITION; निश्चित 4 रंग: रंग; फ्लोट 2 टेक्सकोर्ड: टेक्सकोर्ड0; UNITY_FOG_COORDS(1) #ifdef SOFTPARTICLES_ON float4 प्रोजेक्ट: TEXCOORD2; #endif UNITY_VERTEX_OUTPUT_STEREO }; फ्लोट4 _मेनटेक्स_एसटी; v2f वर्ट (appdata_t v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); o.vertex = UnityObjectToClipPos (v.vertex); #ifdef SOFTPARTICLES_ON o.projPos = ComputeScreenPos (o.vertex); COMPUTE_EYEDEPTH(o.projPos.z); #endif o.color = v.color * _TintColor; o.texcoord = TRANSFORM_TEX (v.texcoord, _MainTex); UNITY_TRANSFER_FOG(o, o.vertex); वापसी ओ; } UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture); फ्लोट _InvFade; Fixed4 frag (v2f i): SV_Target { #ifdef SOFTPARTICLES_ON फ्लोट सीनजेड = लीनियरआई डेप्थ (SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))); फ्लोट पार्टजेड = i.projPos.z; फ्लोट फीका = संतृप्त (_InvFade * (sceneZ-partZ)); i.color.a *= फीका; #endif Fixed4 col = 2.0f * i.color * tex2D(_MainTex, i.texcoord); UNITY_APPLY_FOG(i.fogCoord, col); वापसी कर्नल; } ईएनडीसीजी } } } }

दो नई सामग्री बनाएं, एक पोर्टलस्मोक कहलाती है, और एक पोर्टलपार्टिकल्स कहलाती है।

हर एक के लिए इस शेडर को ड्रॉप डाउन से, पोर्टल्स, पार्टिकल्स में चुनें। धुएँ के कणों के लिए धुएँ की बनावट चुनें और कणों के लिए कण बनावट चुनें। लगभग 50% पारदर्शिता के साथ धुएं के रंग को गहरे नीले रंग में बदलें। अपने पोर्टल में प्रत्येक कण प्रणाली के रेंडरर घटक पर जाएं और उनकी संबंधित सामग्री चुनें जिसे हमने अभी बनाया है।

चरण 7: स्काईबॉक्स बनाएं।

स्काईबॉक्स बनाएं।
स्काईबॉक्स बनाएं।

अब वास्तव में उल्टा प्रकार का रूप बनाने के लिए हमें हर चीज को गहरा नीला रंग देना होगा। इसके लिए हम एक पारदर्शी स्काईबॉक्स का उपयोग करेंगे, इसलिए एक नया शेडर बनाएं और इस कोड में पेस्ट करें:

शेडर "पोर्टल/पोर्टल स्काईबॉक्स" {

गुण { _ टिंट ("टिंट कलर", कलर) = (.5,.5,.5,.5) [गामा] _एक्सपोज़र ("एक्सपोज़र", रेंज (0, 8)) = 1.0 _रोटेशन ("रोटेशन", रेंज (०, ३६०)) = ० [NoScaleOffset] _Tex ("क्यूबमैप (HDR)", क्यूब) = "ग्रे" {} _Stencil("StencilNum", int) = 6 } SubShader {टैग {"क्यू"="पृष्ठभूमि" "रेंडर टाइप" = "बैकग्राउंड" "पूर्वावलोकन प्रकार" = "स्काईबॉक्स" } ZWrite बंद ब्लेंड SrcAlpha OneMinusSrcAlpha स्टैंसिल {Ref 1 Comp [_Stencil] } पास {CGPROGRAM #pragma vertex vert #pragma टुकड़ा frag #pragma target 2.0 #include "UnityCG.cginc" सैंपलरCUBE _Tex; आधा ४ _टेक्स_एचडीआर; आधा4 _ टिंट; आधा _एक्सपोज़र; फ्लोट _रोटेशन; फ्लोट ३ रोटेटअराउंडवाईइनडिग्री (फ्लोट३ वर्टेक्स, फ्लोट डिग्री) {फ्लोट अल्फा = डिग्री * UNITY_PI / १८०.०; फ्लोट सिना, कोसा; sincos(अल्फा, सिना, कोसा); फ्लोट२x२ मीटर = फ्लोट२एक्स२(कोसा, -सिना, सिना, कोसा); वापसी फ्लोट 3 (मुल (एम, वर्टेक्स। एक्सजेड), वर्टेक्स। वाई)। xzy; } संरचना appdata_t {float4 शीर्ष: स्थिति; UNITY_VERTEX_INPUT_INSTANCE_ID }; संरचना v2f {float4 शीर्ष: SV_POSITION; फ्लोट 3 टेक्सकोर्ड: टेक्सकोर्ड0; UNITY_VERTEX_OUTPUT_STEREO}; v2f वर्ट (appdata_t v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); फ्लोट 3 घुमाया गया = रोटेटअराउंडवाईइनडिग्री (v.vertex, _Rotation); o.vertex = UnityObjectToClipPos (घुमाया); o.texcoord = v.vertex.xyz; वापसी ओ; } फिक्स्ड4 फ्रैग (v2f i): SV_Target {आधा4 टेक्स = टेक्सक्यूब (_Tex, i.texcoord); आधा3 सी = डीकोडएचडीआर (टेक्स, _Tex_HDR); सी = सी * _Tint.rgb * एकता_ColorSpaceDouble.rgb; सी *= _एक्सपोज़र; आधा 4 (सी,.5) वापसी; } ईएनडीसीजी } } फ़ॉलबैक ऑफ़ }

अब एक नई स्काईबॉक्स सामग्री बनाएं, इसे "पोर्टल स्काईबॉक्स" कहें और पोर्टल मेनू से इस पोर्टल स्काईबॉक्स शेडर को चुनें। सबसे ऊपर विंडो, लाइटिंग पर जाएं और इस स्काईबॉक्स को चुनें जिसे हमने अभी बनाया है। मुख्य कैमरे पर जाएं और स्पष्ट फ़्लैग्स को स्काईबॉक्स पर सेट करें। जब हम यहां हैं तो हम अपने कैमरे में कुछ घटक जोड़ सकते हैं ताकि हम टकराव का पता लगा सकें। कैमरे में एक कठोर शरीर घटक जोड़ें और गुरुत्वाकर्षण का उपयोग अनचेक करें। एक बॉक्स कोलाइडर जोड़ें और चेक ऑन ट्रिगर है। बॉक्स कोलाइडर का आकार.5 x 1 x 4 बनाएं। कैमरे पर क्लिपिंग प्लेन को.01 पर सेट करें।

चरण 8: पोर्टल तर्क।

पोर्टल तर्क।
पोर्टल तर्क।

आखिरी चीज जो हमें करने की जरूरत है वह है वह तर्क जो हमारे पोर्टल को नियंत्रित करता है। एक नई सी # स्क्रिप्ट बनाएं और इसे पोर्टल नियंत्रक कहते हैं।

सिस्टम का उपयोग करना। संग्रह;

System. Collections. Generic का उपयोग करना; यूनिटीइंजिन का उपयोग करना; नाम स्थान UnityEngine. XR.iOS {पब्लिक क्लास PortalController: MonoBehaviour {सार्वजनिक सामग्री सामग्री; सार्वजनिक मेशरेंडरर मेशरेंडरर; सार्वजनिक एकताएआरवीडियो एकताएआरवीडियो; निजी बूल इनसाइड = झूठा है; निजी बूल isOutside = true; // इसे प्रारंभ करने के लिए उपयोग करें शून्य प्रारंभ () {बाहरी पोर्टल (); } शून्य OnTriggerStay(Collider col){ Vector3 playerPos = Camera.main.transform.position + Camera.main.transform.forward * (Camera.main.nearClipPlane * 4); if (transform. InverseTransformPoint(playerPos).z <= 0){ अगर (isOutside) { isOutside = false; अंदर = सच; इनसाइडपोर्टल (); }} और { अगर (isInside) { isInside = false; isOutside = सच; आउटसाइडपोर्टल (); } } } शून्य आउटसाइडपोर्टल () { StartCoroutine (DelayChangeMat (3)); } शून्य इनसाइडपोर्टल () {StartCoroutine (DelayChangeMat (6)); } IEnumerator DelayChangeMat(int stencilNum){ UnityARVideo. shouldRender = false; उपज वापसी नया WaitForEndOfFrame (); मेशरेंडरर.सक्षम = झूठा; foreach (सामग्री में सामग्री चटाई) { mat. SetInt ("_Stencil", stencilNum); } उपज वापसी नया WaitForEndOfFrame (); मेशरेंडरर.सक्षम = सच; यूनिटीएआरवीडियो.शोल्डरेंडर = सच; } } }

इस नई स्क्रिप्ट को अपनी पोर्टल विंडो पर खींचें। जब भी हमारे कैमरे का कोलाइडर पोर्टल विंडो से टकराता है, तो यह हमें पोर्टल के अंदर और बाहर संक्रमण कर देगा। अब उस फ़ंक्शन में जो सभी सामग्रियों को बदलता है, हम ARkit प्लगइन को फ्रेम रेंडर नहीं करने के लिए कहते हैं, इसलिए मुख्य कैमरे पर जाएं और UnityARVideo स्क्रिप्ट खोलें। शीर्ष पर एक सार्वजनिक बूल चाहिए रेंडर करें और इसे सत्य के बराबर सेट करें। OnPreRender() फ़ंक्शन में नीचे सब कुछ एक if स्टेटमेंट में लपेटें, जहां अंदर सब कुछ केवल तभी चलेगा जब shouldRender सत्य हो। पूरी स्क्रिप्ट इस तरह दिखनी चाहिए:

सिस्टम का उपयोग करना;

System. Runtime. InteropServices का उपयोग करना; यूनिटीइंजिन का उपयोग करना; UnityEngine. Rendering का उपयोग करना; नेमस्पेस UnityEngine. XR.iOS { पब्लिक क्लास यूनिटीएआरवीडियो: मोनो बिहेवियर { सार्वजनिक सामग्री m_ClearMaterial; [HideInInspector] पब्लिक बूल को रेंडर करना चाहिए = ट्रू; निजी कमांडबफ़र m_VideoCommandBuffer; निजी Texture2D _videoTextureY; निजी Texture2D _videoTextureCbCr; निजी मैट्रिक्स4x4 _displayTransform; निजी बूल bCommandBufferInitialized; सार्वजनिक शून्य प्रारंभ () { UnityARSessionNativeInterface. ARFrameUpdatedEvent += UpdateFrame; bCommandBufferInitialized = false; } शून्य अपडेटफ्रेम (यूनिटीएआरकैमरा कैम) { _displayTransform = नया मैट्रिक्स4x4 (); _displayTransform. SetColumn(0, cam.displayTransform.column0); _displayTransform. SetColumn(1, cam.displayTransform.column1); _displayTransform. SetColumn(2, cam.displayTransform.column2); _displayTransform. SetColumn(3, cam.displayTransform.column3); } शून्य इनिशियलाइज़ कमांडबफ़र () {m_VideoCommandBuffer = नया कमांडबफ़र (); m_VideoCommandBuffer. Blit (शून्य, बिल्टिनरेंडर टेक्स्ट्योर टाइप। करंटएक्टिव, m_ClearMaterial); GetComponent ()। AddCommandBuffer (CameraEvent. BeforeForwardOpaque, m_VideoCommandBuffer); bCommandBufferInitialized = true; } शून्य OnDestroy () { GetComponent ()।RemoveCommandBuffer (CameraEvent. BeforeForwardOpaque, m_VideoCommandBuffer); UnityARSessionNativeInterface. ARFrameUpdatedEvent -= UpdateFrame; bCommandBufferInitialized = false; } #if !UNITY_EDITOR सार्वजनिक शून्य OnPreRender() { अगर (चाहिए रेंडर){ ARTextureHandles हैंडल = UnityARSessionNativeInterface. GetARSessionNativeInterface ()। GetARVideoTextureHandles (); if (handles.textureY == System. IntPtr. Zero || handles.textureCbCr == System. IntPtr. Zero) {रिटर्न; } अगर (! bCommandBufferInitialized) {InitializeCommandBuffer (); } संकल्प वर्तमान समाधान = Screen.currentResolution; // बनावट Y अगर (_videoTextureY == null) { _videoTextureY = Texture2D. CreateExternalTexture(currentResolution.width, currentResolution.height, TextureFormat. R8, false, false, (System. IntPtr)handles.textureY); _videoTextureY.filterMode = FilterMode. Bilinear; _videoTextureY.wrapMode = TextureWrapMode. Repeat; m_ClearMaterial. SetTexture ("_textureY", _videoTextureY);] _videoTextureCbCr.filterMode = FilterMode. Bilinear; _videoTextureCbCr.wrapMode = TextureWrapMode. Repeat; m_ClearMaterial. SetTexture ("_textureCbCr", _videoTextureCbCr); } _videoTextureY. UpdateExternalTexture(handles.textureY); _videoTextureCbCr. UpdateExternalTexture(handles.textureCbCr); m_ClearMaterial. SetMatrix ("_DisplayTransform", _displayTransform); } } #else public void SetYTexure(Texture2D YTex) { _videoTextureY = YTex; } सार्वजनिक शून्य SetUVTexure(Texture2D UVTex) { _videoTextureCbCr = UVTex; } सार्वजनिक शून्य OnPreRender() { अगर (! bCommandBufferInitialized) {InitializeCommandBuffer (); } m_ClearMaterial. SetTexture("_textureY", _videoTextureY); m_ClearMaterial. SetTexture ("_textureCbCr", _videoTextureCbCr); m_ClearMaterial. SetMatrix ("_DisplayTransform", _displayTransform); } #अगर अंत } }

चरण 9: लगभग हो गया

लगभग हो गया!
लगभग हो गया!

अंत में जब हम स्क्रीन पर क्लिक करते हैं और पोर्टल डालते हैं तो हम चाहते हैं कि यह हमेशा हमारे सामने रहे। ऐसा करने के लिए पोर्टल पर "UnityARHitTestExample" स्क्रिप्ट पर जाएं। इसके साथ सब कुछ बदलें:

सिस्टम का उपयोग करना;

System. Collections. Generic का उपयोग करना; नामस्थान UnityEngine. XR.iOS { सार्वजनिक वर्ग UnityARHitTestExample: MonoBehaviour { सार्वजनिक रूपांतरण m_HitTransform; सार्वजनिक फ्लोट मैक्सरेडिस्टेंस = ३०.०एफ; पब्लिक लेयरमास्क कोलिजनलेयर = 1 < 0) { foreach (var HitResult in HitResults) { Debug. Log ("गॉट हिट!"); m_HitTransform.position = UnityARMatrixOps. GetPosition (hitResult.worldTransform); m_HitTransform.rotation = UnityARMatrixOps. GetRotation (hitResult.worldTransform); डीबग.लॉग (स्ट्रिंग.फ़ॉर्मेट ("x:{0:0.######} y:{1:0.######} z:{2:0.###### }", m_HitTransform.position.x, m_HitTransform.position.y, m_HitTransform.position.z)); वेक्टर ३ currAngle = transform.eulerAngles; ट्रांसफॉर्म।लुकएट (Camera.main.transform); Transform.eulerAngles = new Vector3 (currAngle.x,Transform.eulerAngles.y, currAngle.z); सच लौटना; } } विवरण झूठा है;)) {रे रे = Camera.main. ScreenPointToRay (Input.mousePosition); रेकास्टहिट हिट; // हम प्लेन कोलाइडर गेमऑब्जेक्ट्स में से एक को हिट करने का प्रयास करेंगे जो प्लगइन द्वारा उत्पन्न किया गया था हम संपर्क बिंदु से स्थिति प्राप्त करने जा रहे हैं m_HitTransform.position = hit.point; Debug. Log (string. Format ("x:{0:0.######} y:{1:0.######} z:{2:0.###### }", m_HitTransform.position.x, m_HitTransform.position.y, m_HitTransform.position.z)); // और विमान कोलाइडर के परिवर्तन से रोटेशन m_HitTransform.rotation = hit.transform.rotation; } } #else if (Input.touchCount > 0 && m_HitTransform != null) { var touch = Input. GetTouch(0); अगर (टच। फेज == टचफेस। बेगन || टच।फेज == टचफेस। मूवेड) { वर स्क्रीनपोजिशन = कैमरा.मेन।स्क्रीनटोव्यूपोर्टपॉइंट (टच। पोजीशन); ARPoint बिंदु = नया ARPoint { x = ScreenPosition.x, y = ScreenPosition.y}; // परिणाम प्रकार को प्राथमिकता दें ARHitTestResultType foreach (ARHitTestResultType resultType in resultTypes) {if (HitTestWithResultType (पॉइंट, रिजल्ट टाइप)) {रिटर्न; } } } } #अगर अंत } } }

चरण 10: ऐप को अपने फोन पर रखें

ऐप को अपने फोन पर रखें!
ऐप को अपने फोन पर रखें!

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

सिफारिश की: