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