// Position a Trackable relative to the Camera. protected void PositionTrackable(TrackableBehaviour trackableBehaviour, Camera arCamera, QCARManager.PoseData camToTargetPose) { trackableBehaviour.transform.position = arCamera.transform.TransformPoint(camToTargetPose.position); trackableBehaviour.transform.rotation = arCamera.transform.rotation * camToTargetPose.orientation * Quaternion.AngleAxis(270, Vector3.left); }
// Position the camera relative to a Trackable. protected void PositionCamera(TrackableBehaviour trackableBehaviour, Camera arCamera, QCARManager.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, QCARManager.TrackableData[] trackableDataArray, int originTrackableID) { if (mActiveDataSet == null) { return; } foreach (QCARManager.TrackableData trackableData in trackableDataArray) { // For each Trackable data struct from native DataSetTrackableBehaviour trackableBehaviour; if (mActiveDataSet.TryGetTrackableByID(trackableData.id, out trackableBehaviour)) { // 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) && trackableBehaviour.enabled) { // The Trackable object is visible and enabled, // move it into position in relation to the camera // (which we moved earlier) PositionTrackable(trackableBehaviour, arCamera, trackableData.pose); } } } // Update each Trackable // Do this once all Trackables have been moved into place foreach (QCARManager.TrackableData trackableData in trackableDataArray) { DataSetTrackableBehaviour trackableBehaviour; if (mActiveDataSet.TryGetTrackableByID(trackableData.id, out trackableBehaviour)) { if (trackableBehaviour.enabled) { trackableBehaviour.OnTrackerUpdate( trackableData.status); } } } }
public void UpdateCameraPose(Camera arCamera, QCARManager.TrackableData[] trackableDataArray, int originTrackableID) { if (mActiveDataSet == null) { return; } // If there is a World Center Trackable use it to position the camera. if (originTrackableID >= 0) { foreach (QCARManager.TrackableData trackableData in trackableDataArray) { if (trackableData.id == originTrackableID) { if (trackableData.status == TrackableBehaviour.Status.DETECTED || trackableData.status == TrackableBehaviour.Status.TRACKED) { DataSetTrackableBehaviour originTrackable = null; if (mActiveDataSet.TryGetTrackableByID(originTrackableID, out originTrackable)) { if (originTrackable.enabled) { PositionCamera(originTrackable, arCamera, trackableData.pose); } } } break; } } } }