예제 #1
0
    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);
                }
            }
        }
    }
예제 #2
0
        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
                        });
                    }
                }
            }
        }
예제 #3
0
    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");
    }