Only this pageAll pages
Powered by GitBook
1 of 16

Documentation (KOR)

Loading...

Getting Started

Loading...

Loading...

3D Object

Loading...

Unity Scene

Loading...

Scene Manager

Loading...

Samples

Loading...

Loading...

NReal Glasses

Loading...

Loading...

3D Object 배치

Unity Scene View 상에서 렌더링할 3D Object를 쉽게 배치하고 레퍼런스 카메라를 통해 정교하게 위치 조정하며 마지막으로 시뮬레이션하는 방법 대한 설명입니다.

Load VPS Map

저작하려는 VPS Map을 VPSStudio GameObject의 VPSStudioController를 통해 실행 합니다.

Map을 업로드 하게 되면 아래의 그림과 같이 Unity Scene View에서 표현 됩니다.

콘텐츠 저작

콘텐츠의 배치는 Map의 Mesh의 위치를 기본으로 이루어집니다.Mesh주위의 원하는 부분에 콘텐츠를 배치하고 주변의 ReferenceCamera를 통해서 확인을 합니다.

ReferenceCamera를 선택한 상태에서 컨텐츠의 위치를 변경하면 사용자가 원하는 위치를 맞출 수 있습니다.

시뮬레이션 데이터를 이용한 컨텐츠 저작 상태 확인

저작을 완료 하면 VPSStudio의 VPS Simulation Data를 통해서 확인 할 수 있습니다. 해당 지역의 Simulation Data로 OSX나 Windows에서 Play 시점에 확인 할 수 있습니다.

Occlusion 처리를 위한 Mesh 설정

Occlusion(건물 메쉬에 의한 가려짐)에 대한 설명은 아래 페이지에 설명 되어 있습니다.

Scene Manager 설명

Unity Scene 구성

MAXST VPS의 Unity Scene 구성에 대해서 설명합니다.

Scene 구성 개요

MAXSTVPS의 Unity Scene Hierarchy는 다음과 같습니다.

  • ARCamera GameObject : 트래킹 중인 카메라의 이미지와 자세를 처리합니다.

  • VPSStudio GameObject : VPS 공간지도 데이터를 관합니다.

  • RootTrackable GameObject : VPS 공간지도 상에 렌더링하는 3D Object들의 Root Object입니다.

    • (렌더링하려는 3D Object는 Root Object의 하위에 배치해야 합니다.)

  • SceneManager GameObject : MAXST VPS 작동을 컨트롤합니다.

ARCamera GameObject

ARCamera는 사용자 기기의 카메라 6자유도 자세(Position/Rotation)를 반영합니다.

CameraBackground GameObject

CameraBackground는 하드웨어 카메라로부터 얻은 이미지를 표시합니다.

VPSStudio GameObject

VPSStudio는 VPS 공간지도 데이터를 관리합니다.

VPSStudio Controller 메뉴는 다음과 같습니다

  • VPS Map 콤보 박스를 통해 VPSData 폴더 하위에 저장된 VPS 공간지도 리스트를 확인하고 원하는 지역을 선택할 수 있습니다.

  • VPS Simulation Data 콤보 박스를 통해 VPSData/VPSSimulationData/your_vps_map 하위에 저장된 시뮬레이션 데이터 리스트를 확인하고 원하는 시뮬레이션 데이터를 선택할 수 있습니다.

  • Load VPS Map버튼을 누르면 선택 지역에 대한 메쉬와 레퍼런스 카메라를 로드합니다.

  • Clear버튼을 누르면 선택 지역에 대한 메쉬와 레퍼런스 카메라를 삭제 합니다.

Reference Camara Controller는 3D Object 배치시 최적의 시점을 선택하여 배치할 수 있습니다.

Navigation Controller는 해당 지역 안에서 내비게이션 기능을 제공 합니다

  • Position Distance는 내비게이션 경로 상를 따라 렌더링할 화살표 Object 간격입니다. 단위는 미터입니다.

  • Arrow Prefab은 경로에 배치할 3D 화살표 Object 입니다.

  • Root Trackable은 트래킹 자세를 반영하여 경로에 대한 3D Object를 렌더링하기 위한 Root GameObject 입니다.

Scene Manager

SceneManager는 VPS 작동을 컨트롤합니다.

  • Disable Objects는 Unity Play시점에 disable할 GameObject들입니다.(VPSStudio GameObject는 카메라 아이 를 포함하기 때문에 disable해야 합니다.

  • Root Trackable은 트래킹이 될 컨텐츠를 모아둔 GameObject입니다.

  • Occlusion Objects는 Unity Play시점에 Occlusion 처리를 할 Mesh들 입니다. 추가로 Occlusion이 필요한 Mesh가 존재한다면, 해당 부분에 추가 하면 됩니다.

Scene Manager 설명

SceneManager에 대한 설명입니다.

SceneManager에서 필수 구성 요소 얻기

아래는 SceneManager의 필수 구성 요소를 얻는 코드입니다.

필수 구성 요소

  • ARManager

  • ARCamera

  • VPSStudioController

  • CameraBackgroundBahavior

  • RootTrackable

MaxstSceneManager.cs
ARManager arManagr = FindObjectOfType<ARManager>();
if (arManagr == null)
{
    Debug.LogError("Can't find ARManager. You need to add ARManager prefab in scene.");
    return;
}
else
{
    arCamera = arManagr.gameObject;
}

vPSStudioController = FindObjectOfType<VPSStudioController>();
if (vPSStudioController == null)
{
    Debug.LogError("Can't find VPSStudioController. You need to add VPSStudio prefab in scene.");
    return;
}
else
{
    string serverName = vPSStudioController.vpsServerName;
    vPSStudioController.gameObject.SetActive(false);
}

cameraBackgroundBehaviour = FindObjectOfType<CameraBackgroundBehaviour>();
if (cameraBackgroundBehaviour == null)
{
    Debug.LogError("Can't find CameraBackgroundBehaviour.");
    return;
}

if(rootTrackable == null)
{
    Debug.LogError("You need to add RootTrackable.");
}

VPSStudioController로 위치 인식을 위한 서버 이름을 얻습니다.

Occlusion (건물 메쉬에 의한 가려짐) 구현

렌더링하고자 하는 3D 오브젝트가 건물 메쉬에 의해 가려지는 효과를 Occlusion effect라고 합니다. Occlusion은 runtimeBuildingMaterial를 렌더링시 적용함으로써 구현됩니다.

MaxstSceneManager.cs
foreach (GameObject eachGameObject in occlusionObjects)
{
    Renderer[] cullingRenderer = eachGameObject.GetComponentsInChildren<Renderer>();
    foreach (Renderer eachRenderer in cullingRenderer)
    {
        eachRenderer.material.renderQueue = 1900;
        eachRenderer.material = runtimeBuildingMaterial;
    }
}

카메라 시작 / 시뮬레이션 시작

스마트폰과 스마트 글래스와 같은 모바일 기기 환경에서는 아래 코드를 통해 하드웨어 카메라가 시작됩니다. MAC OS X와 Windows 환경에서는 VPSStudioController를 통해 선택한 시뮬레이션 데이터가 시작됩니다. 이를 통해 현장에 직접 나가지 않아도 앱 개발이 가능합니다.

MaxstSceneManager.cs
if (Application.platform == RuntimePlatform.OSXEditor || Application.platform == RuntimePlatform.WindowsEditor)
{
    string simulatePath = vPSStudioController.vpsSimulatePath;
    if (Directory.Exists(simulatePath))
    {
        CameraDevice.GetInstance().Start(simulatePath);
        MaxstAR.SetScreenOrientation((int)ScreenOrientation.Portrait);
    }
}
else
{
    if (CameraDevice.GetInstance().IsFusionSupported(CameraDevice.FusionType.ARCamera))
    {
        CameraDevice.GetInstance().Start();
    }
    else
    {
        TrackerManager.GetInstance().RequestARCoreApk();
    }
}

VPS Tracker 시작

VPS Tracker를 시작하기 위해서는 해당 VPS 공간지도에 접근할 수 있도록 서버 이름을 입력해야 합니다.

MaxstSceneManager.cs
TrackerManager.GetInstance().StartTracker();

if (serverName != "")
{
    string vpsquery = "{\"vps_server\":\"" + serverName + "\"}";
    TrackerManager.GetInstance().AddTrackerData(vpsquery);
}

VPS 트래킹 결과 얻기

트래킹 결과는 UpdateFrame()과 GetARFrame()을 통해서 얻을 수 있습니다. GetARFrame()을 통해 얻은 ARFrame의 인스턴스에는 현재 트래킹 상태, 이미지, 6자유도 자세를 포함되어 있습니다.

ARFrame의 GetARLocationRecognitionState()를 통해서 현재 위치 인식 상태를 얻을 수 있습니다. 이 상태 정보에 맞춰 증강시킬 3D Object의 활성화 여부를 결정합니다.

MaxstSceneManager.cs
void Update()
{
    TrackerManager.GetInstance().UpdateFrame();

    ARFrame arFrame = TrackerManager.GetInstance().GetARFrame();
    
    TrackedImage trackedImage = arFrame.GetTrackedImage();


    if (trackedImage.IsTextureId())
    {
        IntPtr[] cameraTextureIds = trackedImage.GetTextureIds();
        cameraBackgroundBehaviour.UpdateCameraBackgroundImage(cameraTextureIds);
    }
    else
    {
        cameraBackgroundBehaviour.UpdateCameraBackgroundImage(trackedImage);
    }

    if(arFrame.GetARLocationRecognizeState() == ARLocationRecognizeState.ARLocationRecognizeStateNormal)
    {
        Matrix4x4 targetPose = arFrame.GetTransform();

        arCamera.transform.position = MatrixUtils.PositionFromMatrix(targetPose);
        arCamera.transform.rotation = MatrixUtils.QuaternionFromMatrix(targetPose);
        arCamera.transform.localScale = MatrixUtils.ScaleFromMatrix(targetPose);

        rootTrackable.SetActive(true);
    }
    else
    {
        rootTrackable.SetActive(false);
    }
}

Setup Guide

MAXST VPS 셋업 가이드입니다.

기본 개발 환경 설정

요구사항

  • MAXST VPS SDK는 Unity 2020 버전 이상을 권장합니다.

  • Unity용 MAXST VPS SDK를 사용하기 위해서는 Unity 개발 도구와 Unity 개발에 대한 기본적인 지식이 필요합니다.

MAXST VPS Unity SDK 설치

  1. VPSSDKUnity 를 다운로드 합니다.

  2. Unity Project 열거나 새로 생성하세요.

  3. 새로 생성 했을 경우, MAXSTVPSSDK_0.8.0.unitypackage 를 다운 받아 유니티에 설치 하세요.

  4. VPSData를 다운 받아 위치에 맞는 VPS 공간지도를 설치해 주세요.

해당 파일들 이메일을 통해 다운받으세요.

Unity Setting

Unity의 File/Build Settings/Player Settings에 대한 설명 입니다.

  • Android는 Other Settings의 Graphics APIs를 OpenGLES3만 선택되어야 합니다.

  • Android는 Multithreaded Rendering의 체크를 해지해 주세요.

  • Adnroid는 Publishing Settings에 Custom Main Manifest와 Custom Main Gradle Template가 설치 되어야 합니다.

해당 Manifest와 Gradle 셋팅은 아래의 Github 링크를 참고 바랍니다.

iOS는 Camera Usage Description 과 Location Usage Description에 문구를 추가해 주세요.

Editor Coroutines Package 설치

MAXST VPS SDK는 Unity의 Editor Coroutines Package를 요구합니다.

아래와 같은 메시지가 발생 했을 경우에는 Unity > Window > PackageManager > Editor Coroutines을 검색하여 패키지를 설치합니다.

VPS 공간지도 설치

VPS 공간지도는 해당 지역의 메쉬와 레퍼런스 이미지, 시뮬레이션 데이터를 포함합니다. VPS 공간지도는 아래 그림과 같이 Unity Project 폴더와 동일 레벨에 VPSData 폴더를 생성하고 VPSData 하위에 저장되어야 합니다.

MAXST에서 제공하는 VPSData_yangjae_indoor.zip 파일을 Unity Project 폴더와 동일 레벤에서 압축을 압축을 해제하면 자동으로 VPSData 폴더 하위에 VPSMap 폴더와 VPSSimulationData 폴더가 있고 두 폴더 하위에는 yangjae_indoor 폴더가 생성됩니다.

반드시 VPS 공간지도 폴더 구조를 따라야만 VPS SDK에서 정상적으로 실행됩니다.

VPS Map 커버리지

현재 이용가능한 VPS Map 커버리지입니다.

양재역 인근

총면적: 약 79,659 m²

Unity 개발 도구에 대한 자세한 정보는 를 이용하시기 바랍니다.

The type or namespace name 'EditorCoroutines' does not exist in the namespace ‘Unity'.  

주요위치

북위

동

MAXST 본사 (1)

37.48513

127.03492

양재역 사거리 (2)

37.48450

127.03408

맵 경계구역 (3)

37.48756

127.03168

맵 경계구역 (4)

37.48798

127.03300

맵 경계구역 (5)

37.48509

127.03555

맵 경계구역 (6)

37.48369

127.03500

맵 경계구역 (7)

37.48441

127.03214

유니티 웹사이트

Github Link

AndroidManifest.xml
MainTemplate.gradle

Nreal Glasses 지원

Nreal Glasses에서 MAXST VPS SDK를 동작시키는 방법에 대해 설명합니다.

Nreal Unity SDK Download

MAXST VPS Unity SDK for Nreal Glasses Download

Unity Scene 구성

Nreal Glasses용 Unity Scene 구성은 다음과 같습니다. Unity Scene 구성에 대한 자세한 설명을 아래 페이지에서 확인할 수 있습니다. 기존 Unity Scene에서의 ARCamera는 NRCameraRig로 대체되었습니다.

SceneManager 구성

SceneManager에서 Ar Camera는 NRCameraRig Object로 변경되었습니다.

Nreal 카메라 시작 / VPS 트래커 시작

NRCollectYUV 인스턴스의 Play()통해서 Nreal 카메라를 시작합니다.

VPS Tracker 시작에 대한 설명은 아래 페이지에서 확인하시기 바랍니다.

NRealSceneManager.cs
nRCollectYUV = new NRCollectYUV();
nRCollectYUV.Play();
TrackerManager.GetInstance().StartTracker();

if (serverName != "")
{
    string vpsquery = "{\"vps_server\":\"" + serverName + "\"}";
    TrackerManager.GetInstance().AddTrackerData(vpsquery);
}

VPS 트래킹 결과 얻기

Unity Update()에서 ARFrame 인스턴스를을 얻는 코드입니다. Update 시점의 VPS 공간지도상 6자유도 자세를 얻어 렌더링용 가상 카메라에 반영하는 코드입니다.

NRealSceneManager.cs
void Update()
{
    TrackerManager.GetInstance().UpdateFrame();
    nRCollectYUV.UpdateFrame();
    var eyePoseFromHead = NRFrame.EyePoseFromHead;
    Matrix4x4 Mhe = MatrixUtils.ConvertPoseToMatrix4x4(eyePoseFromHead.RGBEyePos);

    ARFrame arFrame = TrackerManager.GetInstance().GetARFrame();

    if (arFrame.GetARLocationRecognizeState() == ARLocationRecognizeState.ARLocationRecognizeStateNormal)
    {
        Matrix4x4 targetPose = arFrame.GetTransform(Mhe);

        arCamera.transform.position = MatrixUtils.PositionFromMatrix(targetPose);
        arCamera.transform.rotation = MatrixUtils.QuaternionFromMatrix(targetPose);
        arCamera.transform.localScale = MatrixUtils.ScaleFromMatrix(targetPose);

        rootTrackable.SetActive(true);
    }
    else
    {
        rootTrackable.SetActive(false);
    }
}

Prerequisites

MAXSTVPS SDK를 사용하기 전 확인해야 할 스펙 정보입니다.

MAXSTVPS Unity Project for Smart Phones

MAXSTVPS Unity Project for Nreal Glasses

VPS 공간 지도

VPS 공간 지도에는 해당 지역의 메쉬, 레퍼런스 카메라, 시뮬레이션 데이터가 포함되어 있습니다.

Nreal Glasses를 지원하기 위해서는 Nreal Unity SDK가 필요합니다. 를 통해 다운받으시기 바랍니다. Nreal Unity SDK를 다운 받고, 해당 SDK를 프로젝트에 Assets/import Package를 통해서 추가 하셔야 합니다.

Nreal Glasses를 지원하기 위해서는 MAXST VPS unity SDK for Nreal Glasses가 필요합니다. 통해 다운받으시기 바랍니다. 해당 SDK를 프로젝트에 Assets/import Package를 통해서 추가 하셔야 합니다.

링크
링크
Unity Scene 구성
Scene Manager 설명

Included SDK Version

0.8.0

Requirements

Unity 2020 or later

Supported Devices

iPhones (supporting ARKit), Android Phones (supporting ARCore)

Samples

Placement by Raycasting, AR Navigation

Included SDK Version

0.8.0

Requirements

Unity 2020 or later, ​

Supported Devices

Nreal Glasses

Samples

Placement by Raycasting, AR Navigation

Nreal Unity SDK
245KB
VPS맵커버리지(한글).pdf
pdf
VPS맵커버리지_양재역인근

AR Navigation

MAXSTVPS AR Navigation에 대한 설명입니다.

AR Navigation

출발 위치와 도착 위치를 지정해서 네비게이션 경로를 얻을 수 있는 코드는 아래와 같습니다. 만약 현재 사용자 위치로부터 네비게이션 경로를 얻고 싶으면 arCamera.tranform.position을 출발 위치로 지정하시면 됩니다. 이 경우, 위치 인식이 성공적으로 수행한 후에 올바른 결과를 얻을 수 있습니다.

MaxstSceneManager.cs
public void OnClickNavigation()
{
    NavigationController navigationController = vPSStudioController.GetComponent<NavigationController>();
    navigationController.MakePath(arCamera.transform.position, new Vector3(77.975977f, 0, 71.859565f), serverName);
}

NavigationController는 VPSStudio GameObject로부터 얻을 수 있습니다. NavigationController의 인스턴스의 MakePath()를 통해서 출발 위치로 부터도착 위치까지 경로를 얻을 수 있습니다.

목적지 위치는 VPS 공간지도 메쉬를 기준으로 3차원 좌표값을 입력하면 됩니다.

  • arCamera.transform.position은 VPS 공간지도 좌표계 상 카메라의 위치 입니다.

VPSStudio에서 맵 선택
Map 로드 후 Unity Scene View
Mesh 주변에 콘텐츠 배치
콘텐츠 위치 주변의 ReferenceCamera 선택
ReferenceCamera를 통한 확인
Unity Game View
ARCamera 구성
VPSStudio Inspector
SceneManager Inspector
VPS 공간지도 폴더 구조
VPS Map _ 양재역 인근
Nreal Glasses용 Unity Scene Hierarchy
NReal을 위한 SceneManager 구성.
AR Navigation 샘플

API Reference

API Reference 링크입니다

를 클릭해서 API Reference를 확인하세요.

여기

Placement by Raycast

MAXST VPS Placement by Raycast에 대한 설명입니다.

Placement by Raycast

건물 표면 위에 터치한 위치에 3D Object를 배치하는 샘플입니다. 마우스나 터치를 통해 카메라 중심과 연결한 ray를 생성하고 건물 메쉬와 교차 점을 계산하는 코드입니다.

MaxstSceneManager.cs
public void AttachLogo()
{
    Vector2 vTouchPos = Input.mousePosition;

    Ray ray = Camera.main.ScreenPointToRay(vTouchPos);

    RaycastHit vHit;
    if (Physics.Raycast(ray.origin, ray.direction, out vHit))
    {
        maxstLogObject.transform.position = vHit.point;
        maxstLogObject.transform.rotation = Quaternion.FromToRotation(Vector3.forward, vHit.normal) * Quaternion.Euler(-90.0f ,0.0f, 0.0f);
    }
}
Placement by Raycasting 예제