미디어 콘텐츠 스터디

10. 다중 이미지 추적하기(Multiple Image Tracking) 본문

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

10. 다중 이미지 추적하기(Multiple Image Tracking)

danmujicat 2023. 10. 12. 13:08

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 | 3D Object | Cube메뉴를 선택하고 이름을 Cube로 설정합니다. Transform은 초기화합니다.

 Hierarchy 창에서  Cube 를 선택하고 Position(0.06, 0, -0.06), Scale(0.15, 0.15,0.15) 변경합니다.

 Create | Material 메뉴를 선택하여 재질을 만들고, 이를  Cube  오브젝트로 드래그하여 설정합니다.

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

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

⑥ 1번부터 5번을 반복하여 Sphere 프리팹을 만듭니다.

1번부터 5번을 반복하여 Capsule 프리팹을 만듭니다.

 

 

3.  다중 이미지 인식하기 

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

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

public class MultiImageTracking : MonoBehaviour
{
    [SerializeField]
    private GameObject[] placeablePrefabs;

    private Dictionary<string, GameObject> spawnPrefab = new Dictionary<string, GameObject>();
    private ARTrackedImageManager trackedImageManager;

    private void Awake()
    {
        trackedImageManager = FindObjectOfType<ARTrackedImageManager>();

        foreach (GameObject prefab in placeablePrefabs)
        {
            GameObject newPreFab = Instantiate(prefab, Vector3.zero, Quaternion.identity);
            newPreFab.name = prefab.name;
            spawnPrefab.Add(prefab.name, newPreFab);
        }
    }

    private void OnEnable()
    {
        trackedImageManager.trackedImagesChanged += ImageChanged;
    }

    private void OnDisable()
    {
        trackedImageManager.trackedImagesChanged -= ImageChanged;
    }

    private void ImageChanged(ARTrackedImagesChangedEventArgs eventArgs)
    {
        foreach (ARTrackedImage trackedImage in eventArgs.added)
        {
            UpdateImage(trackedImage);
        }

        foreach (ARTrackedImage trackedImage in eventArgs.updated)
        {
            UpdateImage(trackedImage);
        }

        foreach (ARTrackedImage trackedImage in eventArgs.removed)
        {
            spawnPrefab[trackedImage.name].SetActive(false);
        }
    }

    private void UpdateImage(ARTrackedImage trackedImage)
    {
        if (trackedImage.trackingState == TrackingState.Tracking)
        {
            string name = trackedImage.referenceImage.name;
            Vector3 position = trackedImage.transform.position;

            GameObject prefab = spawnPrefab[name];
            prefab.transform.position = position;

            prefab.SetActive(true);
        }
        else
        {
            string name = trackedImage.referenceImage.name;
            GameObject prefab = spawnPrefab[name];
            prefab.SetActive(false);
        }
    }
}

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

인스펙터 창의 AR Tacked Image Manager 컴포넌트의 속성 값을 다음과 같이 설정합니다.

 

실행하기

Comments