private void OnNewPoses(TrackedDevicePose_t[] poses) { if (poses == null) { return; } for (uint deviceIndex = 0; deviceIndex < poses.Length; deviceIndex++) { if (trackingReferences.ContainsKey(deviceIndex) == false) { ETrackedDeviceClass deviceClass = OpenVR.System.GetTrackedDeviceClass(deviceIndex); if (deviceClass == ETrackedDeviceClass.HMD || deviceClass == ETrackedDeviceClass.Controller || deviceClass == ETrackedDeviceClass.GenericTracker) { TrackingReferenceObject trackingReference = new TrackingReferenceObject(); trackingReference.trackedDeviceClass = deviceClass; trackingReference.gameObject = new GameObject("Tracking Reference " + deviceIndex.ToString()); trackingReference.gameObject.transform.parent = this.transform; trackingReference.trackedObject = trackingReference.gameObject.AddComponent <SteamVR_TrackedObject>(); trackingReference.trackedObject.index = (SteamVR_TrackedObject.EIndex)deviceIndex; trackingReferences.Add(deviceIndex, trackingReference); trackingReference.gameObject.SendMessage("SetDeviceIndex", (int)deviceIndex, SendMessageOptions.DontRequireReceiver); } } } }
private void OnNewPoses(TrackedDevicePose_t[] poses) { if (poses == null) { return; } for (uint deviceIndex = 0; deviceIndex < poses.Length; deviceIndex++) { if (trackingReferences.ContainsKey(deviceIndex) == false) { ETrackedDeviceClass deviceClass = OpenVR.System.GetTrackedDeviceClass(deviceIndex); if (deviceClass == ETrackedDeviceClass.TrackingReference) { TrackingReferenceObject trackingReference = new TrackingReferenceObject(); trackingReference.trackedDeviceClass = deviceClass; trackingReference.gameObject = new GameObject("Tracking Reference " + deviceIndex.ToString()); trackingReference.gameObject.transform.parent = this.transform; trackingReference.trackedObject = trackingReference.gameObject.AddComponent <SteamVR_TrackedObject>(); trackingReference.renderModel = trackingReference.gameObject.AddComponent <SteamVR_RenderModel>(); trackingReference.renderModel.createComponents = false; trackingReference.renderModel.updateDynamically = false; trackingReferences.Add(deviceIndex, trackingReference); foreach (SteamVR_RenderModel model in GetComponentsInChildren <SteamVR_RenderModel>()) { model.SetDeviceIndex((int)deviceIndex); } //trackingReference.gameObject.SendMessage("SetDeviceIndex", (int)deviceIndex, SendMessageOptions.DontRequireReceiver); } else { trackingReferences.Add(deviceIndex, new TrackingReferenceObject() { trackedDeviceClass = deviceClass }); } } } }
private void IdentifyTrackingTargets() { Debug.Log("IdentifyTrackingTargets() - start ..."); List <TrackingReferenceObject> genericTrackersFeet = new List <TrackingReferenceObject>(); foreach (KeyValuePair <uint, TrackingReferenceObject> entry in trackingReferences) { uint deviceIndex = entry.Key; TrackingReferenceObject trackingReference = entry.Value; if (trackingReference.trackedDeviceClass == ETrackedDeviceClass.HMD) { //trackingTargetHead = trackingReference.gameObject.transform; trackingTargets.Add(IK_TARGET.HEAD, trackingReference.gameObject.transform); dictSteamVRInputSources.Add(deviceIndex, SteamVR_Input_Sources.Head); } if (trackingReference.trackedDeviceClass == ETrackedDeviceClass.Controller) { if (OpenVR.System.GetControllerRoleForTrackedDeviceIndex(deviceIndex) == ETrackedControllerRole.LeftHand) { //trackingTargetHandLeft = trackingReference.gameObject.transform; trackingTargets.Add(IK_TARGET.HAND_LEFT, trackingReference.gameObject.transform); dictSteamVRInputSources.Add(deviceIndex, SteamVR_Input_Sources.LeftHand); } else if (OpenVR.System.GetControllerRoleForTrackedDeviceIndex(deviceIndex) == ETrackedControllerRole.RightHand) { //trackingTargetHandRight = trackingReference.gameObject.transform; trackingTargets.Add(IK_TARGET.HAND_RIGHT, trackingReference.gameObject.transform); dictSteamVRInputSources.Add(deviceIndex, SteamVR_Input_Sources.RightHand); } } if (trackingReference.trackedDeviceClass == ETrackedDeviceClass.GenericTracker) { // figure out which generic tracker belongs to body, left and right foot //TODO: future API might provide better access and configurability // body tracker if is it at least 50cm above ground if (trackingReference.gameObject.transform.position.y >= 0.5f) { //trackingTargetBody = trackingReference.gameObject.transform; trackingTargets.Add(IK_TARGET.HIP, trackingReference.gameObject.transform); } // else feet tracker else { genericTrackersFeet.Add(trackingReference); } } } // identify left and right foot if (genericTrackersFeet.Count != 2) { Debug.LogWarning("Could not find proper amount of trackers for feet!"); } else { Transform trackingTargetHead = trackingTargets[IK_TARGET.HEAD]; Vector3 positionToRight = trackingTargetHead.position + trackingTargetHead.right * 10; TrackingReferenceObject trackerA = genericTrackersFeet[0]; TrackingReferenceObject trackerB = genericTrackersFeet[1]; float distanceA = Vector3.Distance(trackerA.gameObject.transform.position, positionToRight); float distanceB = Vector3.Distance(trackerB.gameObject.transform.position, positionToRight); if (distanceA < distanceB) { //trackingTargetFootRight = trackerA.gameObject.transform; //trackingTargetFootLeft = trackerB.gameObject.transform; trackingTargets.Add(IK_TARGET.FOOT_RIGHT, trackerA.gameObject.transform); trackingTargets.Add(IK_TARGET.FOOT_LEFT, trackerB.gameObject.transform); dictSteamVRInputSources.Add((uint)trackerA.trackedObject.index, SteamVR_Input_Sources.RightFoot); dictSteamVRInputSources.Add((uint)trackerB.trackedObject.index, SteamVR_Input_Sources.LeftFoot); } else { //trackingTargetFootRight = trackerB.gameObject.transform; //trackingTargetFootLeft = trackerA.gameObject.transform; trackingTargets.Add(IK_TARGET.FOOT_RIGHT, trackerB.gameObject.transform); trackingTargets.Add(IK_TARGET.FOOT_LEFT, trackerA.gameObject.transform); dictSteamVRInputSources.Add((uint)trackerA.trackedObject.index, SteamVR_Input_Sources.LeftFoot); dictSteamVRInputSources.Add((uint)trackerB.trackedObject.index, SteamVR_Input_Sources.RightFoot); } } Debug.Log("IdentifyTrackingTargets() - ... done"); }