Unity Google ARCore / MR


현재 유니티에서 AR을 만드는 방법은 


[ 안드로이드 ]

1. Vuforia / 2. ARCore / 3. ARFoundation


[ 아이폰 ]

1. ARKit / 2. ARFoundation


이렇게 나눠진다. 

ARFoundation은 안드로이드랑 아이폰의 AR을 공용으로 사용하기 위해 만든 로우레벨의 AR SDK 라고 함. 



일단 안드로이드만 보자면,


 

 AR Core

Vuforia 

장점 

바닥면을 인식할 수 있다.

씬 별로 AR 여부를 설정하기 간편하다

무료인데 워터마크도 없다

오래된 SDK 라서 레퍼런스가 많다

실물 오브젝트 스캔 데이터를 이용한 트레킹 가능

범용성이 좋다.

이미지 트레킹의 경우 미리 생성된 오브젝트를 On Off 하는 식이라서 해당 오브젝트에 여러가지 조작이 가능하다.

단점

 레퍼런스 부족

지원 안하는 기종이 간혹 있다

ARCore SDK앱을 스토어에서 다운받아야한다.

씬 별로 AR 여부를 설정하기 불편하다. 

무료에서는 워터마크가 존재한다


이정도의 장단점이 있다. 둘 다 써봤지만, 

Unity에 내장까지 된 Vuforia가 아직까지는 더 간편한건 사실이지만, 트레킹 품질은 현저하게 ARCore가 높다.

구글을 낀 AR Core가 앞으로 점점 더 커질것을 생각해보면 Vuforia보다는 ARCore쪽을 공부하는게 생각한다.



1. 개발 전 준비


유니티 버전 : 최소 2017.3.0f2 / 사용한 버전은 2018.2.13f1

AR코어를 지원하는 핸드폰 : 기종보기



2. SDK 다운로드 및 임포트

Google AR Core SDK Unity Package 다운로드 : https://github.com/google-ar/arcore-unity-sdk/releases



3. 프로젝트 세팅


1) 타겟 플랫폼 안드로이드

2) 플레이어 셋팅에서 Multithreaded rendering 끄기

3) 패키지 네임 설정

4) 최소 API 레벨을 7.0 (누가)로 설정

5) XR 셋팅에서 AR Core Supported 설정



4. 씬 세팅


1) 디폴트 카메라 / 라이트 삭제

2) Assets/GoogleARCore/Prefabs/ARCore Device 를 루트에 넣고 0,0,0위치에 놓음

3) Assets/GoogleARCore/Prefabs/Environmental Light 를 루트에 넣고 

4) GameObject>UI>EventSystem 하나 생성

5) 추가적으로 Plane Generator나 point Cloud, Controller를 넣어주면 되는데, 이는 샘플씬에서 직접 가져오는게 빠름. 



5. SessionConfig 설정


Match Camera Framerate는 상황에 따라 다르지만 개인적으로는 끄는게 좋은듯하다.



6. Tracked pose Driver 설정


- FirstPersonCamera에 Tracked Pose Driver 컴포넌트가 붙어있는데 여기서 Tracking Type을 Rotation Only로 설정 가능하다.

- 근데 이경우 Instant Preview에서는 적용이 안되니  PoInstantPreviewTrackedPoseDriver.cs 를 찾아서 rotation부분을 주석처리해주면 된다.

- 포지션 트레킹을 끄면 이미지 트레킹 위치가 안맞음. 

- Relative Scale은 디폴트로 켜져있는데 아직 테스트 안해봄.

https://docs.unity3d.com/ScriptReference/SpatialTracking.TrackedPoseDriver.html



7. 이미지 트레킹


- session을 별도로 복사해두고 Augmented Image Database를 할당함.

- AugmentedImage.Name 를 사용해서 원하는 이미지미다 별도의 프리팹을 지정가능


https://developers.google.com/ar/develop/unity/augmented-images/guide

http://thepauladams.com/blog/blog/2018/08/16/arcore-unity-augmented-images-multiple-images/



instant 중 여러 애뮬레이터가 연결되어있다고 하는건

cmd에서 adb kill-server를 사용해서 다 끊고 다시 연결.



permission이 플러그인까지 만들어가며 다 구현이 되어있다;

AndroidPermissionsManager.cs 에서 AndroidPermissionsManager.RequestPermission(string permissionName) 을 사용하자




자세한 튜토리얼은..링크로 대체.


https://codelabs.developers.google.com/codelabs/arcore-intro/index.html?index=..%2F..%2Fio2018#0



예제 깃헙

https://github.com/reigngt09/ARCore


----------------------------------------------------------------------------------------------


#. 바라보는 바닥의 높이 얻기

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
using GoogleARCore;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
 
public class RayCaster : MonoBehaviour {
 
    private List<DetectedPlane> m_AllPlanes = new List<DetectedPlane>();
    
    public TextMeshProUGUI text;
    public myCompass myCompass;
 
    public float planeY = 0f;
 
    // Use this for initialization
    void Start () {
        InvokeRepeating("Call"0.2f, 0.2f);
    }
    
    public void Call()
    {
        Session.GetTrackables<DetectedPlane>(m_AllPlanes);
        for (int i = 0; i < m_AllPlanes.Count; i++)
        {
            if (m_AllPlanes[i].TrackingState == TrackingState.Tracking)
            {
                break;
            }
        }
 
        TrackableHit hit;
        TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon |
            TrackableHitFlags.FeaturePointWithSurfaceNormal;
        
        if (Frame.Raycast(Screen.width/2, Screen.height / 2, raycastFilter, out hit))
        {
            if ((hit.Trackable is DetectedPlane) &&
                Vector3.Dot(transform.position - hit.Pose.position,
                    hit.Pose.rotation * Vector3.up) < 0)
            {
                Debug.Log("Hit at back of the current DetectedPlane");
            }
            else
            {
                var anchor = hit.Trackable.CreateAnchor(hit.Pose);
                planeY = anchor.transform.position.y;
                myCompass.SetY(planeY);
            }
        }
    }
}
 







[ AR Core 개발 중 메모 ]


 - 테스트 씬을 바로 빌드하면 앱 이름이 강제로 원래대로 바뀐다. Save as로 별도 씬을 작성해서 빌드할 것.

 - Plane Generator의 경우 PositionTracking도 같이 켜줘야 제대로 실행되는듯..

 - 로테이션만 쓰는 기능 + 포지션도 같이쓰는 기능 둘 다 구현하려면 빈 그룹하나 만들어서 카메라 위치를 따라가게 하면 된다.
 - 실내 GPS는 기준이 되는 곳에서 세팅을 해놓고서... 직접 움직이는 것을 트레킹.


[ AR Core 인스턴스 뷰 ]

 - 몇몇 기능은 인스턴스에서 실행이 안됨

 - 인스턴스쓰다가 오류나면서 꺼지는게 다반사라 실행전 꼭 저장할 것.


[ indoor navigation ]

 - 실내에서는 GPS가 정확하지 않다보니 최초위치를 마커등으로 지정한다음 바닥인식을 실행시켜서 거기서부터 순수하게 AR Core의 바닥 트레킹만으로 실내 네비게이션이 가능하다. 중간에 끊겨 버릴 수 도있긴 한데, 아래링크를 읽어볼 것.

 - https://community.arm.com/graphics/b/blog/posts/indoor-real-time-navigation-with-slam-on-your-mobile 참고



----------------------------------------------------------------------------------------------

MR 시도.


놀랍게도 플레이어 세팅에서 카드보드나 기어VR을 켜주는 것만으로도 같이 연동이 되긴하지만 FOV가 안맞는 문제가 발생.

https://github.com/google-ar/arcore-unity-sdk/issues/134



이 문제에 대해 해결하여 깃허브에 프로젝트를 올린사람이 있음.

https://github.com/jondyne/ARcore_mobileVRHeadset/



플젝에서 window - Packages 에서 AR Foundation 임포트해서 사용한듯.





댓글

Designed by JB FACTORY