이전시간에 이어 AR 개발 기초, 이미지 트래킹 편이다.
AR 템플릿으로 프로젝트를 만들게 되면 다음의 3가지 오브젝트들이 존재한다. 여기서 기존 개발과 달라진 점은 AR Session Origin과 AR Session인데, 오늘은 이부분을 살펴보도록 하자.
AR Session
AR Session은 AR Session 스크립트를 가지고 있고, 이는 AR 환경의 Life Cycle을 관리하는 역할을 한다. 모든 증강현실 어플에서 꼭 필요한 컴포넌트이다.
AR Session Origin
AR Session Origin은 실제 세계의 좌표와 AR 세상의 좌표를 연결하는 역할을 한다. AR Session Origin에 붙어있는 여러 스크립트들은 AR 템플릿에서 기본으로 제공해주는 기능들인데, 이번 듀토리얼에서는 지우고 시작하도록 하자. AR Session Origin에서 AR Session Origin 스크립트를 제외한 스크립트들을 지워준다.
이미지 트래커
오늘 간단하게 해볼 것은 이미지 트래킹인데, 해당 기능을 사용하기 위해 AR Session Origin에 다음과 같이 AR Tracked Image Manager를 추가해주도록 하자. 이는 실제 세계의 이미지를 detect해서 virtual object가 해당 이미지를 track해주는 기능을 제공한다.
두가지가 필요한데, 먼저 Serialized library, 즉 트래킹할 이미지가 필요하다. Asset 창에서 create > XR > Image Library를 클릭하자. 그 후, 트래킹할 이미지를 넣어주어야 하는데, 나는 아이폰 이미지로 진행해보겠다. 아이폰 이미지를 다음과 같이 Reference Image Library에 넣어준다.
위와 같이 실측 사이즈를 m 단위로 넣어주면 트래킹에 도움이 된다.
간단한 스크립트 생성
이제 AR Session Origin에 스크립트를 생성해주어 가상 오브젝트 prefab이 생성되도록 하자. 코드는 다음과 같으며, 출처는 하단에 기재되어있고, 이를 한국어로 번역하여 설명해놓았다.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
//GameObject에 ARTrackedImageManager가 반드시 포함하도록하여 setup시 에러를 방지함
[RequireComponent(typeof(ARTrackedImageManager))]
public class ImageTracker : MonoBehaviour
{
// ARTrackedImageManager 선언
private ARTrackedImageManager _trackedImagesManager;
// 가상 오브젝트
public GameObject[] ArPrefabs;
// 오브젝트와 이름을 Dict 형태로 저장
private readonly Dictionary<string, GameObject> _instantiatedPrefabs = new Dictionary<string, GameObject>();
void Awake()
{
// AR Session Origin에 붙어있는 ARTrackedImageManager을 가지고옴
_trackedImagesManager = GetComponent<ARTrackedImageManager>();
}
void OnEnable()
{
//trackedImageChanged는 상태에 변화가 있는 ARTrackedImage의 정보를 가져온다. 프레임마다 한번 호출됨
// tracked image에 변화가 있을때 event handler를 달아주는 역할
_trackedImagesManager.trackedImagesChanged += OnTrackedImagesChanged;
}
void OnDisable()
{
// tracked image에 변화가 있을때 event handler를 삭제하는 역할
_trackedImagesManager.trackedImagesChanged -= OnTrackedImagesChanged;
}
// TrackedImage에 변화가 있을때 호출되며, 이미지가 add/update/remove 됬을 때로 나누어 코드를 작성한다
private void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
{
// 감지된 모든 tracked Image를 돎
foreach (var trackedImage in eventArgs.added)
{
// Get the name of the reference image
var imageName = trackedImage.referenceImage.name;
// Now loop over the array of prefabs
foreach (var curPrefab in ArPrefabs)
{
// tracked Image 이름과 prefab이 매치가 되는지 확인한 후, 아직 생성되지 않은 prefab이라면 생성
if (string.Compare(curPrefab.name, imageName, StringComparison.OrdinalIgnoreCase) == 0
&& !_instantiatedPrefabs.ContainsKey(imageName))
{
// Instantiate the prefab, parenting it to the ARTrackedImage
var newPrefab = Instantiate(curPrefab, trackedImage.transform);
// Add the created prefab to our array
_instantiatedPrefabs[imageName] = newPrefab;
}
}
}
// For all prefabs that have been created so far, set them active or not depending
// on whether their corresponding image is currently being tracked
foreach (var trackedImage in eventArgs.updated)
{
_instantiatedPrefabs[trackedImage.referenceImage.name]
.SetActive(trackedImage.trackingState == TrackingState.Tracking);
}
// tracked image가 없어졌을 때, 오브젝트 삭제
foreach (var trackedImage in eventArgs.removed)
{
// Destroy its prefab
Destroy(_instantiatedPrefabs[trackedImage.referenceImage.name]);
// Also remove the instance from our array
_instantiatedPrefabs.Remove(trackedImage.referenceImage.name);
// Or, simply set the prefab instance to inactive
//_instantiatedPrefabs[trackedImage.referenceImage.name].SetActive(false);
}
}
}
Prefab 생성
이제 다시 ARSessionOrigin의 인스펙터 창으로 가보면 스크립트에 다음과 같이 Ar Prefab 리스트가 뜨게 되는데, 이제 우리가 생성할 가상 프리펩을 만들어보자.
에셋 창에서 마우스 우클릭>create>prefab을 눌러주어 iphone이라고 이름지어보자. 그 후 Iphone prefab을 더블클릭하면, 프리펩을 수정할 수 있게 된다. 여기서 다음과 같이 scale 0.01, 0.01, 0.01의 큐브를 만들어주자. 여기서 단위는 m이므로, 나중에 안드로이드 카메라로 촬영했을때 1cm^3의 큐브가 생성될 것이다.
다시 AR Session Origin으로 돌아가서, Ar Prefabs에 방금 만들어준 Iphone prefab을 드래그하여 넣어주자.
Build
이제 필요한 준비는 다 됬다! 빌드를 해보자. file>build setting에 들어가서 안드로이드로 바꾸어주고, Add open Scene을 클릭하여 현재 씬을 추가해준다. 그 후 switch platform을 눌러주면된다.
이제 본인이 가지고 있는 안드로이드 기기와 연결해주어야 하는데, 안드로이드 기기에서 설정>개발자 옵션에 들어가서 개발자 모드를 켜주어야 한다. 준비가 다 되었다면 컴퓨터와 기기를 usb 케이블로 연결하여 빌드를 시작해보자.
Build Setting에서 Build and Run을 눌러주면 다음과 같이 우리가 설정한 이미지에 오브젝트가 따라다니는 것을 볼 수 있다. (Iphone 이미지로 오류나서 다른것으로 교체, 해상도 낮은 이미지는 잘 인식 못하는듯, png보다 jpg가 낫다고들 한다)
여기까지 이미지 트래킹 듀토리얼이었습니다. 다음에는 다른 기능설명하러 오겠습니다!
참고자료 - https://www.youtube.com/watch?v=gpaq5bAjya8&t=1377s
'XR' 카테고리의 다른 글
유니티 홀로렌즈 앱 쉽게 배포 하기 (0) | 2022.12.01 |
---|---|
[Unity + Hololens 2] Spatial Awareness (0) | 2022.10.02 |
AR Tutorial (1) - 설치 및 프로젝트 생성 (0) | 2022.09.19 |
VR 게임 추천 + 후기 (0) | 2022.05.09 |
VR 입문자를 위한 초반 설정 (0) | 2022.05.09 |