미디어 콘텐츠 스터디

05. 이미지 추적하기(Image Tracking) 본문

증강현실(Augmented Reality)/ARCore 사용하기

05. 이미지 추적하기(Image Tracking)

danmujicat 2023. 9. 12. 12:13

AR 개발을 위한 프로젝트를 준비하기 위해 Window | Package Manangement 메뉴를 선택하여  Package Manangement 창을 열고 AR 장치 플러그인을 설치합니다.

1장의  ARCore 개발을 위한 환경 구축하기 참고하세요

더보기
  •  AR 장치용 XR plugins 설치하기
  • ARCore XR Plugin 설치하기
  • AR Foundation 패키지 설치하기
  • Input System 설치하기
  • Androd 플랫폼의 ARcore 설정하기
  • Player 설정하기

1. 기본 AR 장면 만들기

① File | Save As 메뉴를 선택하여  Assets/Scenes/ 폴더에 이름을 BasicARScene으로  저장합니다.

② Hierarchy 창에서 Main Camera를 삭제합니다.

③ GameObject |  XR | AR Session 메뉴를 선택하여 Hierarchy 창에 AR Session을 추가합니다.

④ GameObject |  XR | XR Origin  메뉴를 선택하여 Hierarchy 창에 XR Origin 을 추가합니다.

 

2.  오브젝트 출력하기 :  AR Tracked Image Manager 설정하기

Hierarchy 창에 XR Origin 을 선택하고 Inspector창에서 Add Component 버튼을 클릭하여 AR Tracked Image Manager 컴포넌트를 추가합니다.

 

2.1 인식할 이미지 만들기

① Project 창에서 Asset 폴더 하위에 Images 폴더를 만들고 여기서 오른쪽 마우스 버튼을 선택하여 Create->XR->Reference Image Libray 메뉴를 선택합니다. 

② 생성된 ReferenceImageLibray를 선택한 후,  Inspector 창에 Add Image 버튼을 클릭하여 인식할 이미지를 등록합니다.

 

 Hierarchy 창에 XR Origin 을 선택하고  Inspector창에서 AR Tracked Image Manager의 Serialized Library 속성값에 ReferenceImageLibray를 설정합니다.

 

2.2 출력할 오브젝트 만들기

 Hierarchy 창에서 GameObject | Create Empty메뉴를 선택하여 빈 오브젝트를 생성하고 이름을 ARSpheres로 설정합니다. Transform은 초기화합니다.

 Hierarchy 창에서  AR Spheres를 선택하고 하위에 3D Object|Sphere를 3개 추가하여 이름을 Left, Right, Top으로 변경합니다.

   -  Left의Transform : Position(0.06, 0, -0.06), Scale(0.15, 0.15,0.15)

  -  Right의Transform : Position(-0.06, 0, 0.06),  Scale(0.15, 0.15,0.15)

  -  Top의Transform : Position(0, 0.137,0),  Scale(0.15, 0.15,0.15)

 Create | Material 메뉴를 선택하여 재질을 만들고, 이름을 Red, Yellow, Green으로 지정하고 이를 ARSpheres 하위의 Sphere 오브젝트로 드래그하여 설정합니다.

④  Hierarchy 창에서 Project 창의 Prefabs 폴더로  ARSpheres 오브젝트를 드래그하여 프리팹으로 만듭니다.

  Hierarchy 창에서  ARSpheres 오브젝틀르 삭제합니다.

 Hierarchy 창에 XR Origin 을 선택하고  Inspector창에서 AR Tracked Image Manager의 Tracked Image Prefab  속성값에 ARSpheres를 설정합니다.

 

2.3 실행하기

AR Tracked Image Manager의  Max Number Of Moving Images에 0이상의 값을 설정합니다.

 

3.  정보 출력하기 :  Tracked Image Info Manager 설정하기

Hierarchy 창에 XR Origin 을 선택하고 Inspector창에서 Add Component 버튼을 클릭하여 TrackedImageInfoManager.cs 스크립트를 추가합니다.

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.XR.ARSubsystems;
using UnityEngine.XR.ARFoundation;

 
    public class TrackedImageInfoManager : MonoBehaviour
    {
        
        public Camera m_WorldSpaceCanvasCamera;        
        public Texture2D m_DefaultTexture;

   
        ARTrackedImageManager m_TrackedImageManager;

        void Awake()
        {
            m_TrackedImageManager = GetComponent<ARTrackedImageManager>();
        }

        void OnEnable()
        {
            m_TrackedImageManager.trackedImagesChanged += OnTrackedImagesChanged;
        }

        void OnDisable()
        {
            m_TrackedImageManager.trackedImagesChanged -= OnTrackedImagesChanged;
        }

        void UpdateInfo(ARTrackedImage trackedImage)
        {
           
            var canvas = trackedImage.GetComponentInChildren<Canvas>();
            canvas.worldCamera = m_WorldSpaceCanvasCamera;

           
            var text = canvas.GetComponentInChildren<Text>();
            text.text = string.Format(
                "{0}\ntrackingState: {1}\nGUID: {2}\nReference size: {3} cm\nDetected size: {4} cm",
                trackedImage.referenceImage.name,
                trackedImage.trackingState,
                trackedImage.referenceImage.guid,
                trackedImage.referenceImage.size * 100f,
                trackedImage.size * 100f);

            var planeParentGo = trackedImage.transform.GetChild(0).gameObject;
            var planeGo = planeParentGo.transform.GetChild(0).gameObject;

          
            if (trackedImage.trackingState != TrackingState.None)
            {
                planeGo.SetActive(true);
              
                trackedImage.transform.localScale = new Vector3(trackedImage.size.x, 1f, trackedImage.size.y);
              
                var material = planeGo.GetComponentInChildren<MeshRenderer>().material;

            if (trackedImage.referenceImage.texture == null)
                material.mainTexture = m_DefaultTexture;
            else material.mainTexture = trackedImage.referenceImage.texture;
        }
        else
            {
                planeGo.SetActive(false);
            }
        }

        void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
        {
            foreach (var trackedImage in eventArgs.added)
            {               
                trackedImage.transform.localScale = new Vector3(0.01f, 1f, 0.01f);
                UpdateInfo(trackedImage);
            }

            foreach (var trackedImage in eventArgs.updated)
                UpdateInfo(trackedImage);
        }
    }

 

인스펙터 창의 TrackedImageInfoManager.cs 스크립트의 속성 값을 다음과 같이 설정합니다.

 

3.1 출력할 오브젝트  만들기

 Hierarchy 창에서 GameObject | Create Empty메뉴를 선택하여 빈 오브젝트를 생성하고 이름을 ImageInfoPrefab로 설정하고,  하위에 GameObject | Create Empty메뉴를 선택하여 빈 오브젝트를 생성하여 이름을 PlaneParent로 설정합니다. Transform은 초기화합니다.

 Hierarchy 창에서  PlaneParent를 선택하고 하위에 3D Object|Plane 메뉴를 선택하여 Plane를 추가합니다. Transform은 초기화합니다.

   - Transform : Rotation(0, 180, 0), Scale(0.1, 0.1,0.1) 

   - Materials 추가

Hierarchy 창에서 ImageInfoPrefab 하위에 GameObject | Canvas 메뉴를 선택하여 Canvas를 추가하고, 인스펙터 창에  Cavas의 Render Mode 속성값을 World Space로 변경하고 다음과 같이 설정합니다.

④  Hierarchy 창에서 Canvas 하위에 GameObject |  UI |Text 메뉴를 선택하여 Text를 추가합니다.

 - Rect Transform의 midle-center로 설정하고 다음과 같이 설정합니다.

- Font Size를 1이하로 수정합니다.

⑤  Hierarchy 창에서 Project 창의 Prefabs 폴더로  ImageInfoPrefab 오브젝트를 드래그하여 프리팹으로 만듭니다.

⑥  Hierarchy 창에서  ImageInfoPrefab 오브젝틀르 삭제합니다.

 Hierarchy 창에 XR Origin 을 선택하고  Inspector창에서 AR Tracked Image Manager의 Tracked Image Prefab  속성값에 ImageInfoPrefab를 설정합니다.

 

3.2 실행하기

Comments