미디어 콘텐츠 스터디
05. 이미지 추적하기(Image Tracking) 본문
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 실행하기
'증강현실(Augmented Reality) > ARCore 사용하기' 카테고리의 다른 글
07. 얼굴 필터 만들기(Face Filter) (0) | 2023.09.29 |
---|---|
06. 얼굴 추적하기(Face Tracking) (0) | 2023.09.28 |
04. 오브젝트 확대/축소하기(Object Pinch to Scale/Drag) (0) | 2023.08.12 |
03. 오브젝트 배치하기(Object Placement) (0) | 2023.06.27 |
02. 지면 감지하기(Plane Detection) (0) | 2023.06.27 |