/// <summary> /// Position a Trackable relative to the Camera. /// </summary> protected void PositionTrackable(TrackableBehaviour trackableBehaviour, Camera arCamera, QCARManagerImpl.PoseData camToTargetPose) { trackableBehaviour.transform.position = arCamera.transform.TransformPoint(camToTargetPose.position); trackableBehaviour.transform.rotation = arCamera.transform.rotation * camToTargetPose.orientation * Quaternion.AngleAxis(270, Vector3.left); }
/// <summary> /// Position the camera relative to a Trackable. /// </summary> protected void PositionCamera(TrackableBehaviour trackableBehaviour, Camera arCamera, QCARManagerImpl.PoseData camToTargetPose) { arCamera.transform.localPosition = trackableBehaviour.transform.rotation * Quaternion.AngleAxis(90, Vector3.left) * Quaternion.Inverse(camToTargetPose.orientation) * (-camToTargetPose.position) + trackableBehaviour.transform.position; arCamera.transform.rotation = trackableBehaviour.transform.rotation * Quaternion.AngleAxis(90, Vector3.left) * Quaternion.Inverse(camToTargetPose.orientation); }
// Method used to update poses of all active Image Targets // in the scene public void UpdateTrackablePoses(Camera arCamera, QCARManagerImpl.TrackableResultData[] trackableResultDataArray, int originTrackableID) { Dictionary<int, QCARManagerImpl.TrackableResultData> trackableResults = new Dictionary<int, QCARManagerImpl.TrackableResultData>(); foreach (QCARManagerImpl.TrackableResultData trackableData in trackableResultDataArray) { // create a dictionary of all trackableResults trackableResults.Add(trackableData.id, trackableData); // For each Trackable data struct from native TrackableBehaviour trackableBehaviourBehaviour; if (mTrackableBehaviours.TryGetValue(trackableData.id, out trackableBehaviourBehaviour)) { // If this is the world center skip it, we never move the // world center Trackable in the scene if (trackableData.id == originTrackableID) { continue; } if ((trackableData.status == TrackableBehaviour.Status.DETECTED || trackableData.status == TrackableBehaviour.Status.TRACKED) && trackableBehaviourBehaviour.enabled) { // The Trackable object is visible and enabled, // move it into position in relation to the camera // (which we moved earlier) PositionTrackable(trackableBehaviourBehaviour, arCamera, trackableData.pose); } } } // Update each Trackable // Do this once all Trackables have been moved into place mActiveTrackableBehaviours.Clear(); foreach (TrackableBehaviour trackableBehaviour in mTrackableBehaviours.Values) { if (trackableBehaviour.enabled) { QCARManagerImpl.TrackableResultData trackableData; if (trackableResults.TryGetValue(trackableBehaviour.Trackable.ID, out trackableData)) { trackableBehaviour.OnTrackerUpdate(trackableData.status); } else { trackableBehaviour.OnTrackerUpdate(TrackableBehaviour.Status.NOT_FOUND); } if (trackableBehaviour.CurrentStatus == TrackableBehaviour.Status.TRACKED || trackableBehaviour.CurrentStatus == TrackableBehaviour.Status.DETECTED) { mActiveTrackableBehaviours.Add(trackableBehaviour); } } } }
// method used to update the camera pose in the scene public void UpdateCameraPose(Camera arCamera, QCARManagerImpl.TrackableResultData[] trackableResultDataArray, int originTrackableID) { // If there is a World Center Trackable use it to position the camera. if (originTrackableID >= 0) { foreach (QCARManagerImpl.TrackableResultData trackableData in trackableResultDataArray) { if (trackableData.id == originTrackableID) { if (trackableData.status == TrackableBehaviour.Status.DETECTED || trackableData.status == TrackableBehaviour.Status.TRACKED) { TrackableBehaviour trackableBehaviour; if (mTrackableBehaviours.TryGetValue(originTrackableID, out trackableBehaviour)) { if (trackableBehaviour.enabled) { PositionCamera(trackableBehaviour, arCamera, trackableData.pose); } } } break; } } } }
/// <summary> /// Update currently tracked words /// </summary> /// <param name="arCamera">Word trackables will be positioned relative to this camera</param> /// <param name="newWordData">words that have been newly detected in the last frame</param> /// <param name="wordResults">all words that are currently tracked</param> public void UpdateWords(Camera arCamera, QCARManagerImpl.WordData[] newWordData, QCARManagerImpl.WordResultData[] wordResults) { UpdateWords(newWordData, wordResults); UpdateWordResultPoses(arCamera, wordResults); }
public void UpdateWords(Camera arCamera, QCARManagerImpl.WordData[] wordData, QCARManagerImpl.WordResultData[] wordResultData) { mWordManager.UpdateWords(arCamera, wordData, wordResultData); }
private static void SetImageValues(QCARManagerImpl.ImageHeaderData imageHeader, ImageImpl image) { image.Width = imageHeader.width; image.Height = imageHeader.height; image.Stride = imageHeader.stride; image.BufferWidth = imageHeader.bufferWidth; image.BufferHeight = imageHeader.bufferHeight; image.PixelFormat = (Image.PIXEL_FORMAT)imageHeader.format; }