示例#1
0
        public static ViveTrackerComponent NewViveTracker(HumanoidControl humanoid, uint trackerId)
        {
            Transform            viveTrackerTransform = AddViveTracker(humanoid, (int)trackerId);
            ViveTrackerComponent viveTracker          = viveTrackerTransform.GetComponent <ViveTrackerComponent>();

            return(viveTracker);
        }
示例#2
0
        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>();
            }
        }
示例#4
0
            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>();
                }
            }
示例#5
0
        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);
                }
            }
        }
示例#7
0
        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>();
            }
        }
示例#8
0
        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);
            }
        }
示例#10
0
        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);
            }
        }
示例#11
0
 private void OnEnable()
 {
     sensorComponent = (ViveTrackerComponent)target;
 }
示例#12
0
        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);
            }
        }