/************************************************************************************
|
|
Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
|
|
|
Licensed under the Oculus Utilities SDK License Version 1.31 (the "License"); you may not use
|
|
the Utilities 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/utilities-1.31
|
|
|
|
Unless required by applicable law or agreed to in writing, the Utilities 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;
|
|
using VR = UnityEngine.VR;
|
|
|
|
/// <summary>
|
|
/// An infrared camera that tracks the position of a head-mounted display.
|
|
/// </summary>
|
|
public class OVRTracker
|
|
{
|
|
/// <summary>
|
|
/// The (symmetric) visible area in front of the sensor.
|
|
/// </summary>
|
|
public struct Frustum
|
|
{
|
|
/// <summary>
|
|
/// The sensor's minimum supported distance to the HMD.
|
|
/// </summary>
|
|
public float nearZ;
|
|
/// <summary>
|
|
/// The sensor's maximum supported distance to the HMD.
|
|
/// </summary>
|
|
public float farZ;
|
|
/// <summary>
|
|
/// The sensor's horizontal and vertical fields of view in degrees.
|
|
/// </summary>
|
|
public Vector2 fov;
|
|
}
|
|
|
|
/// <summary>
|
|
/// If true, a sensor is attached to the system.
|
|
/// </summary>
|
|
public bool isPresent
|
|
{
|
|
get {
|
|
if (!OVRManager.isHmdPresent)
|
|
return false;
|
|
|
|
return OVRPlugin.positionSupported;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
public bool isPositionTracked
|
|
{
|
|
get {
|
|
return OVRPlugin.positionTracked;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// If this is true and a sensor is available, the system will use position tracking when isPositionTracked is also true.
|
|
/// </summary>
|
|
public bool isEnabled
|
|
{
|
|
get {
|
|
if (!OVRManager.isHmdPresent)
|
|
return false;
|
|
|
|
return OVRPlugin.position;
|
|
}
|
|
|
|
set {
|
|
if (!OVRManager.isHmdPresent)
|
|
return;
|
|
|
|
OVRPlugin.position = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the number of sensors currently connected to the system.
|
|
/// </summary>
|
|
public int count
|
|
{
|
|
get {
|
|
int count = 0;
|
|
|
|
for (int i = 0; i < (int)OVRPlugin.Tracker.Count; ++i)
|
|
{
|
|
if (GetPresent(i))
|
|
count++;
|
|
}
|
|
|
|
return count;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the sensor's viewing frustum.
|
|
/// </summary>
|
|
public Frustum GetFrustum(int tracker = 0)
|
|
{
|
|
if (!OVRManager.isHmdPresent)
|
|
return new Frustum();
|
|
|
|
return OVRPlugin.GetTrackerFrustum((OVRPlugin.Tracker)tracker).ToFrustum();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the sensor's pose, relative to the head's pose at the time of the last pose recentering.
|
|
/// </summary>
|
|
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)
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// If true, the pose of the sensor is valid and is ready to be queried.
|
|
/// </summary>
|
|
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;
|
|
}
|
|
}
|
|
}
|