C# 确认ARHit已准备就绪

C# 确认ARHit已准备就绪,c#,unity3d,augmented-reality,arkit,C#,Unity3d,Augmented Reality,Arkit,我正在使用Unity和Apple的ARKitHitTest脚本。我在UI上创建了一个提示,要求用户指向地面并进行扫描 我想做的是确定ARKit何时有足够的扫描点来放置目标。一旦我弄明白了这是怎么做的,我就可以更新用户提示,说准备好放置了。有人能告诉我如何确定何时可以放置ARKit吗?谢谢 ARKit有许多方法,您可以使用这些方法来确定跟踪是否可用,例如,条件是否不适合跟踪 通过注册以下回调,可以在Unity中获得这些信息: UnityARSessionNativeInterface.ARFram

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


我想做的是确定ARKit何时有足够的扫描点来放置目标。一旦我弄明白了这是怎么做的,我就可以更新用户提示,说准备好放置了。有人能告诉我如何确定何时可以放置ARKit吗?谢谢

ARKit有许多方法,您可以使用这些方法来确定跟踪是否可用,例如,条件是否不适合跟踪

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

UnityARSessionNativeInterface.ARFrameUpdatedEvent += ARFrameUpdated;
UnityARSessionNativeInterface.ARSessionFailedEvent += ARSessionFailedEvent;
例如,这些可以帮助您确定跟踪是可用的还是有限的

基本上,当一次会议条件良好时,例如代表通知我们:

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

处理此问题的类可能如下所示:

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

        }

    }
公共类ARTrackingStatusController:MonoBehavior{
//1.获取会话的引用
私人单位会话国家界面增强真实会话;
私有字符串arTrackingStatus=“准备设备…”;
//------------------
//马克:生命周期
//------------------
无效开始(){
//1.注册ARFrame更新事件,该事件在IOS=(func呈现程序(u呈现程序:SCNSceneRenderer,updateAtTime时间:时间间隔))
UnityARSessionNativeInterface.ARFrameUpdatedEvent+=ARFrameUpdated;
UnityARSessionNativeInterface.ARSessionFailedEvent+=ARSessionFailedEvent;
}
无效更新(){
//1.更新会话的状态
印刷品(arTrackingStatus);
}
//-------------------------
//MARK:-ARSCNViewDelegate
//-------------------------
/// 
///每次更新ARCamera时调用
/// 
///照相机。
已更新公共无效ARFrameUpdated(UnityARCamera)
{
//1.追踪纵火事件
if(camera.trackingState==ARTrackingState.ARTrackingStateLimited){
logTrackingStateReason(摄像头、trackingReason);
}否则{
日志跟踪状态(camera.trackingState);
}
日志照明(摄像头、lightData、arLightEstimate、环境强度);
}
/// 
///记录ARSession失败事件
/// 
///错误。
公共无效ARSessionFailedEvent(字符串错误)
{
打印(错误);
}
//----------------------
//标记:-状态更新
//----------------------
/// 
///通知用户当前跟踪状态
/// 
///跟踪状态。
公共无效日志跟踪状态(ARTrackingState trackingState)
{
开关(跟踪状态){
案例ARTrackingState.ARTrackingStateNormal:
arTrackingStatus=“跟踪就绪”;
打破
案例ARTrackingState.ARTrackingState不可用:
arTrackingStatus=“跟踪不可用”;
打破
}
}
/// 
///通知用户当前跟踪状态
/// 
///原因。
公共无效日志跟踪StateReason(ArtTrackingStateReason)
{
切换(原因){
案例ARTrackingStateReason.ARTrackingStateReason过度运动:
arTrackingStatus=“请放慢移动速度”;
打破
案例ARTrackingStateReason.ArtrackingStateReasonUnficiencies功能:
arTrackingStatus=“尝试指向平面”;
打破
案例ARTrackingStateReason.ARTrackingStateReason初始化:
arTrackingStatus=“初始化”;
打破
案例ARTrackingStateReason.ARTrackingStateReason重新定位:
arTrackingStatus=“重新定位”;
打破
案例ARTrackingStateReason.ARTrackingStateReason无:
arTrackingStatus=“”;
打破
}
}
/// 
///确定当前照明条件是否适合该区域
/// 
///光估计。
公共照明(浮光灯)
{
如果(估计值小于100){
arTrackingStatus=“照明变暗”;
}
}

希望能有所帮助……

你说得再清楚不过了!完美的解决方案。非常感谢(很抱歉延迟回复)