Мазмұны:
- 1 -қадам: Жаңа бірлік жобасын бастаңыз
- 2 -қадам: Сахнаны орнатыңыз
- 3 -қадам: Бөлшектер жасайық
- 4 -қадам: Бөлшектерді баяулату
- 5 -қадам: Портал құру
- 6 -қадам: Бөлшектерді шейдерлер
- 7 -қадам: Skybox жасаңыз
- 8 -қадам: Портал логикасы
- 9 -қадам: Дайын болды
- 10 -қадам: Қолданбаны телефонға қойыңыз
Бейне: AR порталы бөтен нәрселерден төмен қарай: 10 қадам (суреттермен)
2024 Автор: John Day | [email protected]. Соңғы өзгертілген: 2024-01-30 10:27
Бұл нұсқаулық iPhone үшін бейтаныс нәрселердің төңкерілуіне әкелетін порталмен толықтырылған шындыққа арналған мобильді қосымшаны құру арқылы өтеді. Сіз порталдың ішіне кіріп, серуендеп, қайта шыға аласыз. Портал ішіндегі барлық нәрсені портал арқылы көруге болады, сіз ішке кірмейінше. Ішке кіргенде, бәрі шынайы әлемге қайта оралғанша барлық жерде болады. Біз Unity 3D бейне ойындарының қозғалтқышын Apple ARKit плагинімен қолданамыз. Біз қолданатын барлық бағдарламалық жасақтаманы тегін жүктеп алуға болады. Мұны істеу үшін сізге сарапшы болудың қажеті жоқ, біз әр қадамнан өтеміз!
1 -қадам: Жаңа бірлік жобасын бастаңыз
Біріншіден, Unity3D жүктеп алыңыз және IOS платформасына арналған құрастыру файлдарын орнатыңыз. Сіз сондай -ақ Xcode жүктеп алып, ақысыз apple developer есептік жазбасына тіркелуіңіз керек. Сіздің iPhone -да IOS 11 немесе одан жоғары нұсқасы болуы керек. Бүгінгі 2018 жылдың 5 ақпанында IOS 11.3 шығарылды, бірақ xCode 9.2 -де оған қолдау файлдары әлі жоқ. Егер сіз IOS -тың ең соңғы нұсқасын қолдансаңыз, Apple. Developer.com сайтынан Xcode -дің соңғы бета нұсқасын жүктеп алыңыз.
Барлық қажетті бағдарламалар болғаннан кейін, Unity бағдарламасын ашып, жаңа жобаны бастаңыз, оны қалағаныңызша шақырыңыз. Бізге Apple ARKit плагині қажет болады, осылайша біз телефон камерасын еденде орналасқан заттарды анықтай аламыз. Мұны енді Asset Store қойындысына өтіп, «ARKit» іздеу арқылы импорттайық. Егер сізде әлі жоқ болса, Unity тегін тіркелгісін жасау қажет болады, содан кейін плагинді алу үшін импорттау түймесін басыңыз.
ARKit қалтасындағы мысалдар қалтасына өтіп, «UnityARKitScene» табыңыз. Оны ашу үшін оны екі рет нұқыңыз. Біз бұл көріністі бастапқы нүкте ретінде пайдаланып, осы жерден құрылатын боламыз. Бұл көрініс әдепкі бойынша жерді анықтауға мүмкіндік береді және экранды түрткенде текше сол күйге қойылады.
Алдымен біздің құрастыру параметрлерін төртбұрышты етіп шығарайық, сондықтан оны кейінірек жасауды ұмытпаймыз. Файлды нұқыңыз, параметрлерді құрыңыз және сол көріністен барлық көріністерді алып тастаңыз. Ағымдағы көріністі қосу үшін ашық көріністерді қосу түймесін басыңыз. Мұнда орнату керек соңғы нәрсе - ойыншы параметрлерінде жиынтық идентификаторға өтіңіз және бұл жолдың форматы com. YourCompanyName. YourAppName, сондықтан менің жағдайда com. MatthewHallberg. PortalTest сияқты нәрсе жасаймын.
2 -қадам: Сахнаны орнатыңыз
Алдымен солға қарап, «GeneratePlanes» деп аталатын ойын нысанын табыңыз. Белгіленген кезде, дәл қазір оң жаққа қарап, оны өшіру үшін құсбелгіні қойыңыз. Осылайша, бізде ARKit жер үсті ұшағын анықтаған кезде ұнамсыз көк квадраттар жасалмайды. Содан кейін «RandomCube» ойын нысанын жойыңыз, өйткені біз оны сахнадан көргіміз келмейді.
Енді бізге алдымен порталдың есігін жасау керек. «HitCubeParent» еншілесі текшені жойыңыз. Тінтуірдің оң жақ түймешігімен нұқыңыз және бос ойын нысанын жасауды таңдаңыз. Оның атын «Портал» деп өзгертіңіз. Енді сол нысанды тінтуірдің оң жақ түймешігімен нұқыңыз және текшені жасаңыз, бұл оны порталдың еншілесі етеді. Оның атын «PostLeft» деп өзгертіңіз, бұл біздің порталдың сол жақ жазбасы болады. Оны x -1 -ге, y -28 -ге және z - бір болатындай етіп масштабтаңыз. Дұрыс пост үшін дәл осылай жасаңыз. Енді жоғарғы жазбаны жасаңыз және у мәнін 14 -ке дейін масштабтаңыз. Бұл жағына бұрыңыз және басқа тіректерді байланыстыратындай етіп жылжытыңыз. Порталдың бүкіл масштабын 1,3 x 1,4 x 1 етіп жасаңыз.
Google -ға кіріп, ағаш немесе қабықтың текстурасын теріңіз. Сол суреттердің бірін жүктеп алып, оны Unity ішіндегі активтер қалтасына апарыңыз. Енді бұл суретті порталдың барлық жазбаларына апарыңыз.
«Портал» нысанын тағы бір рет нұқыңыз және оң жақтағы компонентті қосу түймесін басыңыз. Оған «UnityARHitTestExample» сценарийін қосыңыз. Онда «Hit Transform» үшін бос слот бар, «HitCubeParent» нысанын осы ұяға сүйреңіз.
3 -қадам: Бөлшектер жасайық
Енді біз порталдың ішінде түтін мен өзгермелі бөлшектер әсерін жасау үшін Unity Particle жүйесін қолданамыз. Жоғарғы мәзір жолағындағы активтерге, стандартты активтерге және импорттық бөлшектер жүйесіне өтіңіз.
Порталда екі бос ойын нысанын жасаңыз және бірін «SmokeParticles», екіншісін «FloatingParticles» деп атаңыз.
Түтін бөлшектеріне бөлшектер жүйесінің компонентін қосыңыз.
Бұл компоненттің көптеген нұсқалары бар, бірақ бізге тек жұпты өзгерту қажет.
Бастапқы түсі шамамен 50% мөлдірлігі бар қара көкке өзгертіңіз. Шығару жылдамдығын 100 жасаңыз. Пішіннің ішінде радиусты жасаңыз.01. Төменгі жағындағы рендерлік бөлімде минималды өлшемді.8 -ге, ал максималды өлшемді 5 -ке өзгертіңіз. Материалдық компоненттен түтін материалын тізімнен таңдаңыз, бірақ біз оны кейін өзгертеміз.
Бөлшектер жүйесін өзгермелі бөлшектер ойын объектісіне дәл қазір қосыңыз және шығарылымды 500 -ге қойыңыз. Іске қосу мерзімін 2 -ге, радиусын 10 -ға, бөлшектердің минималды өлшемін.01 -ге, ал бөлшектердің максималды өлшемін.015 -ке орнатыңыз. Әзірге материалды әдепкі бөлшекке қойыңыз.
Соңында екі ойын объектісін де алып, оларды x бойынша 90 градусқа бұрып, оларды аспанға көтеріңіз, осылайша олар портал есігіне түседі.
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. Play (); кірістілікті қайтару жаңа WaitForSeconds (.1f); main.simulationSpeed =.05f; }}
Енді бұл сценарийді бөлшек жүйесінің ойын объектілерінің әрқайсысына сүйреңіз.
5 -қадам: Портал құру
Енді біз портал жасауымыз керек, сондықтан портал ойынының объектісін тінтуірдің оң жақ түймесімен нұқып, төртбұрыш құрамыз. Төртбұрышты масштабтаңыз, ол бүкіл порталды қамтиды, бұл біздің портал терезесі болады. Бізге қосу керек бірінші нәрсе - бұл портал шейдер, бұл тек басқа арнайы шейдермен объектілерді көрсетеді. Активтер қалтасын тінтуірдің оң жақ түймесімен басып, өшірілмеген жаңа шейдер жасаңыз. Ондағы барлық нәрсені алып тастап, осы кодқа қойыңыз:
Шейдер «Портал/portalWindow»
{SubShader {Columnask Zwrite 0 трафаретті өшіру {Ref 1 Pass ауыстыру} Pass {}}}
Иерархияда тінтуірдің оң жақ түймешігімен нұқыңыз және жаңа материал жасаңыз, оны PortalWindowMat деп атаңыз, осы материалдың ашылмалы тізімінде портал бөлімін тауып, портал терезесін таңдаңыз. Бұл материалды порталдың квадратына сүйреңіз.
6 -қадам: Бөлшектерді шейдерлер
Активтер қалтасын қайтадан тінтуірдің оң жақ түймесімен нұқыңыз және жаңа шейдер жасаңыз. Біз порталдың ішіне кіретін бөлшектерге арналған шейдерлер жасауымыз керек. Барлық кодты келесіге ауыстырыңыз:
Шейдер «Портал/Бөлшектер» {
Сипаттары {_TintColor («Реңк түсі», Түс) = (0,5, 0,5, 0,5, 0,5) _MainTex («Бөлшек құрылымы», 2D) = «ақ» {} _InvFade («Жұмсақ бөлшектер факторы», ауқымы (0,01, 3,0)) = 1.0 _Stencil («трафарет», int) = 6} Санат {Tags {«Queue» = «Transparent» «IgnoreProjector» = «True» «RenderType» = «Transparent» «PreviewType» = «Plane»} SrcAlpha OneMinusSrcAlpha араластырыңыз) ColorMask RGB жарықтандыруды өшірді ZWrite Off SubShader {Stencil {Ref 1 Comp [_Stencil]} Pass {CGPROGRAM #pragma vertex vert #pragma fragment fragment #pragma target 2.0 #pragma multi_compile_particles #pragma multi_compile_fog #Cincain «Unclude» Unclude « fixed4 _TintColor; құрылым appdata_t {float4 шыңы: POSITION; бекітілген 4 түс: COLOR; float2 texcoord: TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID}; v2f құрылымы {float4 шыңы: SV_POSITION; бекітілген 4 түс: COLOR; 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); 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); float _InvFade; fixed4 frag (v2f i): SV_Target {#ifdef SOFTPARTICLES_ON float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ (_CameraDepthTexture, UNITY_PROJ_COORD (i.projPos)))); floZ partZ = i.projPos.z; float fade = saturate (_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 деп аталатын екі жаңа материал жасаңыз.
Әркім үшін порталдарда, бөлшектерде ашылмалы мәзірден осы шейдер таңдаңыз. Түтін бөлшектері түтін құрылымын, ал бөлшектер үшін бөлшектер құрылымын таңдайды. Түтіннің түсін шамамен 50% мөлдірлікпен қою көк түске өзгертіңіз. Порталдағы әрбір бөлшектер жүйесінің рендеринг компонентіне өтіп, біз жасаған жаңа материалдарды таңдаңыз.
7 -қадам: Skybox жасаңыз
Енді шынымен төңкерілген түрді жасау үшін барлығын қою көк түске бояу керек. Ол үшін біз мөлдір аспан жәшігін қолданамыз, сондықтан жаңа шейдер жасаңыз және осы кодқа қойыңыз:
Шейдер «Портал/portalSkybox» {
Сипаттары {_Tint («Реңк түсі», Түс) = (.5,.5,.5,.5) [Гамма] _Экспозиция («Экспозиция», диапазон (0, 8)) = 1.0 _Ротация («Айналу», диапазон) (0, 360)) = 0 [NoScaleOffset] _Tex («Cubemap (HDR)», Cube) = «сұр» {} _Stencil («StencilNum», int) = 6} SubShader {Tags {«Queue» = «Background» «RenderType» = «Фондық» «PreviewType» = «Skybox»} ZWrite Off Blend SrcAlpha OneMinusSrcAlpha трафаретін өшіру {Ref 1 Comp [_Stencil]} Pass {CGPROGRAM #pragma vertex vert #pragma fragment fragment #pragma target UnCCG #.cginc «samplerCUBE _Tex; half4 _Tex_HDR; half4 _Tint; жартылай _ экспозиция; float _Rotation; float3 RotateAroundYInDegrees (float3 шыңы, өзгермелі градус) {float alpha = градус * UNITY_PI / 180.0; float sina, cosa; синос (альфа, сина, коса); float2x2 m = float2x2 (cosa, -sina, sina, cosa); қайтару float3 (муль (м, шыңы.xz), шыңы.y).xzy; } appdata_t құрылымы {float4 шыңы: POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID}; 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 (o); float3 бұрылды = RotateAroundYInDegrees (v.vertex, _Rotation); o.vertex = UnityObjectToClipPos (бұрылған); o.texcoord = v.vertex.xyz; қайтару o; } fixed4 фраг (v2f i): SV_Target {half4 tex = texCUBE (_Tex, i.texcoord); half3 c = DecodeHDR (tex, _Tex_HDR); c = c * _Tint.rgb * birlik_ColorSpaceDouble.rgb; c *= _Экспозиция; жартысын қайтару4 (с,.5); } ENDCG}} Қайтару өшірулі}
Енді жаңа Skybox материалын жасаңыз, оны «PortalSkybox» деп атаңыз және портал мәзірінен осы portalSkybox шейдерін таңдаңыз. Жоғарғы жағындағы Терезеге, Жарыққа өтіңіз және біз жасаған аспан қалтасын таңдаңыз. Негізгі камераға өтіп, аспан терезесіне жалаушаларды орнатыңыз. Біз осында болсақ, соқтығысуды анықтау үшін камераға кейбір компоненттерді қосуға рұқсат етіңіз. Камераға қатты дене компонентін қосыңыз және гравитацияны пайдаланудан құсбелгіні алып тастаңыз. Қорапшаның коллайдерін қосыңыз және триггерді тексеріңіз. Қорапшаның коллайдерлерінің өлшемін.5 x 1 x 4. Камерадағы кесу жазықтығын.01 етіп орнатыңыз.
8 -қадам: Портал логикасы
Бізге қажет соңғы нәрсе - біздің порталды басқаратын логиканы құру. Жаңа C# сценарийін жасаңыз және оны PortalController деп атаңыз.
System. Collections пайдалану;
System. Collections. Generic пайдалану; UnityEngine пайдалану; UnityEngine. XR.iOS аттар кеңістігі {PortalController жалпыға ортақ сынып: MonoBehaviour {қоғамдық материалдар материалдары; қоғамдық MeshRenderer meshRenderer; қоғамдық UnityARVideo UnityARVideo; private bool isInside = false; 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 = true; InsidePortal (); }} else {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 (Материалдағы материалдық төсеніш) {mat. SetInt («_Stencil», stencilNum); } кірістілік қайтару жаңа WaitForEndOfFrame (); meshRenderer.enabled = ақиқат; UnityARVideo.shouldRender = ақиқат; }}}
Бұл жаңа сценарийді портал терезесіне сүйреңіз. Бұл біздің камерадағы коллайдер портал терезесімен соқтығысқан кезде бізді порталға кіруге және шығаруға мүмкіндік береді. Енді барлық материалдарды өзгертетін функцияда біз ARkit плагиніне кадрды көрсетпеуді айтамыз, сондықтан негізгі камераға өтіп, UnityARVideo сценарийін ашыңыз. Жоғарғы жағында жалпыға ортақ bool жасаңыз және оны ақиқатқа теңестіріңіз. OnPreRender () функциясында төмендегінің барлығын if операторына ораңыз, онда ішіндегі бәрі тек shouldRender ақиқат болғанда ғана іске қосылады. Бүкіл сценарий келесідей болуы керек:
жүйені қолдану;
System. Runtime. InteropServices пайдалану; UnityEngine пайдалану; UnityEngine. Rendering пайдалану; UnityEngine. XR.iOS аттар кеңістігі {UnityARVideo қоғамдық классы: MonoBehaviour {public Material m_ClearMaterial; [HideInInspector] public bool shouldRender = true; жеке CommandBuffer m_VideoCommandBuffer; жеке Texture2D _videoTextureY; жеке Texture2D _videoTextureCbCr; жеке Matrix4x4 _displayTransform; жеке bool bCommandBufferInitialized; public void Start () {UnityARSessionNativeInterface. ARFrameUpdatedEvent += UpdateFrame; bCommandBufferInitialized = жалған; } void UpdateFrame (UnityARCamera cam) {_displayTransform = new 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 = new 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 («_ textureY», _videoTextureY); } // Текстура CbCr if (_videoTextureCbCr == null) {_videoTextureCbCr = Texture2D. CreateExternalTexture (currentResolution.width, currentResolution.height, TextureFormat. RG16, false, false, (System. IntPtr) өңдейді.textureCb) _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; } public void OnPreRender () {if (! bCommandBufferInitialized) {InitializeCommandBuffer (); } m_ClearMaterial. SetTexture («_ textureY», _videoTextureY); m_ClearMaterial. SetTexture («_ textureCbCr», _videoTextureCbCr); m_ClearMaterial. SetMatrix («_ DisplayTransform», _displayTransform); } #endif}}
9 -қадам: Дайын болды
Ақырында, біз экранды шертіп, порталды орналастырған кезде, біз әрқашан бізбен бетпе -бет келуін қалаймыз. Ол үшін порталдағы «UnityARHitTestExample» сценарийіне өтіңіз. Ішіндегі барлық нәрсені мынамен ауыстырыңыз:
жүйені қолдану;
System. Collections. Generic пайдалану; UnityEngine. XR.iOS аттар кеңістігі {UnityARHitTestExample қоғамдық класы: MonoBehaviour {public Transform m_HitTransform; public float maxRayDistance = 30.0f; public 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)); Vector3 CurrAngle = transform.eulerAngles; transform. LookAt (Camera.main.transform); transform.eulerAngles = жаңа Vector3 (CurrAngle.x, transform.eulerAngles.y, currAngle.z); шындықты қайтару; }} false қайтару; } // Жаңарту бір кадрға бір рет шақырылады void Update () {#if UNITY_EDITOR // біз бұл сценарийді тек редактор жағында қолданамыз, бірақ егер оның (Input. GetMouseButtonDown (0)) құрылғыда жұмыс істеуіне кедергі болатын ештеңе жоқ.) {Сәуле сәулесі = Camera.main. ScreenPointToRay (Input.mousePosition); RaycastHit хиті; // біз плагин құрған ұшақ коллайдерлік ойын объектілерінің біреуіне соққы беруге тырысамыз // ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent арқылы HitTest шақыруға ұқсас, егер (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); if (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 -қадам: Қолданбаны телефонға қойыңыз
Ақыры біттік. Файлға өтіңіз, параметрлерді орнатыңыз және Құруды басыңыз. Xcode ашыңыз және құрастырудан жасалған қалтаны таңдаңыз. Даму тобын таңдап, қосымшаны телефонға қойыңыз! Сіз өзіңіздің қажеттіліктеріңізге сәйкес бөлшектер мен аспан жәшіктерінің түстерін өзгерткіңіз келуі мүмкін. Егер сізде сұрақтар туындаса, түсініктемелерде маған хабарлаңыз және қарағаныңыз үшін рахмет!
Ұсынылған:
Уоллес аниматронды бөтен жаратылыс: 9 қадам (суреттермен)
Уоллес аниматронды бөтен жаратылыс: Қош келдіңіз! Бүгін мен сізге Уоллесті қалай құруға болатынын көрсетемін, аниматронды келімсектер. Жұмысты бастау үшін сізге қажет: x 1 Fur Real Friends ит (мысалы: https://www.ebay.com/p/1903566719)x 5) MG996R Servos x 1 Pololu Maestro 6-арналық сервистік бақылау
TELLO алға қарай камераны төмен қарай бағыттау: 10 қадам
TELLO Forward Camera Down нұсқау: Бұл нұсқаулық жаңадан бастаушыларға ұсынылмайды. Tello дронын ашпас бұрын және оны өзгертпес бұрын сізге техникалық сенімділік қажет. Соны айтып; Бұл техникалық сенімділікті алудың тамаша тәсілі;) Сондықтан сіз қалайсыз
Қолданбалы алфавиттік тақта бейтаныс нәрселерден алынған: 7 қадам (суреттермен)
Қолданбалы алфавит тақтасы бейтаныс нәрселерден шабыттанды: Мұның бәрі бірнеше апта бұрын тоғыз жасар жиенімді Рождествоға не алуға болатынын білуден басталды. Менің ағам ақыры маған оның «Бейтаныс нәрселердің» жанкүйері екенін айтты. Мен оған не алғым келетінін бірден білдім
Ардуино Юноның екі күзет мұнарасы порталы: 6 қадам (суреттермен)
Ардуино Юноның екі күзет мұнарасы порталы: Бұл нұсқаулық Оңтүстік Флорида Университетіндегі Маккурстың жобалық талаптарын орындау үшін жасалған (www.makecourse.com)
Кассета ойнатқышының моторынан жасалған артқа қарай айналатын сағаттар: 7 қадам (суреттермен)
Кассета ойнатқышының моторынан жасалған артқа қарай айналатын сағаттар: бұл мен қызымның күйеуіммен бірге жүретін бастауыш мектептегі үйге арнап жасаған тірек. Сағат арзан сақталатын дүкен сағаты мен ескі балалардың кассеталық ойнатқышынан жасалған. Ол сағат он үш пен минуттық айналуды көрсетеді