检查ARCamera是否第一次检测到标记并且"产生" 3d对象

时间:2017-03-10 11:17:26

标签: c# unity3d vuforia

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

问题是我已经用谷歌搜索了我能想到的关键字组合,而且我也寻找文档,但我真的没有找到帮助解决我的问题

我的第一个问题是,只需在上述标记上使用一个脚本,并执行"做某事" on void OnEnable,但无论如何都要启用对象,所以它无用

谁能借给我一根绳子?

1 个答案:

答案 0 :(得分:2)

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

该脚本注册到TrackableBehaviour并通过OnTrackingFound / Lost方法传播找到/丢失的跟踪。

在示例场景中,这些方法收集子对象的对撞机和渲染器并启用/禁用。

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

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));
    }
}

因此,您有一个基类,其中包含所有条件应该共有的数据,例如是否已满足条件,如图所示。和更新运行条件检查。

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