public static ViveTrackerComponent NewViveTracker(HumanoidControl humanoid, uint trackerId) { Transform viveTrackerTransform = AddViveTracker(humanoid, (int)trackerId); ViveTrackerComponent viveTracker = viveTrackerTransform.GetComponent <ViveTrackerComponent>(); return(viveTracker); }
public static Transform AddViveTracker(HumanoidControl humanoid, int trackerId = -1) { GameObject trackerPrefab = Resources.Load(resourceName) as GameObject; GameObject trackerObject = (trackerPrefab == null) ? new GameObject(resourceName) : Object.Instantiate(trackerPrefab); trackerObject.name = resourceName; ViveTrackerComponent trackerComponent = trackerObject.GetComponent <ViveTrackerComponent>(); if (trackerComponent == null) { trackerComponent = trackerObject.AddComponent <ViveTrackerComponent>(); } if (trackerId != -1) { trackerComponent.trackerId = trackerId; } #if hSTEAMVR trackerObject.transform.parent = humanoid.steam.trackerTransform; trackerComponent.StartComponent(humanoid.steam.trackerTransform); #elif hOPENVR trackerObject.transform.parent = humanoid.openVR.trackerTransform; trackerComponent.StartComponent(humanoid.openVR.trackerTransform); #endif return(trackerObject.transform); }
protected override void CreateSensorTransform() { CreateSensorTransform("Vive Tracker", defaultLocalTrackerPosition, defaultLocalTrackerRotation); ViveTrackerComponent viveTracker = sensorTransform.GetComponent <ViveTrackerComponent>(); if (viveTracker == null) { sensorTransform.gameObject.AddComponent <ViveTrackerComponent>(); } }
private static void CheckSensorComponent(FootTarget footTarget) { if (footTarget.viveTracker.sensorTransform == null) { return; } ViveTrackerComponent sensorComponent = footTarget.viveTracker.sensorTransform.GetComponent <ViveTrackerComponent>(); if (sensorComponent == null) { sensorComponent = footTarget.viveTracker.sensorTransform.gameObject.AddComponent <ViveTrackerComponent>(); } }
protected virtual void OnNewSensor(uint sensorId) { Passer.ETrackedDeviceClass deviceClass = Passer.OpenVR.System.GetTrackedDeviceClass(sensorId); switch (deviceClass) { case Passer.ETrackedDeviceClass.HMD: hmd = FindHmd(sensorId); if (hmd == null) { hmd = SteamVrHmdComponent.NewHmd(humanoid, (int)sensorId); } break; case Passer.ETrackedDeviceClass.TrackingReference: SubTracker subTracker = FindLighthouse(sensorId); if (subTracker == null) { subTracker = NewLighthouse(humanoid, sensorId); subTrackers.Add(subTracker); } break; case Passer.ETrackedDeviceClass.Controller: SteamVrControllerComponent controller = FindController(sensorId); if (controller == null) { controller = SteamVrControllerComponent.NewController(humanoid, (int)sensorId); controllers.Add(controller); } break; #if hVIVETRACKER case Passer.ETrackedDeviceClass.GenericTracker: ViveTrackerComponent viveTracker = FindViveTracker(sensorId); if (viveTracker == null) { viveTracker = ViveTracker.NewViveTracker(humanoid, sensorId); viveTrackers.Add(viveTracker); } break; #endif default: break; } }
public override void Start(HumanoidControl _humanoid, Transform targetTransform) { base.Start(_humanoid, targetTransform); #if hSTEAMVR tracker = hipsTarget.humanoid.steam; #elif hOPENVR tracker = hipsTarget.humanoid.openVR; #endif if (sensorTransform != null) { viveTracker = sensorTransform.GetComponent <ViveTrackerComponent>(); if (viveTracker != null) { viveTracker.StartComponent(tracker.trackerTransform); } } }
protected override void CreateSensorTransform() { if (footTarget.isLeft) { CreateSensorTransform("Vive Tracker", defaultLeftTrackerPosition, defaultLeftTrackerRotation); } else { CreateSensorTransform("Vive Tracker", defaultRightTrackerPosition, defaultRightTrackerRotation); } ViveTrackerComponent viveTracker = sensorTransform.GetComponent <ViveTrackerComponent>(); if (viveTracker == null) { sensorTransform.gameObject.AddComponent <ViveTrackerComponent>(); } }
public int FindHeadTracker() { #if hSTEAMVR List <ViveTrackerComponent> viveTrackers = headTarget.humanoid.steam.viveTrackers; #elif hOPENVR List <ViveTrackerComponent> viveTrackers = headTarget.humanoid.openVR.viveTrackers; #endif ViveTrackerComponent foundTracker = null; // Finds a tracker at least 1.2m above the ground foreach (ViveTrackerComponent viveTracker in viveTrackers) { // Is it tracking?? if (viveTracker.positionConfidence <= 0) { continue; } Vector3 sensorPos = viveTracker.transform.position; float sensorTrackingHeight = sensorPos.y - tracker.trackerTransform.position.y; if (sensorTrackingHeight > 1.2F) // head is more than 1.2 meter above the ground { foundTracker = viveTracker; } } if (foundTracker != null) { int trackerId = foundTracker.trackerId; viveTrackers.Remove(foundTracker); Object.Destroy(foundTracker.gameObject); return(trackerId); } else { return(-1); } }
protected int FindTorsoTracker() { #if hSTEAMVR List <ViveTrackerComponent> viveTrackers = hipsTarget.humanoid.steam.viveTrackers; // We need the hmd if (hipsTarget.humanoid.steam.hmd == null) { return(-1); } Transform hmdTransform = hipsTarget.humanoid.steam.hmd.transform; #elif hOPENVR List <ViveTrackerComponent> viveTrackers = hipsTarget.humanoid.openVR.viveTrackers; // We need the hmd if (hipsTarget.humanoid.openVR.hmd == null) { return(-1); } Transform hmdTransform = hipsTarget.humanoid.openVR.hmd.transform; #endif ViveTrackerComponent foundTracker = null; // Finds a tracker between 0.3 and 1 meter from the ground and 0.2m around hmd // HMD is no good to final solution, because it could be that a Vive Tracker is used on the head foreach (ViveTrackerComponent viveTracker in viveTrackers) { // Is it tracking?? if (viveTracker.positionConfidence <= 0) { continue; } Vector3 sensorPos = viveTracker.transform.position; // Get HMD rotation projected on XZ plane Vector3 hmdForward = new Vector3(hmdTransform.forward.x, 0, hmdTransform.forward.z); Quaternion hmdFwdRotation = Quaternion.LookRotation(hmdForward); // Get Vive tracker local to the HMD position Vector3 sensorLocalPos = Quaternion.Inverse(hmdFwdRotation) * (sensorPos - hmdTransform.position); Vector2 sensorLocalPosPlane = new Vector2(sensorLocalPos.x, sensorLocalPos.z); float sensorTrackingHeight = sensorPos.y - tracker.trackerTransform.position.y; if (sensorTrackingHeight > 0.3F && sensorTrackingHeight < 1.2F && sensorLocalPosPlane.magnitude < 0.2F) { foundTracker = viveTracker; } } if (foundTracker != null) { int trackerId = foundTracker.trackerId; viveTrackers.Remove(foundTracker); Object.Destroy(foundTracker.gameObject); return(trackerId); } else { return(-1); } }
public int FindFootTracker(bool isLeft) { Debug.Log("Seachting " + footTarget); #if hSTEAMVR List <ViveTrackerComponent> viveTrackers = footTarget.humanoid.steam.viveTrackers; // We need the hmd if (footTarget.humanoid.steam.hmd == null) { return(-1); } Transform hmdTransform = footTarget.humanoid.steam.hmd.transform; #elif hOPENVR List <ViveTrackerComponent> viveTrackers = footTarget.humanoid.openVR.viveTrackers; // We need the hmd if (footTarget.humanoid.openVR.hmd == null) { return(-1); } Transform hmdTransform = footTarget.humanoid.openVR.hmd.transform; #endif ViveTrackerComponent foundTracker = null; Vector3 outermostLocalPos = Vector3.zero; foreach (ViveTrackerComponent viveTracker in viveTrackers) { // Is it tracking?? if (viveTracker.positionConfidence <= 0) { continue; } Vector3 sensorPos = viveTracker.transform.position; // Get HMD rotation projected on XZ plane Vector3 hmdForward = new Vector3(hmdTransform.forward.x, 0, hmdTransform.forward.z); Quaternion hmdFwdRotation = Quaternion.LookRotation(hmdForward); // Get Vive tracker local to the HMD position Vector3 sensorLocalPos = Quaternion.Inverse(hmdFwdRotation) * (sensorPos - hmdTransform.position); Vector2 sensorLocalPosPlane = new Vector2(sensorLocalPos.x, sensorLocalPos.z); // foot is no more than 20cm above ground and 0.5m around hmd float sensorTrackingHeight = sensorPos.y - tracker.trackerTransform.position.y; if (sensorTrackingHeight < 0.2F && sensorLocalPosPlane.magnitude < 0.5F && (isLeft && sensorLocalPos.x < outermostLocalPos.x || !isLeft && sensorLocalPos.x > outermostLocalPos.x)) { foundTracker = viveTracker; outermostLocalPos = sensorLocalPos; } } if (footTarget.otherFoot.viveTracker.viveTracker == foundTracker) { Debug.Log("Tracker already on other foot!"); // already assigned to the other foot footTarget.otherFoot.viveTracker.viveTracker.trackerId = -1; } if (foundTracker != null) { int trackerId = foundTracker.trackerId; viveTrackers.Remove(foundTracker); Object.Destroy(foundTracker.gameObject); return(trackerId); } else { return(-1); } }
private void OnEnable() { sensorComponent = (ViveTrackerComponent)target; }
protected int FindArmTracker(bool isLeft) { #if hSTEAMVR List <ViveTrackerComponent> viveTrackers = handTarget.humanoid.steam.viveTrackers; // We need the hmd to find the arm if (handTarget.humanoid.steam.hmd == null) { return(-1); } Transform hmdTransform = handTarget.humanoid.steam.hmd.transform; #elif hOPENVR List <ViveTrackerComponent> viveTrackers = handTarget.humanoid.openVR.viveTrackers; // We need the hmd to find the arm if (handTarget.humanoid.openVR.hmd == null) { return(-1); } Transform hmdTransform = handTarget.humanoid.openVR.hmd.transform; #endif ViveTrackerComponent foundTracker = null; // Finds the left or rightmost tracker, at least 0.2m left or right of the HMD Vector3 outermostLocalPos = new Vector3(isLeft ? -0.1F : 0.1F, 0, 0); foreach (ViveTrackerComponent viveTracker in viveTrackers) { // Is it tracking?? if (viveTracker.positionConfidence <= 0) { continue; } Vector3 sensorPos = viveTracker.transform.position; // Get HMD rotation projected on XZ plane Vector3 hmdForward = new Vector3(hmdTransform.forward.x, 0, hmdTransform.forward.z); Quaternion hmdFwdRotation = Quaternion.LookRotation(hmdForward); // Get Vive tracker local to the HMD position Vector3 sensorLocalPos = Quaternion.Inverse(hmdFwdRotation) * (sensorPos - hmdTransform.position); if ((isLeft && sensorLocalPos.x < outermostLocalPos.x && sensorLocalPos.x < -0.2F) || (!isLeft && sensorLocalPos.x > outermostLocalPos.x && sensorLocalPos.x > 0.2F)) { foundTracker = viveTracker; outermostLocalPos = sensorLocalPos; } } if (foundTracker != null) { int trackerId = foundTracker.trackerId; viveTrackers.Remove(foundTracker); Object.Destroy(foundTracker.gameObject); return(trackerId); } else { return(-1); } }