본문 바로가기

프로그래밍/Unity

[Unity] AR Foundation Package

AR Foundation

기존 AR 환경을 멀티플랫폼으로 지원하기위해 ARInterface 를 사용했는데, 2018.1 버전에 AR Foundation Package가 포함되어 있다고 해서 관련 내용을 확인.

ARInterface의 업데이트가 오래전에 멈춰 있더니 해당 프로젝트가 합쳐진게 아닌가 싶다.

아무튼, ARUtility에서 시작해 AR Foundation 으로 이름도 변경되고, 계속 업데이트는 하고 있긴 하지만 현재는 1.0.0-프리뷰 버전이다.


AR Foundation 패키지는 AR을 포함한 환경인 XR api를 랩핑한 패키지이며, 실제 각 플랫폼의 XR 플러그인 패키지를 함께 설치해야 한다.

각 AR 플랫폼의 지원범위와 마찬가지로 아래와 같은 기능을 지원한다.


- 평면 인식

- 포인트 클라우드

- 레퍼런스 포인트

- 실제 라이트 온도, 밝기 반영

- 디바이스 공간상 위치 추적


네임스페이스

UnityEngine.Experimental.XR

UnityEngine.XR.ARExtensions

UnityEngine.XR.ARFoundation



설치


패키지 관리자를 통해 설치

설치 후 각 플랫폼을 위한 플러그인도 설치

ARKit XR 플러그인

ARCore XR 플러그인



설치되면 GameObject>XR 항목에 아래와 같은 메뉴들이 추가된다.



기본항목




ARSession

AR의 활성화, 비활성화, 전역 요소

ARSession 은 시작, 일시중지, 재개, 중지 가능


AR하위 시스템 관리자

ARSubsystemManager

세션의 상태를 관리하는 유틸리티들을 제공.

상태쿼리

ARSystemState state = ARSubsystemManager.systemState;

None

Unsupported

CheckingAvailability

NeedsInstall

Installing

Ready

SessionInitialized

SessionTracking



ARSessionOrigin

추적 요소를 Unity의 방향, 축척으로 변환

AR 환경의 스케일을 변경하려면 단순히 이 객체의 Transform scale 을 변경하면 된다.

AR 환경의 크기이므로, 배치된 객체의 크기는 반비례한다.


하위에 카메라가 붙어 있는데, 카메라에는 두개의 컴포넌트가 추가되어있다.

Tracked Pose Driver

AR Camera Background



AR Manager Component

추적할 요소 :  관리자

ARPlane : ARPlaneManager

ARPointCloud : ARPointCloudManager

ARReferencePoint : ARReferencePointManager


위 요소들은 AR Manager Component 를 통해 관리되며, AR 이벤트와 각 추적 요소의 정보를 제공하게 된다.




ARPlane 스크립트를 보면 아래와 같은 이벤트 항목들이 선언되어 있다.

public event Action<ARPlane> updated;

public event Action<ARPlane> removed;

public event Action<ARPlaneBoundaryChangedEventArgs> boundaryChanged


해당 이벤트에 원하는 딜리게이트 함수들을 연결해 두면, 매니저가 해당 상황에 따라 이벤트를 호출해 주게 된다.

그외 컴포넌트들은 이를 통해 AR 의 시각적인 부분들의 설정이다.




GameObject>XR 메뉴에 AR Default Plane, AR Default Point Cloud 로 GameObject를 생성할 수 있으며,

prefab으로 등록해 필요한 내용을 변경하면 된다.

각 스크립트 컴포넌트들도 소스가 제공되므로 필요에 따라 커스터 마이징이 가능하다.






레이 캐스팅

ARSessionOrigin 스크립에는 Raycast() 메쏘드를 제공.

hitResults에 결과가 리턴됨.


터치나 마우스 입력등 스크린의 포인트 정보를 통해 히트 테스트

public bool Raycast(

Vector3 screenPoint, 

List<ARRaycastHit> hitResults, 

TrackableType trackableTypeMask = TrackableType.All

);


특정 Ray( origin, direction)로 히트 테스트

public bool Raycast(

Ray ray, 

List<ARRaycastHit> hitResults, 

TrackableType trackableTypeMask = TrackableType.All, 

float pointCloudRaycastAngleInDegrees = 5

);

'프로그래밍 > Unity' 카테고리의 다른 글

[Unity] 테셀레이션  (0) 2019.04.05
[Unity] 인스펙터 변수 이름 변경  (0) 2018.11.13
[Unity] SteamVR 액션 설정  (0) 2018.11.05
[Unity] Post Process Stack v2  (0) 2018.10.31
[Unity] 유니티용 DLL  (0) 2018.09.18
[Unity] VR 환경 끄거나 켜기  (0) 2018.09.14
[Unity] AssetDatabase  (0) 2018.09.12
[Unity] AssetBundle  (0) 2018.08.24
[unity3d] 서피스 쉐이더 정리  (1) 2018.06.26
[Unity] Mesh 생성 및 변경  (0) 2011.06.24