ARFoundation - Multiple Image Tracking

Published: Apr 15, 2022 by BeatChoi

ARFoundation을 활용한 다중 이미지 트래킹 콘텐츠 개발하기

이전 실습에 이어서 여러장의미지에 각기 다르 오브젝트를 증강할 수 있는 콘텐츠르 개발해 봅니다.

유니티3D 에디터에서

아래 실습을 진행합니다.
1. 단일 이미지 트래킹 구현하기 2022 - 04 - 15

동일 프로젝트에서 스크립트를 생성합니다. 아래와 같이 작성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

public class MultipleImageTracking : MonoBehaviour
{
    public GameObject[] Objs;
    private Dictionary<string, GameObject> spawnedObjs = new Dictionary<string, GameObject>();
    private ARTrackedImageManager ARTrackedImageManager;

    private void Awake()
    {
        ARTrackedImageManager = GetComponent<ARTrackedImageManager>();
        foreach(GameObject prefab in Objs)
        {
            GameObject clone = Instantiate(prefab);
            spawnedObjs.Add(prefab.name, clone);
            clone.SetActive(false);
        }
    }

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

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

    void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
    {
        foreach (var trackedImage in eventArgs.added)
        {
            UpdateImage(trackedImage);
        }

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

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

    private void UpdateImage(ARTrackedImage trackedImage)
    {
        GameObject trackedObject = spawnedObjs[trackedImage.referenceImage.name];

        if(trackedImage.trackingState == TrackingState.Tracking)
        {
            trackedObject.transform.position = trackedImage.transform.position;
            trackedObject.transform.rotation = trackedImage.transform.rotation;
            trackedObject.SetActive(true);
        }
        else
        {
            trackedObject.SetActive(false);
        }
    }
}

5, 6: ARFoundation 네임스페이스 추가
9 : 인식시 생성되는 오브젝트를 저장할 배열 선언
10 : String으로 인덱싱을 하는 GameObject형의 딕셔너리 선언
11 : ARTrackedManager 관련 함수등을 활용하기 위한 선언
딕셔너리:: Dictionary - 21-08-02참조
16 : Objs 배열에 저장한 프리펩을 딕셔너리 형태의 데이터로 변환, foreach 반복문으로 활용
26, 31 : OnEnable 및 OnDisable 이 호출될 때 이벤트의 추가 및 제거

34 - 50 : 이미지가 Added(첫인식), Updated(변경), removed(제거) 되었을 때 실행되는 이벤트 함수 OnTrackedImagesChanged
Added는 이미지가 처음 인식되었을 때 한번 호출됨
Updated는 인식된 이미직 변경될 때 할당된 오브젝트를 생성하거나 제거함, TrackingState를 체크하는 단계
removed시에는 생성되어있는 오브젝트 제거

52 - 66 : 각 Added(첫인식), Updated(변경) 상태에 실행되는 함수 UpdateImage선언 및 구현
인식된 이미지의 이름과 동일한 인덱스를 가진 spawnObjs딕셔너리 자료구조 요소에 접근하여 TrackingStateTracking일 때 위치와 회전값을 조정
그 외 경우 (Limited, None) 오브젝트를 SetActive(false)


위 스크립트를 AR Session Origin 항목에 인스턴스화 시킵니다.

2장 이상의 여러 이미지를 인식시켜야 하기 때문에 인식할 타겟 이미지를 선택합니다.
Project창으로 옮겨서 이미지 파일을 프로젝트에 추가합니다.

Project창의 ReferenceImageLibrary파일을 선택하고 우측 인스펙터 창에서 Add Image버튼을 눌러 이미지 항목을 추가합니다.
첫 이미지와 마찬가지로 사진 파일을 Texture 2D항목에 끌어다 놓고 Specify Size항목의 Physical Size를 1로 변경합니다.
총 이미지가 두개가 됩니다.

두번째 이미지가 인식되 때 생성될 3D 오브젝트 프리펩(Sphere)을 생성합니다.

다중 이미지 인식구현에서 중요한 부분은 인식될 이미지의 이름과 생성될 오브젝트 프리펩의 이름이 동일해야 한다는 것입니다.
아래와 같이 이미지 이름과 프리펩 이름으 바꿔줍니다. image01 이미지가 인식되면 image01 프리펩 오브젝트가 생성됩니다.

AR Session Origin오브젝트를 선택하여 위에서 인스턴스화 시킨 스크립트 컴포넌트를 확인합니다.
해당 스크립트의 Objs항목을 열어 리스트를 2개 추가합니다. 각 항목에 아래와 같이 image01, image02 프리펩으 연결합니다.

Latest Posts

LightshipAR SDK 활용하기 - Maps SDK의 활용
LightshipAR SDK 활용하기 - Maps SDK의 활용

ARDK Maps SDK

Lightship의 geofencing 기능을 구현할 수 있는 Maps SDK 활용법을 알아봅니다.

콘텐츠 개발

프로젝트 세팅

본 포스팅은 ARDK 3.9 버전, Maps SDK 0.4 버전을 기준으로 작성합니다. 이전 포스팅을 참조하여 SDK를 임포트 합니다.

Top Down Map

  1. 네이버 지도같은 일반적인 탑-다운 맵을 구현해 봅니다.

Unity3D에서의 UI - Rect Transform
Unity3D에서의 UI - Rect Transform

Unity UI RectTransform :: 개요

UI 객체들의 위치, 크기, 기준점 등등을 담당하는 Rect Transform에 대하여 알아봅니다.

Unity3D에서의 UI - UI의 구성
Unity3D에서의 UI - UI의 구성

Unity UI :: 개요

Unity UI는 게임 및 애플리케이션용 사용자 인터페이스를 개발하는 데 쓰이는 간단한 UI 툴킷입니다. Unity UI는 게임 오브젝트 기반 UI 시스템으로, 컴포넌트와 게임 뷰를 사용하여 사용자 인터페이스를 배열하고 위치와 스타일을 지정합니다. Unity UI는 Unity 에디터 내 사용자 인터페이스에 대해 사용할 수 없습니다.https://docs.unity3d.com/kr/2019.1/Manual/UIToolkits.html