본문 바로가기
개발/Unity

유니티 AR - 클라우드에 데이터 베이스 만들기 (Vuforia Cloud Recognition)

by 피로물든딸기 2023. 6. 25.
반응형

Unity 전체 링크

 

참고

- 유니티 AR 뷰포리아 튜토리얼

- 이미지 타겟팅으로 오브젝트 띄우기 From Image

- 이미지 타겟팅으로 오브젝트 띄우기 From DataBase

- https://library.vuforia.com/cloud-recognition/working-cloud-recognition

 

뷰포리아는 타겟이 되는 이미지, 즉 인식해야할 이미지를 클라우드에 업로드하는 기능을 제공한다.


Cloud Database 만들기

 

개발 페이지에서 Target Manger를 선택한 후, 아래와 같이 Cloud를 선택한다.

이때 라이센스는 지금까지 이용한 라이센스를 선택하면 된다.

 

CloudTest가 만들어졌으면 클릭하자.

 

Database Access Keys에는 Client가 알아야 할 Access Key와 Secret Key가 있다.

 

위에서 제공받은 키를 유니티에 등록하면 된다.


유니티에 적용하기

 

유니티에서 Cloud Recognition에 있는 두 개의 오브젝트를 만든다.

 

위에서 받은 키를 Cloud Recognition에 등록한다.

 

다시 뷰포리아 개발자 페이지로 들어가 이미지를 등록한다.

여기서 Width는 10으로 설정하였다.

 

등록한 이미지는 아래와 같다.

 

이미지를 등록하면 처음 StatusProcessing인 상태가 된다.

 

시간이 지나면 Active로 변하게 된다.

 

이제 아래 API 문서를 참고하여 SimpleCloudRecoEventHandler.cs를 만든다.

https://library.vuforia.com/cloud-recognition/working-cloud-recognition

 

Working with Cloud Recognition | Vuforia Library

Working with Cloud Recognition

library.vuforia.com

 

클라우드 이미지 타겟을 등록하는 코드를 추가해야 한다.

 

예시 코드는 다음과 같다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;

public class SimpleCloudRecoEventHandler : MonoBehaviour
{
    CloudRecoBehaviour mCloudRecoBehaviour;
    bool mIsScanning = false;
    string mTargetMetadata = "";

    public ImageTargetBehaviour ImageTargetTemplate;

    // Register cloud reco callbacks
    void Awake()
    {
        mCloudRecoBehaviour = GetComponent<CloudRecoBehaviour>();
        mCloudRecoBehaviour.RegisterOnInitializedEventHandler(OnInitialized);
        mCloudRecoBehaviour.RegisterOnInitErrorEventHandler(OnInitError);
        mCloudRecoBehaviour.RegisterOnUpdateErrorEventHandler(OnUpdateError);
        mCloudRecoBehaviour.RegisterOnStateChangedEventHandler(OnStateChanged);
        mCloudRecoBehaviour.RegisterOnNewSearchResultEventHandler(OnNewSearchResult);
    }
    //Unregister cloud reco callbacks when the handler is destroyed
    void OnDestroy()
    {
        mCloudRecoBehaviour.UnregisterOnInitializedEventHandler(OnInitialized);
        mCloudRecoBehaviour.UnregisterOnInitErrorEventHandler(OnInitError);
        mCloudRecoBehaviour.UnregisterOnUpdateErrorEventHandler(OnUpdateError);
        mCloudRecoBehaviour.UnregisterOnStateChangedEventHandler(OnStateChanged);
        mCloudRecoBehaviour.UnregisterOnNewSearchResultEventHandler(OnNewSearchResult);
    }

    public void OnInitialized(CloudRecoBehaviour cloudRecoBehaviour)
    {
        Debug.Log("Cloud Reco initialized");
    }

    public void OnInitError(CloudRecoBehaviour.InitError initError)
    {
        Debug.Log("Cloud Reco init error " + initError.ToString());
    }

    public void OnUpdateError(CloudRecoBehaviour.QueryError updateError)
    {
        Debug.Log("Cloud Reco update error " + updateError.ToString());
    }

    public void OnStateChanged(bool scanning)
    {
        mIsScanning = scanning;

        if (scanning)
        {
            // Clear all known targets
        }
    }

    public void OnNewSearchResult(CloudRecoBehaviour.CloudRecoSearchResult cloudRecoSearchResult)
    {
        // Store the target metadata
        mTargetMetadata = cloudRecoSearchResult.MetaData;

        // Stop the scanning by disabling the behaviour
        mCloudRecoBehaviour.enabled = false;

        if(ImageTargetTemplate)
        {
            mCloudRecoBehaviour.EnableObservers(cloudRecoSearchResult, ImageTargetTemplate.gameObject);
        }

    }

    void OnGUI()
    {
        // Display current 'scanning' status
        GUI.Box(new Rect(100, 100, 200, 50), mIsScanning ? "Scanning" : "Not scanning");
        // Display metadata of latest detected cloud-target
        GUI.Box(new Rect(100, 200, 200, 50), "Metadata: " + mTargetMetadata);
        // If not scanning, show button
        // so that user can restart cloud scanning
        if (!mIsScanning)
        {
            if (GUI.Button(new Rect(100, 300, 200, 50), "Restart Scanning"))
            {
                // Reset Behaviour
                mCloudRecoBehaviour.enabled = true;
                mTargetMetadata = "";
            }
        }
    }
}

 

이 스크립트를 Cloud Recognition에 등록한다.

 

그리고 ImageTarget을 Template에 설정한다.

 

AR로 만들 오브젝트를 자식 오브젝트로 선언한다.

Width10이었기 때문에 Sphere의 Scale이 모두 10이다.

 

게임을 실행하면 클라우드에 업로드한 이미지를 인식하여 Sphere가 나타나게 된다.

 

다시 Sphere의 Scale을 모두 1로 바꾸자.

 

그리고 새로운 이미지를 업로드하자. (Width : 1)

 

처음 업로드했던 이미지는 크기가 작은 Sphere가 나타나고, 두 번째 이미지는 크기가 큰 Sphere가 나타나게 된다.

 

반응형

댓글