确认 ARHit 就绪

Confirm ARHit Ready

我正在使用 Unity 和 Apples 的 ARKitHitTest 脚本。我在 UI 上创建了一个提示,要求用户指向地面并扫描。

我想做的是确定 ARKit 何时扫描到足够的点来放置目标。一旦我弄清楚这是如何完成的,我就可以更新用户提示说准备好放置。谁能告诉我如何确定 ARKit 何时准备好放置?谢谢!

ARKit 有许多方法可用于确定跟踪是否可用,以及例如条件是否不适合跟踪。

这些可以通过注册以下回调在 Unity 中获得:

UnityARSessionNativeInterface.ARFrameUpdatedEvent += ARFrameUpdated;
UnityARSessionNativeInterface.ARSessionFailedEvent += ARSessionFailedEvent;

例如,这些可以帮助您确定跟踪是否可用或受限。

基本上当一个会话有良好的条件时,例如代表通知我们:

ARTrackingStateReason.ARTrackingStateReasonNone

我们知道条件适合放置对象,因为有足够的特征点可用等

因此 Class 处理这个问题可能看起来像这样:

public class ARTrackingStatusController : MonoBehaviour {

    //1. Get Reference To The Session
    private UnityARSessionNativeInterface augmentedRealitySession;


    private string arTrackingStatus = "Preparing Device...";


    //------------------
    //MARK: -  LifeCycle
    //------------------

    void Start () {

        //1. Register For The ARFrame Updated Event Which In IOS = (func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval))
        UnityARSessionNativeInterface.ARFrameUpdatedEvent += ARFrameUpdated;
        UnityARSessionNativeInterface.ARSessionFailedEvent += ARSessionFailedEvent;


    }

    void Update () {

        //1. Update The Status Of The Session
        print(arTrackingStatus);

    }


    //-------------------------
    //MARK: - ARSCNViewDelegate
    //-------------------------

    /// <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) {

            logTrackingStateReason (camera.trackingReason);

        } else {

            logTrackingState (camera.trackingState);

        }

        logLighting (camera.lightData.arLightEstimate.ambientIntensity);

    }

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

        print (error);

    }

    //----------------------
    //MARK: - Status Updates
    //----------------------

    /// <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 logTrackingStateReason (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;

        case ARTrackingStateReason.ARTrackingStateReasonRelocalizing:
            arTrackingStatus = "Relocalizing";
            break;

        case ARTrackingStateReason.ARTrackingStateReasonNone:
            arTrackingStatus = "";
            break;

        }


    }

    /// <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";

        }

    }

希望对您有所帮助...