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

콘텐츠 개발 기법 - URP 환경에서 Bloom 및 Volume 포함한 화면 캡처
콘텐츠 개발 기법 - URP 환경에서 Bloom 및 Volume 포함한 화면 캡처

화면 캡처 :: Screen Capture

일반적으로 URP환경에서 Bloom 등의 Volume 이펙트들이 함께 캡처되지 않는 현상이 일어납니다.
두가지 원인이 있는데 첫번째는 저장할 Texture 및 Texture2D의 크기가 작아 모든 텍스쳐를 저장할 수 없는 경우와
두번째는 Linear color space의 픽셀을 텍스쳐에 저장 할 수 없는 경우가 있습니다.
이번 포스팅에서는 URP 환경에서 해당 이펙트들을 함께 캡쳐하는 방법을 알아봅니다.

콘텐츠 개발 기법 - UI 안나오게 화면 캡처(Screen Capture without UI)
콘텐츠 개발 기법 - UI 안나오게 화면 캡처(Screen Capture without UI)

화면 캡처 :: Screen Capture

UI 없이 화면을 캡쳐하는 방법을 알아봅니다.
해당 방법을 통해 사진 앱에서 사진을 찍거나 게임 내에서 UI를 제거한 스크린샷을 구현할 수 있습니다.

유니티3D 에디터에서

스크립트 작성

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

LightshipAR SDK

이번 강좌에서는 Visual Positioning System (VPS) 기능을 활용하여 콘텐츠를 개발해 봅니다.
VPS는 GPS정보와 타겟 매핑 정보를 정합하여 해당 타겟을 인식하는 기능입니다.
따라서 객체나 환경의 변화 및 이동이 잦지 않은 타겟이 스캔 대상이 됩니다.
주로 동상, 건물 입구, 가로등 등 위치의 변경이 없는 타겟들이 좋은 타겟입니다.

해당 타겟들을 인식시키고 주변에 가상의 오브젝트들을 배치하고 해당 위치를 저장하는 방법을 알아봅니다.

공간 매핑

Niantic Wayfarer

공간을 인식시키기 위해서 먼저 공간을 매핑해야 합니다.
이 과정은 IOS 어플리케이션으로 진행을 할 수 있는데 아래 링크에서

  1. Testflight
  2. Wayfarer

어플리케이션을 다운로드 및 설치합니다.

링크 : https://testflight.apple.com/join/VXu1F2jf