AR պորտալ դեպի գլխիվայր ՝ օտար բաներից. 10 քայլ (նկարներով)
AR պորտալ դեպի գլխիվայր ՝ օտար բաներից. 10 քայլ (նկարներով)
Anonim
AR Portal to the Upside Down From Stranger Things- ից
AR Portal to the Upside Down From Stranger Things- ից
AR Portal to the Upside Down From Stranger Things- ից
AR Portal to the Upside Down From Stranger Things- ից

Այս Instructable- ը կանցնի iPhone- ի համար ընդլայնված իրականության բջջային հավելվածի ստեղծման միջոցով `պորտալով, որը տանում է դեպի Օտարի բաները գլխիվայր շրջված: Կարող եք մտնել պորտալի ներսում, շրջել և նորից դուրս գալ: Պորտալի ներսում ամեն ինչ կարելի է տեսնել միայն պորտալի միջոցով, քանի դեռ չեք ներս մտել: Ներս մտնելուց ամեն ինչ կդասավորվի ամենուր, մինչև չանցնեք իրական աշխարհ: Մենք կօգտագործենք Unity 3D տեսախաղերի շարժիչը Apple ARKit պլագինով: Բոլոր ծրագրերը, որոնք մենք կօգտագործենք, կարող են ներբեռնվել և օգտագործվել անվճար: Հետևելու համար ձեզ հարկավոր չէ փորձագետ լինել, մենք կանցնենք յուրաքանչյուր քայլի:

Քայլ 1: Սկսեք նոր միասնության նախագիծ:

Սկսեք նոր միասնության նախագիծ
Սկսեք նոր միասնության նախագիծ

Նախ, ներբեռնեք Unity3D- ը և համոզվեք, որ տեղադրեք կառուցման ֆայլերը IOS հարթակի համար: Դուք նաև պետք է ներբեռնեք Xcode և գրանցվեք խնձորի մշակողի անվճար հաշվին: Ձեր iPhone- ը նույնպես պետք է աշխատի IOS 11 կամ ավելի բարձր: 2018 թվականի փետրվարի 5 -ի դրությամբ IOS 11.3 -ը դուրս է, բայց xCode 9.2 -ը դեռ չունի դրա օժանդակ ֆայլեր: Այսպիսով, եթե դուք աշխատում եք IOS- ի վերջին տարբերակով, համոզվեք, որ ներբեռնեք վերջին Xcode բետա տարբերակը Apple. Developer.com- ից:

Երբ դուք ունենաք բոլոր անհրաժեշտ ծրագրերը, բացեք Unity- ը և սկսեք նոր նախագիծ, անվանեք այն ինչ ուզում եք: Մեզ պետք կգա Apple ARKit պլագինը, որպեսզի կարողանանք մեր հեռախոսի տեսախցիկով հայտնաբերել գետինը և հատակին առարկաներ տեղադրել: Եկեք դա ներմուծենք ՝ գնալով Asset Store ներդիր և որոնելով «ARKit»: Դուք պետք է ստեղծեք անվճար Unity հաշիվ, եթե այն դեռ չունեք, այնուհետև կտտացրեք ներմուծումը ՝ հավելումը ստանալու համար:

Գնացեք ARKit պանակում գտնվող օրինակների պանակ և գտեք «UnityARKitScene»: Կրկնակի կտտացրեք այն ՝ այն բացելու համար: Մենք պատրաստվում ենք այս տեսարանը օգտագործել որպես ելակետ և կառուցել այստեղից: Այս տեսարանը լռելյայն թույլ կտա հայտնաբերել գետինը և էկրանին թակելիս այդ դիրքում խորանարդ կտեղադրվի:

Եկեք նախ մեր կառուցման կարգավորումները քառակուսի դնենք, որպեսզի չմոռանանք դա անել ավելի ուշ: Կտտացրեք ֆայլը, ստեղծեք կարգավորումներ և հեռացրեք բոլոր տեսարանները այդ ցուցակից: Կտտացրեք ավելացնել բաց տեսարաններ ՝ մեր ներկաը ավելացնելու համար: Վերջին բանը, որ մենք պետք է ստեղծենք այստեղ, նվագարկիչի պարամետրերում իջնում է փաթեթային նույնացուցիչի, և այս տողի ձևաչափը com. YourCompanyName. YourAppName է, ուստի իմ դեպքում ես անում եմ com. MatthewHallberg. PortalTest- ի նման մի բան:

Քայլ 2: Կարգավորեք տեսարանը:

Կարգավորել տեսարանը
Կարգավորել տեսարանը

Նախ նայեք ձախ և գտեք «GeneratePlanes» կոչվող խաղի օբյեկտը: Նշվածի հետ մեկտեղ, աջ կողմը նայեք և կտտացրեք վանդակը ՝ այն անջատելու համար: Այս կերպ մենք չունենք տգեղ կապույտ քառակուսիներ, որոնք ստեղծվում են, երբ ARKit- ը հայտնաբերում է ստորերկրյա հարթություն: Հաջորդը ջնջեք «RandomCube» խաղի օբյեկտը, քանի որ մենք չենք ուզում դա տեսնել մեր տեսարանում:

Այժմ մենք պետք է նախ ստեղծենք մեր պորտալի դռները: Leteնջեք այն խորանարդը, որը «HitCubeParent» - ի երեխան է: Աջ սեղմեք և ընտրեք ստեղծել դատարկ խաղի օբյեկտ: Վերանվանել այն «Պորտալ»: Այժմ աջ սեղմեք այդ օբյեկտի վրա և ստեղծեք խորանարդ, սա այն կդարձնի պորտալի երեխա: Վերանվանել այն «PostLeft», և սա կլինի մեր պորտալի ձախ գրառումը: Այն մասշտաբավորեք այնպես, որ x- ը 1 է, y- ը ՝ 28, իսկ z- ը ՝ մեկ: Նույնը արեք ճիշտ գրառման համար: Այժմ ստեղծեք վերին գրառումը և y- ն կդարձնեք 14 -ի: Շրջեք այս կողմը և տեղափոխեք այն այնպես, որ այն միացնի մյուս գրառումները: Ամբողջ պորտալի մասշտաբը դարձրեք 1.3 x 1.4 x 1:

Գնացեք Google և մուտքագրեք փայտի կամ կեղևի հյուսվածք: Ներբեռնեք այդ պատկերներից մեկը և այն քաշեք Unity- ի ձեր ակտիվների պանակ: Այժմ քաշեք այդ պատկերը ձեր բոլոր պորտալային գրառումների վրա:

Կրկին կտտացրեք «Պորտալ» օբյեկտի վրա և աջից կտտացրեք ավելացնել բաղադրիչ: Ավելացրեք «UnityARHitTestExample» սցենարը դրան: Այնտեղ կա դատարկ անցք «Հարվածի փոխակերպման» համար, քաշեք «HitCubeParent» օբյեկտը այդ անցքի մեջ:

Քայլ 3: Եկեք որոշ մասնիկներ պատրաստենք:

Եկեք որոշ մասնիկներ պատրաստենք
Եկեք որոշ մասնիկներ պատրաստենք

Այժմ մենք պատրաստվում ենք օգտագործել Unity Particle համակարգը ՝ մեր պորտալի ներսում ծխի և լողացող մասնիկների էֆեկտ ստեղծելու համար: Գնացեք ակտիվներ վերևի ցանկի բարում, ստանդարտ ակտիվներ և ներմուծեք մասնիկների համակարգեր:

Ստեղծեք խաղի երկու դատարկ օբյեկտ ձեր պորտալի ներսում և մեկն անվանեք «SmokeParticles», իսկ մյուսը ՝ «FloatingParticles»:

Smokeխի մասնիկներին ավելացրեք մասնիկների համակարգի բաղադրիչ:

Այս բաղադրիչն ունի մի շարք տարբերակներ, բայց մենք միայն պետք է զույգ փոխենք:

Սկզբի գույնը փոխեք մուգ կապույտի ՝ 50% թափանցիկությամբ: Դարձրեք արտանետումների արագությունը 100. Ձևի ներսում կազմեք շառավիղը.01. Ներքևի մասում մատուցման մասում նվազագույն չափը փոխեք 0,8 -ի, իսկ առավելագույնը `5 -ի: Նյութի բաղադրիչի վրա պարզապես ընտրեք ծխի նյութը ցուցակից, բայց մենք դա կփոխենք ավելի ուշ:

Լողացող մասնիկների խաղային օբյեկտին ավելացրեք մասնիկների համակարգ և սահմանեք արտանետումը 500: Գործարկման սկզբունքը սահմանեք 2, շառավիղը `10, մասնիկների չափը` 0,01, մասնիկների առավելագույն չափը `0,015: Առայժմ նյութը դարձրեք կանխադրված մասնիկ:

Վերջապես վերցրեք երկու խաղային առարկաները և դրանք 90 աստիճանով պտտեցրեք x- ի վրա և դրանք բարձրացրեք օդ, որպեսզի նրանք արտանետվեն դեպի դարպասի մուտքի դուռը:

Քայլ 4: Մասնիկների դանդաղեցում:

Դանդաղեցնելով մասնիկները
Դանդաղեցնելով մասնիկները

Քանի որ մենք ցանկանում ենք, որ այս մասնիկները ծածկեն մեծ տարածք, բայց նաև դանդաղ շարժվեն, մենք պետք է ստեղծենք մեր սեփական նմուշի գործառույթը: Այսպիսով, աջ սեղմեք ակտիվների թղթապանակում և ստեղծեք նոր C# սցենար և անվանեք այն «ParticleSample»: Պատճենեք և տեղադրեք այս ծածկագրում ՝

օգտագործելով System. Collections;

օգտագործելով System. Collections. Generic; օգտագործելով UnityEngine; հանրային դաս ParticleSample: MonoBehaviour {private ParticleSystem ps; // Օգտագործեք սա սկզբնավորման համար void Start () {ps = GetComponent (); StartCoroutine (SampleParticleRoutine ()); } IEnumerator SampleParticleRoutine () {var main = ps.main; main.simulationSpeed = 1000f; ps. Խաղալ (); եկամտաբերության վերադարձ նոր WaitForSeconds (.1f); main.simulationSpeed =.05f; }}

Այժմ քաշեք այս սցենարը ձեր մասնիկների համակարգի խաղի յուրաքանչյուր օբյեկտի վրա:

Քայլ 5: Պորտալի ստեղծում:

Պորտալի ստեղծում
Պորտալի ստեղծում

Այժմ մենք պետք է ստեղծենք պորտալը, այնպես որ աջ սեղմեք պորտալի խաղի օբյեկտի վրա և ստեղծեք քառյակ: Քառապատկեք այնպես, որ այն ընդգրկում է ամբողջ պորտալը, սա կդառնա մեր պորտալի պատուհանը: Առաջին բանը, որ մենք պետք է ավելացնենք դրան, դա պորտալի ստվերիչն է: Սա միայն առարկաներ կդարձնի, որոնց վրա կա մեկ այլ հատուկ ստվեր: Աջ սեղմեք ակտիվների թղթապանակում և ստեղծեք նոր չլուսավորված ստվեր: Հեռացրեք այնտեղ ամեն ինչ և տեղադրեք այս ծածկագրում.

Shader "Portal/portalWindow"

{SubShader {Zwrite off Colormask 0 cull off Stencil {Ref 1 Pass փոխարինել} Pass {}}}

Հիերարխիայում աջ սեղմեք և ստեղծեք նոր նյութ, անվանեք այն PortalWindowMat, այս նյութի բացվող պատուհանում գտեք պորտալի բաժինը և ընտրեք պորտալի պատուհան: Քաշեք այս նյութը ձեր պորտալի քառանկյունի վրա:

Քայլ 6: Մասնիկների ստվերներ:

Particle Shaders
Particle Shaders

Կրկին աջ սեղմեք ակտիվների թղթապանակում և ստեղծեք նոր ստվեր: Մենք պետք է ստվերներ պատրաստենք այն մասնիկների համար, որոնք մտնում են պորտալի ներսում: Փոխարինեք ամբողջ ծածկագիրը հետևյալով.

Shader «Պորտալ/մասնիկներ» {

Հատկություններ {_TintColor ("Երանգների գույն", Գույն) = (0.5, 0.5, 0.5, 0.5) _MainTex ("Particle Texture", 2D) = "white" {} _InvFade ("Soft Particles Factor", Range (0.01, 3.0)) = 1.0 _Stencil ("stencil", int) = 6} Կատեգորիա {Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane"} Blend SrcAlpha OneMinusSrcAlpha ColorMask RGB Cull Off Lighting Off ZWrite Off SubShader {Stencil {Ref 1 Comp [_Stencil]} Pass {CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 2.0 #pragma multi_compile_particles #pragma multi_compile_fog #incincig2 ֆիքսված 4 _TintColor; struct appdata_t {float4 գագաթ ՝ POSITION; ֆիքսված 4 գույն ՝ ԳՈLՅՆ; float2 texcoord: TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID}; struct v2f {float4 գագաթ ՝ SV_POSITION; ֆիքսված 4 գույն ՝ ԳՈLՅՆ; float2 texcoord: TEXCOORD0; UNITY_FOG_COORDS (1) #ifdef SOFTPARTICLES_ON float4 projPos: TEXCOORD2; #endif UNITY_VERTEX_OUTPUT_STEREO}; float4 _MainTex_ST; v2f vert (appdata_t v) {v2f o; UNITY_SETUP_INSTANCE_ID (v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO (ժ); 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); վերադարձ o; } UNITY_DECLARE_DEPTH_TEXTURE (_CameraDepthTexture); բոց _InvFade; fixed4 frag (v2f i). SV_Target {#ifdef SOFTPARTICLES_ON float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ (_CameraDepthTexture, UNITY_PROJ_COORD (i.projPos)))); float partZ = i.projPos.z; float fade = հագեցում (_InvFade * (sceneZ-partZ)); i.color.a *= մարել; #endif fixed4 col = 2.0f * i.color * tex2D (_MainTex, i.texcoord); UNITY_APPLY_FOG (i.fogCoord, col); վերադարձի գնդիկ; } ENDCG}}}}

Ստեղծեք երկու նոր նյութ ՝ մեկը ՝ portalSmoke և մեկը ՝ portalParticles:

Յուրաքանչյուրի համար ընտրեք այս սափրիչը `բացվող ներքևից, պորտալներում` մասնիկներ: Theխի մասնիկների համար ընտրեք ծխի հյուսվածք, իսկ մասնիկների համար `մասնիկների հյուսվածք: Փոխեք ծխի գույնը ավելի մուգ կապույտի `մոտ 50% թափանցիկությամբ: Գնացեք ձեր պորտալի յուրաքանչյուր մասնիկ համակարգի մատուցման բաղադրիչ և ընտրեք դրանց համապատասխան նյութերը, որոնք մենք ստեղծել ենք:

Քայլ 7: Ստեղծեք Skybox:

Ստեղծեք Skybox
Ստեղծեք Skybox

Այժմ իսկապես գլխիվայր տեսք ստեղծելու համար մենք պետք է երանգավորենք ամեն ինչ մուգ կապույտ: Դրա համար մենք կօգտագործենք թափանցիկ Skybox, այնպես որ պատրաստեք նոր ստվեր և տեղադրեք այս ծածկագրում.

Shader "Portal/portalSkybox" {

Հատկություններ {_Tint ("Tint Color", Color) = (.5,.5,.5,.5) [Gamma] _Exposure ("Exposure", Range (0, 8)) = 1.0 _Rotation ("Rotation", Range (0, 360)) = 0 [NoScaleOffset] _Tex («Cubemap (HDR)», Cube) = "gray" {} _Stencil ("StencilNum", int) = 6} SubShader {Tags {"Queue" = "Background" "RenderType" = "Նախապատմություն" "PreviewType" = "Skybox"} Cull Off Off ZWrite Off Blend SrcAlpha OneMinusSrcAlpha շաբլոն {Ref 1 Comp [_Stencil]} Pass {CGPROGRAM #pragma vertex vert #pragma fragment frag frag #pragma target Unit 2.0 #incglud.ccinc "samplerCUBE _Tex; half4 _Tex_HDR; կես4 _Նորություն; կես _ Բացահայտում; բոց _Շրջում; float3 RotateAroundYInDegrees (float3 գագաթ, բոց աստիճան) {float alpha = աստիճաններ * UNITY_PI / 180.0; float sina, cosa; sincos (ալֆա, սինա, կոսա); float2x2 մ = float2x2 (cosa, -sina, sina, cosa); վերադարձ float3 (mul (m, vertex.xz), vertex.y).xzy; } struct appdata_t {float4 գագաթ ՝ POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID}; struct v2f {float4 գագաթ ՝ SV_POSITION; float3 texcoord: TEXCOORD0; UNITY_VERTEX_OUTPUT_STEREO}; v2f vert (appdata_t v) {v2f o; UNITY_SETUP_INSTANCE_ID (v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO (ժ); float3 պտտվեց = RotateAroundYInDegrees (v.vertex, _Rotation); o.vertex = UnityObjectToClipPos (պտտված); o.texcoord = v.vertex.xyz; վերադարձ o; } fixed4 frag (v2f i): SV_Target {half4 tex = texCUBE (_Tex, i.texcoord); half3 c = DecodeHDR (tex, _Tex_HDR); c = c * _Tint.rgb * unit_ColorSpaceDouble.rgb; c *= _ Բացահայտում; վերադարձ կես 4 (գ,.5); } ENDCG}} Հետադարձը անջատված է}

Այժմ ստեղծեք Skybox- ի նոր նյութ, անվանեք այն «PortalSkybox» և պորտալի ընտրացանկից ընտրեք այս portalSkybox ստվերը: Գնացեք դեպի պատուհան, լուսավորություն, վերևում և ընտրեք մեր ստեղծած երկնաքարը: Գնացեք հիմնական տեսախցիկ և հստակ դրոշակներ դրեք skybox- ի վրա: Մինչ մենք այստեղ ենք, թույլ տվեք մի քանի բաղադրիչ ավելացնել մեր տեսախցիկին, որպեսզի կարողանանք բախումներ հայտնաբերել: Ավելացրեք կոշտ մարմնի բաղադրիչ տեսախցիկին և չօգտագործեք գրավիտացիայի օգտագործումը: Ավելացրեք տուփի բախիչ և ստուգեք, թե արդյոք ձգան է: Տուփը դարձրեք բախիչների չափսը.5 x 1 x 4. Տեսախցիկի վրա դրեք կտրող հարթությունը:

Քայլ 8: Պորտալի տրամաբանություն:

Պորտալի տրամաբանություն
Պորտալի տրամաբանություն

Վերջին բանը, որ մենք պետք է անենք, այն տրամաբանությունն է, որը վերահսկում է մեր պորտալը: Ստեղծեք նոր C# սցենար և այն անվանեք PortalController:

օգտագործելով System. Collections;

օգտագործելով System. Collections. Generic; օգտագործելով UnityEngine; namespace UnityEngine. XR.iOS {public class PortalController: MonoBehaviour {public Material նյութեր; հանրային MeshRenderer meshRenderer; հանրային UnityARVideo UnityARVideo; private bool isInside = կեղծ; private bool isOutside = true; // Օգտագործեք սա սկզբնավորման համար void Start () {OutsidePortal (); } void OnTriggerStay (Collider col) {Vector3 playerPos = Camera.main.transform.position + Camera.main.transform.forward * (Camera.main.nearClipPlane * 4); if (transform. InverseTransformPoint (playerPos).z <= 0) {if (isOutside) {isOutside = false; isInside = ճշմարիտ; InsidePortal (); }} այլ {if (isInside) {isInside = false; isOutside = ճշմարիտ; OutsidePortal (); }}} void OutsidePortal () {StartCoroutine (DelayChangeMat (3)); } void InsidePortal () {StartCoroutine (DelayChangeMat (6)); } IEnumerator DelayChangeMat (int stencilNum) {UnityARVideo.shouldRender = false; եկամտաբերության վերադարձ նոր WaitForEndOfFrame (); meshRenderer.enabled = կեղծ; foreach (Material mat in materials) {mat. SetInt ("_Stencil", stencilNum); } եկամտաբերության վերադարձ նոր WaitForEndOfFrame (); meshRenderer.enabled = ճշմարիտ; UnityARVideo.shouldRender = ճշմարիտ; }}}

Քաշեք այս նոր սցենարը ձեր պորտալի պատուհանի վրա: Սա մեզ կփոխանցի պորտալից ներս և դուրս, երբ մեր տեսախցիկի բախիչը բախվում է պորտալի պատուհանին: Այժմ այն գործառույթում, որը փոխում է բոլոր նյութերը, մենք ARkit plugin- ին ասում ենք, որ չպատկերացնի շրջանակը, ուստի գնացեք հիմնական տեսախցիկ և բացեք UnityARVideo սցենարը: Ստեղծեք public bool shouldRender վերևում և հավասարեցրեք այն ճշմարիտին: Down (OnPreRender) () գործառույթում ամեն ինչ փաթեթավորեք if հայտարարության մեջ, որտեղ ներսում ամեն ինչ կաշխատի միայն այն դեպքում, եթե shouldRender- ը ճշմարիտ է: Ամբողջ սցենարը պետք է ունենա այս տեսքը.

օգտագործելով համակարգ;

օգտագործելով System. Runtime. InteropServices; օգտագործելով UnityEngine; օգտագործելով UnityEngine. Rendering; namespace UnityEngine. XR.iOS {հանրային դաս UnityARVideo: MonoBehaviour {հանրային նյութ m_ClearMaterial; [HideInInspector] public bool shouldRender = true; մասնավոր CommandBuffer m_VideoCommandBuffer; մասնավոր Texture2D _videoTextureY; մասնավոր Texture2D _videoTextureCbCr; մասնավոր Matrix4x4 _displayTransform; մասնավոր խայտառակություն bCommandBufferInitialized; public void Սկիզբ () {UnityARSessionNativeInterface. ARFrameUpdatedEvent += UpdateFrame; bCommandBufferInitialized = կեղծ; } void UpdateFrame (UnityARCamera տեսախցիկ) {_displayTransform = նոր Matrix4x4 (); _displayTransform. SetColumn (0, cam.displayTransform.column0); _displayTransform. SetColumn (1, cam.displayTransform.column1); _displayTransform. SetColumn (2, cam.displayTransform.column2); _displayTransform. SetColumn (3, cam.displayTransform.column3); } void InitializeCommandBuffer () {m_VideoCommandBuffer = նոր CommandBuffer (); m_VideoCommandBuffer. Blit (null, BuiltinRenderTextureType. CurrentActive, m_ClearMaterial); GetComponent (). AddCommandBuffer (CameraEvent. BeforeForwardOpaque, m_VideoCommandBuffer); bCommandBufferInitialized = true; } void OnDestroy () {GetComponent (). RemoveCommandBuffer (CameraEvent. BeforeForwardOpaque, m_VideoCommandBuffer); UnityARSessionNativeInterface. ARFrameUpdatedEvent -= UpdateFrame; bCommandBufferInitialized = կեղծ; } #if! UNITY_EDITOR public void OnPreRender () {if (shouldRender) {ARTextureHandles handles = UnityARSessionNativeInterface. GetARSessionNativeInterface (). GetARVideoTextureHandles (); if (handles.textureY == System. IntPtr. Zero || handles.textureCbCr == System. IntPtr. Zero) {վերադարձ; } if (! bCommandBufferInitialized) {InitializeCommandBuffer (); } Բանաձեւը currentResolution = 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 ("_ հյուսվածք Y", _videoTextureY); } // Texture CbCr if (_videoTextureCbCr == null) {_videoTextureCbCr = Texture2D. CreateExternalTexture (currentResolution.width, currentResolution.height, TextureFormat. RG16, false, false, (System. IntPtrr) ձեռքեր _videoTextureCbCr.filterMode = FilterMode. Bilinear; _videoTextureCbCr.wrapMode = TextureWrapMode. Repeat; m_ClearMaterial. SetTexture ("_ TextCbCr", _videoTextureCbCr); } _videoTextureY. UpdateExternalTexture (handles.textureY); _videoTextureCbCr. UpdateExternalTexture (բռնակներ. textureCbCr); m_ClearMaterial. SetMatrix ("_ DisplayTransform", _displayTransform); }} #այլ հանրային անվավեր SetYTexure (Texture2D YTex) {_videoTextureY = YTex; } public void SetUVTexure (Texture2D UVTex) {_videoTextureCbCr = UVTex; } public void OnPreRender () {if (! bCommandBufferInitialized) {InitializeCommandBuffer (); } m_ClearMaterial. SetTexture ("_ հյուսվածք Y", _videoTextureY); m_ClearMaterial. SetTexture ("_ TextCbCr", _videoTextureCbCr); m_ClearMaterial. SetMatrix ("_ DisplayTransform", _displayTransform); } #endif}}

Քայլ 9: Գրեթե կատարված է:

Գրեթե արված է!
Գրեթե արված է!

Ի վերջո, երբ մենք կտտացնում ենք էկրանին և տեղադրում պորտալը, ցանկանում ենք, որ այն միշտ մեր դեմքը լինի: Դա անելու համար անցեք պորտալի «UnityARHitTestExample» սցենարը: Ներսում ամեն ինչ փոխարինեք հետևյալով.

օգտագործելով համակարգ;

օգտագործելով System. Collections. Generic; namespace UnityEngine. XR.iOS {public class UnityARHitTestExample: MonoBehaviour {public Transform m_HitTransform; public float maxRayDistance = 30.0f; հրապարակային LayerMask collisionLayer = 1 <0) {foreach (var hitResult in hitResults) {Debug. Log («Ստացված է»); m_HitTransform.position = UnityARMatrixOps. GetPosition (hitResult.worldTransform); m_HitTransform.rotation = UnityARMatrixOps. GetRotation (hitResult.worldTransform); 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)); Վեկտոր 3 currAngle = transform.eulerAngles; transform. LookAt (Camera.main.transform); transform.eulerAngles = նոր Վեկտոր 3 (currAngle.x, transform.eulerAngles.y, currAngle.z); վերադարձնել ճշմարիտ; }} վերադարձնել կեղծ; } // Թարմացումը կոչվում է մեկ անգամ մեկ շրջանակի համար անվավեր Update () {#if UNITY_EDITOR // մենք այս սցենարը կօգտագործենք միայն խմբագրի կողմից, չնայած որ ոչինչ չի խանգարի այն աշխատել սարքում, եթե (Input. GetMouseButtonDown (0)) {Rayառագայթ = Camera.main. ScreenPointToRay (Input.mousePosition); RaycastHit հիթ; // մենք կփորձենք հարվածել ինքնաթիռի բախման խաղային օբյեկտներից մեկին, որոնք ստեղծվել են plugin- ի միջոցով // արդյունավետորեն նման HitTest կանչելուն ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent if (Physics. Raycast (ray, out hit, maxRayDistance, collisionLayer)) {// մենք դիրք ենք ստանալու կոնտակտային կետից 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); եթե (touch.phase == TouchPhase. Began || touch.phase == TouchPhase. Moved) {var screenPosition = Camera.main. ScreenToViewportPoint (touch.position); ARPoint կետ = նոր ARPoint {x = screenPosition.x, y = screenPosition.y}; // ըստ առաջնահերթության reults տեսակի ARHitTestResultType resultTypes = {ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent, // եթե դուք ուզում եք օգտագործել անսահման ինքնաթիռները օգտագործել այս խմբին: //ARHitTestResultType. ARHitTestResultTypeExistingPlane, ARHitTestResultType. ARHitTestResultTypeHorizontalPlane, ARHitTestResultType. ARHitTestResultTypeFeaturePoint}; foreach (ARHitTestResultType resultType in resultTypes) {if (HitTestWithResultType (point, resultType)) {return; }}}} #endif}}}

Քայլ 10: Putրագիրը տեղադրեք ձեր հեռախոսի վրա:

Տեղադրեք ծրագիրը ձեր հեռախոսի վրա
Տեղադրեք ծրագիրը ձեր հեռախոսի վրա

Վերջապես մենք ավարտեցինք: Գնացեք ֆայլ, կառուցեք կարգավորումները և կտտացրեք կառուցել: Բացեք Xcode- ը և ընտրեք թղթապանակը, որը ստեղծվել է կառուցվածքից: Ընտրեք ձեր զարգացման թիմը և տեղադրեք ծրագիրը ձեր հեռախոսի վրա: Գուցե ցանկանաք փոխել մասնիկների և երկնաքարի գույները `ձեր կարիքներին համապատասխան: Տեղեկացրեք ինձ մեկնաբանություններում, եթե ունեք որևէ հարց և շնորհակալություն նայելու համար:

Խորհուրդ ենք տալիս: