简体   繁体   中英

Unity ARKit : How can I get trackingState properly?

I am trying to get the trackingState properly but I didn't get the meaning of "Hook ARFrameUpdatedEvent instead and get UnityARCamera.trackingState"... How do I do this?

Thank you in advance.

[Obsolete("Hook ARFrameUpdatedEvent instead and get 
UnityARCamera.trackingState")]
    public int GetARTrackingQuality()
    {
        return GetTrackingQuality();
    }

You can get the tracking state by registering for the following delegate callbacks eg:

void Start ()
    {

        //1. Register For The ARFrame Updated Event
        UnityARSessionNativeInterface.ARFrameUpdatedEvent += ARFrameUpdated;
        UnityARSessionNativeInterface.ARSessionFailedEvent += ARSessionFailedEvent;

    }

Then you would create functions to handle the callbacks eg:

    /// <summary>
    /// Called Each Time The ARCamera Is Updated
    /// </summary>
    /// <param name="camera">Camera.</param>
    public void ARFrameUpdated (UnityARCamera camera)
    {

        //1. Track The ARSession
        if (camera.trackingState == ARTrackingState.ARTrackingStateLimited) {

            logTrackingReason (camera.trackingReason);

        } else {

            logTrackingState (camera.trackingState);

        }

        logLighting (camera.lightData.arLightEstimate.ambientIntensity);

    }

    /// <summary>
    /// Determines If The Current Lighting Conditions Are Appropriate For The ARSession
    /// </summary>
    /// <param name="lightEstimate">Light estimate.</param>
    public void logLighting (float lightEstimate)
    {

        if (lightEstimate < 100) {
            arTrackingStatus = "Lighting Is To Dark";

        }

    }

    /// <summary>
    /// Informs The User About The Current Tracking State
    /// </summary>
    /// <param name="trackingState">Tracking state.</param>
    public void logTrackingState (ARTrackingState trackingState)
    {


        switch (trackingState) {

        case ARTrackingState.ARTrackingStateNormal:
            arTrackingStatus = "Tracking Ready";
            break;

        case ARTrackingState.ARTrackingStateNotAvailable:
            arTrackingStatus = "Tracking Unavailable";
            break;

        }


    }

    /// <summary>
    /// Informs The User About The Current Tracking Status
    /// </summary>
    /// <param name="reason">Reason.</param>
    public void logTrackingReason (ARTrackingStateReason reason)
    {

        switch (reason) {

        case ARTrackingStateReason.ARTrackingStateReasonExcessiveMotion:
            arTrackingStatus = "Please Slow Your Movement";
            break;

        case ARTrackingStateReason.ARTrackingStateReasonInsufficientFeatures:
            arTrackingStatus = "Try To Point At A Flat Surface";
            break;

        case ARTrackingStateReason.ARTrackingStateReasonInitializing:
            arTrackingStatus = "Initializing";
            break;

        }
    }

    /// <summary>
    /// Prints The ARSession Failed Event
    /// </summary>
    /// <param name="error">Error.</param>
    public void ARSessionFailedEvent (string error)
    {

        print (error);

    }

Having done this you can handle these in the Update method like so:

void Update ()
    {

        print (arTrackingStatus);

    }

Hope it helps...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM