示例#1
0
    // Unmarshal and process the tracking data
    private void UpdateTrackers()
    {
        if (Application.isEditor)
        {
            UpdateTrackablesEditor();
            return;
        }

        // Unmarshal the trackable data
        // Take our array of unmanaged data from native and create an array of
        // TrackableData structures to work with (one per trackable, regardless
        // of whether or not that trackable is visible this frame).
        for (int i = 0; i < mAbsoluteNumTrackables; i++)
        {
            IntPtr trackablePtr = new IntPtr(mTrackablePtr.ToInt32() + i *
                                             Marshal.SizeOf(typeof(TrackableData)));
            TrackableData trackableData = (TrackableData)
                                          Marshal.PtrToStructure(trackablePtr, typeof(TrackableData));
            mTrackableDataArray[i] = trackableData;
        }

        // Add newly found Trackables to the queue, remove lost ones
        // We keep track of the order in which Trackables become visible for the
        // AUTO World Center mode. This keeps the camera from jumping around in the
        // scene too much.
        foreach (TrackableData trackableData in mTrackableDataArray)
        {
            // We found a trackable (or set of Trackables) that match this id
            if ((trackableData.status == TrackableBehaviour.Status.DETECTED ||
                 trackableData.status ==
                 TrackableBehaviour.Status.TRACKED))
            {
                if (!mTrackableFoundQueue.Contains(trackableData.id))
                {
                    // The trackable just became visible, add it to the queue
                    mTrackableFoundQueue.AddLast(trackableData.id);
                }
            }
            else
            {
                if (mTrackableFoundQueue.Contains(trackableData.id))
                {
                    // The trackable just disappeared, remove it from the queue
                    mTrackableFoundQueue.Remove(trackableData.id);
                }
            }
        }

        ImageTracker imageTracker = (ImageTracker)
                                    TrackerManager.Instance.GetTracker(Tracker.Type.IMAGE_TRACKER);
        MarkerTracker markerTracker = (MarkerTracker)
                                      TrackerManager.Instance.GetTracker(Tracker.Type.MARKER_TRACKER);

        // The "scene origin" is only used in world center mode auto or user.
        int originTrackableID = -1;

        if (mWorldCenterMode == QCARBehaviour.WorldCenterMode.USER &&
            mWorldCenter != null)
        {
            originTrackableID = mWorldCenter.TrackableID;
        }
        else if (mWorldCenterMode == QCARBehaviour.WorldCenterMode.AUTO)
        {
            imageTracker.RemoveDisabledTrackablesFromQueue(ref mTrackableFoundQueue);
            markerTracker.RemoveDisabledTrackablesFromQueue(ref mTrackableFoundQueue);
            if (mTrackableFoundQueue.Count > 0)
            {
                originTrackableID = mTrackableFoundQueue.First.Value;
            }
        }

        // Update the Camera pose before Trackable poses are updated.
        imageTracker.UpdateCameraPose(mARCamera, mTrackableDataArray, originTrackableID);
        markerTracker.UpdateCameraPose(mARCamera, mTrackableDataArray, originTrackableID);

        // Update the Trackable poses.
        imageTracker.UpdateTrackablePoses(mARCamera, mTrackableDataArray, originTrackableID);
        markerTracker.UpdateTrackablePoses(mARCamera, mTrackableDataArray, originTrackableID);

        imageTracker.UpdateVirtualButtons(mAbsoluteNumVirtualButtons, mVirtualButtonPtr);
    }