/* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * Licensed under the Oculus SDK License Agreement (the "License"); * you may not use the Oculus SDK except in compliance with the License, * which is provided at the time of installation or download, or which * otherwise accompanies this software in either electronic or hard copy form. * * You may obtain a copy of the License at * * https://developer.oculus.com/licenses/oculussdk/ * * Unless required by applicable law or agreed to in writing, the Oculus SDK * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using UnityEngine; /// /// Represents an infrared camera that tracks the position of a head-mounted display. /// /// /// The object is stateless and provides a convenient accessor to the tracker properties. /// Instead of new'ing an , consider using the global accessible /// via . /// [HelpURL("https://developer.oculus.com/reference/unity/latest/class_o_v_r_tracker")] public class OVRTracker { /// /// The (symmetric) visible area in front of a sensor. /// /// /// You can obtain the frustum of different trackers using . /// /// This example uses the global instance on the /// to query for the sensor's frustum and then logs the sensor's visible area: /// /// /// public struct Frustum { /// /// The sensor's minimum supported distance to the HMD. /// public float nearZ; /// /// The sensor's maximum supported distance to the HMD. /// public float farZ; /// /// The sensor's horizontal and vertical fields of view in degrees. /// public Vector2 fov; } /// /// If true, a sensor is attached to the system. /// public bool isPresent { get { if (!OVRManager.isHmdPresent) return false; return OVRPlugin.positionSupported; } } /// /// If true, the sensor is actively tracking the HMD's position. Otherwise the HMD may be temporarily occluded, the system may not support position tracking, etc. /// public bool isPositionTracked { get { return OVRPlugin.positionTracked; } } /// /// If this is true and a sensor is available, the system will use position tracking when isPositionTracked is also true. /// public bool isEnabled { get { if (!OVRManager.isHmdPresent) return false; return OVRPlugin.position; } set { if (!OVRManager.isHmdPresent) return; OVRPlugin.position = value; } } /// /// Returns the number of sensors currently connected to the system. /// public int count { get { int count = 0; for (int i = 0; i < (int)OVRPlugin.Tracker.Count; ++i) { if (GetPresent(i)) count++; } return count; } } /// /// Gets the sensor's viewing frustum. /// /// The index of the tracker. /// Returns the associated with . public Frustum GetFrustum(int tracker = 0) { if (!OVRManager.isHmdPresent) return new Frustum(); return OVRPlugin.GetTrackerFrustum((OVRPlugin.Tracker)tracker).ToFrustum(); } /// /// Gets the sensor's pose, relative to the head's pose at the time of the last pose recentering. /// /// /// If the HMD is not present (), this method returns the identity pose. /// /// The index of the tracker. /// The pose of the in tracking space, or identity if the HMD is not present. public OVRPose GetPose(int tracker = 0) { if (!OVRManager.isHmdPresent) return OVRPose.identity; OVRPose p; switch (tracker) { case 0: p = OVRPlugin.GetNodePose(OVRPlugin.Node.TrackerZero, OVRPlugin.Step.Render).ToOVRPose(); break; case 1: p = OVRPlugin.GetNodePose(OVRPlugin.Node.TrackerOne, OVRPlugin.Step.Render).ToOVRPose(); break; case 2: p = OVRPlugin.GetNodePose(OVRPlugin.Node.TrackerTwo, OVRPlugin.Step.Render).ToOVRPose(); break; case 3: p = OVRPlugin.GetNodePose(OVRPlugin.Node.TrackerThree, OVRPlugin.Step.Render).ToOVRPose(); break; default: return OVRPose.identity; } return new OVRPose() { position = p.position, orientation = p.orientation * Quaternion.Euler(0, 180, 0) }; } /// /// Gets whether the pose of the specified sensor is valid and is ready to be queried. /// /// The index of the sensor. /// Returns `true` if the pose of the specified sensor is valid; otherwise `false`. public bool GetPoseValid(int tracker = 0) { if (!OVRManager.isHmdPresent) return false; switch (tracker) { case 0: return OVRPlugin.GetNodePositionTracked(OVRPlugin.Node.TrackerZero); case 1: return OVRPlugin.GetNodePositionTracked(OVRPlugin.Node.TrackerOne); case 2: return OVRPlugin.GetNodePositionTracked(OVRPlugin.Node.TrackerTwo); case 3: return OVRPlugin.GetNodePositionTracked(OVRPlugin.Node.TrackerThree); default: return false; } } /// /// Gets whether the specified sensor is currently present. /// /// The index of the sensor. /// Returns `true` if is present; otherwise, `false`. public bool GetPresent(int tracker = 0) { if (!OVRManager.isHmdPresent) return false; switch (tracker) { case 0: return OVRPlugin.GetNodePresent(OVRPlugin.Node.TrackerZero); case 1: return OVRPlugin.GetNodePresent(OVRPlugin.Node.TrackerOne); case 2: return OVRPlugin.GetNodePresent(OVRPlugin.Node.TrackerTwo); case 3: return OVRPlugin.GetNodePresent(OVRPlugin.Node.TrackerThree); default: return false; } } }