115 lines
3.6 KiB
C#
115 lines
3.6 KiB
C#
using UnityEngine;
|
|
using UnityEngine.XR;
|
|
|
|
namespace Passer.Tracking {
|
|
|
|
public class UnityXRHmd : SensorComponent {
|
|
|
|
public TrackerComponent tracker;
|
|
public Camera unityCamera;
|
|
|
|
#if pUNITYXR
|
|
public bool positionalTracking = true;
|
|
|
|
public Transform sensorTransform {
|
|
get { return this.transform; }
|
|
}
|
|
|
|
protected UnityEngine.XR.InputDevice device;
|
|
|
|
#region Start
|
|
|
|
protected override void Start() {
|
|
base.Start();
|
|
|
|
device = InputDevices.GetDeviceAtXRNode(XRNode.CenterEye);
|
|
|
|
InputDevices.deviceConnected += OnDeviceConnected;
|
|
InputDevices.deviceDisconnected += OnDeviceDisconnected;
|
|
|
|
if (this.gameObject.GetComponent<UnityEngine.SpatialTracking.TrackedPoseDriver>() == null) {
|
|
this.gameObject.AddComponent<UnityEngine.SpatialTracking.TrackedPoseDriver>();
|
|
}
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// Hmd has connected
|
|
/// </summary>
|
|
/// <param name="device">The InputDevice of the hmd</param>
|
|
protected virtual void OnDeviceConnected(UnityEngine.XR.InputDevice device) {
|
|
bool isHmd = (device.characteristics & InputDeviceCharacteristics.HeadMounted) != 0;
|
|
if (isHmd) {
|
|
this.device = device;
|
|
Show(true);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Hmd has disconnected
|
|
/// </summary>
|
|
/// This also happens when the device is no longer tracked.
|
|
/// <param name="device">The InputDevice of the hmd</param>
|
|
protected virtual void OnDeviceDisconnected(UnityEngine.XR.InputDevice device) {
|
|
bool isHmd = (device.characteristics & InputDeviceCharacteristics.HeadMounted) != 0;
|
|
if (isHmd) {
|
|
this.device = device;
|
|
Show(false);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
#endif
|
|
|
|
#region Update
|
|
|
|
public override void UpdateComponent() {
|
|
base.UpdateComponent();
|
|
|
|
status = Tracker.Status.Unavailable;
|
|
positionConfidence = 0;
|
|
rotationConfidence = 0;
|
|
#if pUNITYXR
|
|
if (device == null)
|
|
return;
|
|
|
|
status = Tracker.Status.Present;
|
|
|
|
Vector3 position;
|
|
if (positionalTracking == false) {
|
|
positionConfidence = 0;
|
|
}
|
|
else if (device.TryGetFeatureValue(CommonUsages.centerEyePosition, out position)) {
|
|
// We may get 0,0,0 as first measurement
|
|
if (position != Vector3.zero) {
|
|
transform.position = tracker.transform.TransformPoint(position);
|
|
positionConfidence = 1;
|
|
status = Tracker.Status.Tracking;
|
|
}
|
|
}
|
|
|
|
Quaternion rotation;
|
|
if (device.TryGetFeatureValue(CommonUsages.centerEyeRotation, out rotation)) {
|
|
transform.rotation = tracker.transform.rotation * rotation;
|
|
rotationConfidence = 1;
|
|
if (positionalTracking == false)
|
|
status = Tracker.Status.Tracking;
|
|
}
|
|
|
|
bool userPresent = false;
|
|
if (device.TryGetFeatureValue(CommonUsages.userPresence, out userPresent)) {
|
|
// tracking is only true when the positional tracking is working
|
|
// but when the user is not present, the tracking status is removed again
|
|
if (!userPresent)
|
|
status = Tracker.Status.Present;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
public void Show(bool _) {
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
|
|
} |