/* * 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 System; using System.Runtime.InteropServices; using UnityEngine; /// /// An infrared camera that tracks the position of a head-mounted display. /// public class OVRTracker { /// /// The (symmetric) visible area in front of the sensor. /// 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. /// 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. /// 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) }; } /// /// If true, the pose of the sensor is valid and is ready to be queried. /// 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; } } 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; } } }