检查 ARCamera 是否第一次检测到标记和 "spawn" 3d 对象

Check if ARCamera first time detect the marker and "spawn" the 3d object

我正在尝试制作一个简单的 AR 应用程序,我尝试制作的应用程序的流程是,相机检测第一个标记 > 做某事,相机检测第二个标记 > 做一些不同的事情

问题是我已经用我能想到的关键字组合进行了谷歌搜索,而且我也在寻找文档,但我找不到任何可以帮助解决我的问题的东西

虽然我最初只是在所述标记上使用脚本并将 "do something" 放在 void OnEnable 上,但无论如何该对象都是启用的,所以它没用

谁能借我一根绳子?

DefaultTrackingEventHandler 是处理跟踪的脚本。在多个标记的示例场景中,它附加到 ImageTarget。

该脚本注册到 TrackableBehaviour 并通过 OnTrackingFound/Lost 方法传播跟踪 found/lost。

在示例场景中,这些方法收集了子对象的碰撞器和渲染器以及enables/disables。

您可以做的是将信息进一步传播给其他听众。在这种情况下,您可以启用运行更新检查条件直到满足条件的脚本,并禁用脚本和匹配的可跟踪行为。

public class DefaultTrackableEventHandler : MonoBehaviour,
                                            ITrackableEventHandler
{
    private TrackableBehaviour mTrackableBehaviour;
    [SerializedField] private MyConditionClass actionMb = null;
    protected virtual void Start()
    {
        mTrackableBehaviour = GetComponent<TrackableBehaviour>();
        if (mTrackableBehaviour)
        {
            mTrackableBehaviour.RegisterTrackableEventHandler(this);
        }
    }

    public void OnTrackableStateChanged(
                                    TrackableBehaviour.Status previousStatus,
                                    TrackableBehaviour.Status newStatus)
    {
        if (newStatus == TrackableBehaviour.Status.DETECTED ||
            newStatus == TrackableBehaviour.Status.TRACKED ||
            newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
        {

            OnTrackingFound();
        }
        else
        {
            OnTrackingLost();
        }
    }

    protected virtual void OnTrackingFound()
    {
        // Was already successfully done
        if(this.actionMb.ConditionMet == true){ return; }
        this.actionMb.enable = true;
    }


    protected virtual void OnTrackingLost()
    {
        // Was already successfully done
        if(this.actionMb.ConditionMet == true){ return; }
        this.actionMb.enable = false;
    }
}

public abstract class MyConditionClass : MonoBehaviour
{   
    public bool ConditionMet{ get; private set; }
    protected abstract bool CheckCondition();
    protected virtual void Update(){
        if(ConditionMet == true){ return; }
        ConditionMet = CheckCondition();
    }
}  

public class MyConditionClassForInput : MyConditionClass 
{   
    protected override bool CheckCondition(){
        return (Input.GetKeyDown(KeyCode.Space));
    }
}

所以你有一个基础 class 包含所有条件应该通用的数据,比如条件是否已经满足,如图所示。和更新 运行 条件检查。

然后你有子 class 实现条件检查(必须自抽象)。

从 8.6.7 开始,Vuforia 已将 ITrackableEventHandler 重构为基础 class DefaultTrackableEventHandler 而不是接口。

public class MyTrackableEventHandler : DefaultTrackableEventHandler
{
    ...
}

此外,回调 RegisterTrackableEventHandlerUnregisterTrackableEventHandler 也需要更新。现在使用回调方法。

private void OnEnable()
{
    _trackableBehaviour = GetComponent<TrackableBehaviour>();
    _trackableBehaviour.RegisterOnTrackableStatusChanged(OnTrackableStateChanged);
}

private void OnDisable()
{
    _trackableBehaviour.RegisterOnTrackableStatusChanged(OnTrackableStateChanged);
}

public void OnTrackableStateChanged(StatusChangeResult obj)
{

    if (obj.NewStatus == Status.DETECTED || obj.NewStatus == Status.TRACKED
        || obj.NewStatus == Status.EXTENDED_TRACKED)
    {
        OnTrackingFound();
    }
    else
        OnTrackingLost();
}