Beispiel #1
0
        public override void UpdateComponent()
        {
#if hSTEAMVR
            if (SteamDevice.status == Status.Unavailable)
            {
                status = Status.Unavailable;
            }

            if (SteamDevice.GetConfidence(trackerId) == 0)
            {
                status             = SteamDevice.IsPresent(trackerId) ? Status.Present : Status.Unavailable;
                positionConfidence = 0;
                rotationConfidence = 0;
                gameObject.SetActive(false);
                return;
            }

            status = Status.Tracking;
            Vector3    localSensorPosition = Target.ToVector3(SteamDevice.GetPosition(trackerId));
            Quaternion localSensorRotation = Target.ToQuaternion(SteamDevice.GetRotation(trackerId)) * Quaternion.Euler(270, 0, 180);
            transform.position = trackerTransform.TransformPoint(localSensorPosition);
            transform.rotation = trackerTransform.rotation * localSensorRotation;

            positionConfidence = SteamDevice.GetConfidence(trackerId);
            rotationConfidence = SteamDevice.GetConfidence(trackerId) * 0.6F;
#elif hOPENVR
            if (OpenVRDevice.status == Status.Unavailable)
            {
                status = Status.Unavailable;
            }

            if (OpenVRDevice.GetConfidence(trackerId) == 0)
            {
                status             = OpenVRDevice.IsPresent(trackerId) ? Status.Present : Status.Unavailable;
                positionConfidence = 0;
                rotationConfidence = 0;
                gameObject.SetActive(false);
                return;
            }

            status = Status.Tracking;
            Vector3    localSensorPosition = Target.ToVector3(OpenVRDevice.GetPosition(trackerId));
            Quaternion localSensorRotation = Target.ToQuaternion(OpenVRDevice.GetRotation(trackerId)) * Quaternion.Euler(270, 0, 180);
            transform.position = trackerTransform.TransformPoint(localSensorPosition);
            transform.rotation = trackerTransform.rotation * localSensorRotation;

            positionConfidence = OpenVRDevice.GetConfidence(trackerId);
            rotationConfidence = OpenVRDevice.GetConfidence(trackerId);
#endif

            gameObject.SetActive(true);

            Passer.VRControllerState_t controllerState = new Passer.VRControllerState_t();
            var  system = Passer.OpenVR.System;
            uint controllerStateSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(Passer.VRControllerState_t));
            bool newControllerState  = system.GetControllerState((uint)trackerId, ref controllerState, controllerStateSize);
            if (system != null && newControllerState)
            {
                UpdateInput(controllerState);
            }
        }
Beispiel #2
0
        public bool GetDevices(Dictionary <string, TrackedDevice> devices)
        {
            devices.Clear();
            bool changeDetected = false;

            _openVRFacade.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, _poses);

            for (uint i = 0; i < _poses.Length; i++)
            {
                OpenVRDevice        device = _devices[i];
                TrackedDevicePose_t pose   = _poses[i];

                DeviceUse use = DeviceUse.Unknown;

                string id          = device.id;
                bool   isConnected = device.isConnected;
                string modelName   = device.modelName;

                if (pose.bDeviceIsConnected != isConnected)
                {
                    isConnected = pose.bDeviceIsConnected;

                    if (pose.bDeviceIsConnected)
                    {
                        string serialNumber = _openVRFacade.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_SerialNumber_String);

                        modelName = _openVRFacade.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_ModelNumber_String);
                        id        = string.Concat(modelName ?? "Unknown", " ", (uint)serialNumber?.GetHashCode(), "@", i);

                        _logger.Info($"Device '{id}' connected");
                    }
                    else
                    {
                        _logger.Info($"Device '{id}' disconnected");

                        id        = null;
                        modelName = null;
                    }

                    changeDetected = true;
                }

                if (!isConnected)
                {
                    _devices[i] = default;
                    continue;
                }

                ETrackedDeviceClass    deviceClass    = _openVRFacade.GetTrackedDeviceClass(i);
                ETrackedControllerRole controllerRole = _openVRFacade.GetControllerRoleForTrackedDeviceIndex(i);
                string role = _openVRFacade.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_ControllerType_String);

                if (deviceClass != device.deviceClass)
                {
                    _logger.Trace($"Device '{id}' class changed from '{device.deviceClass}' to '{deviceClass}'");

                    changeDetected = true;
                }

                if (controllerRole != device.controllerRole)
                {
                    _logger.Trace($"Device '{id}' controller role changed from '{device.controllerRole}' to '{controllerRole}'");

                    changeDetected = true;
                }

                if (role != device.role)
                {
                    if (role == null)
                    {
                        _logger.Trace($"Device '{id}' role unset from '{device.role}'");
                    }
                    else if (device.role == null)
                    {
                        _logger.Trace($"Device '{id}' role set to '{role}'");
                    }
                    else
                    {
                        _logger.Trace($"Device '{id}' role changed from '{device.role}' to '{role}'");
                    }

                    changeDetected = true;
                }

                switch (deviceClass)
                {
                case ETrackedDeviceClass.HMD:
                    use = DeviceUse.Head;
                    break;

                case ETrackedDeviceClass.Controller:
                    switch (controllerRole)
                    {
                    case ETrackedControllerRole.LeftHand:
                        use = DeviceUse.LeftHand;
                        break;

                    case ETrackedControllerRole.RightHand:
                        use = DeviceUse.RightHand;
                        break;
                    }

                    break;

                case ETrackedDeviceClass.GenericTracker:
                    switch (role)
                    {
                    case "vive_tracker_waist":
                        use = DeviceUse.Waist;
                        break;

                    case "vive_tracker_left_foot":
                        use = DeviceUse.LeftFoot;
                        break;

                    case "vive_tracker_right_foot":
                        use = DeviceUse.RightFoot;
                        break;
                    }

                    break;
                }

                bool isTracking = pose.bPoseIsValid && kValidTrackingResults.Contains(pose.eTrackingResult);

                if (device.isTracking != isTracking)
                {
                    if (isTracking)
                    {
                        _logger.Info($"Acquired tracking of device '{id}'");
                    }
                    else
                    {
                        _logger.Info($"Lost tracking of device '{id}'");
                    }

                    changeDetected = true;
                }

                Vector3    position = Vector3.zero;
                Quaternion rotation = Quaternion.identity;

                if (isTracking)
                {
                    _openVRFacade.GetPositionAndRotation(pose.mDeviceToAbsoluteTracking, out position, out rotation);

                    // Driver4VR rotation correction
                    if (role.StartsWith("d4vr_tracker_") && (use == DeviceUse.LeftFoot || use == DeviceUse.RightFoot))
                    {
                        rotation *= Quaternion.Euler(-90, 180, 0);
                    }

                    // KinectToVR rotation correction
                    if (role == "kinect_device")
                    {
                        if (use == DeviceUse.Waist)
                        {
                            rotation *= Quaternion.Euler(-90, 180, 0);
                        }

                        if (use == DeviceUse.LeftFoot || use == DeviceUse.RightFoot)
                        {
                            rotation *= Quaternion.Euler(0, 180, 0);
                        }
                    }
                }

                _devices[i] = new OpenVRDevice(id, isConnected, isTracking, controllerRole, deviceClass, modelName, role);
                devices.Add(id, new TrackedDevice(id, use, isTracking, position, rotation));
            }

            return(changeDetected);
        }
Beispiel #3
0
        public void GetDevices(Dictionary <string, TrackedDevice> devices)
        {
            devices.Clear();
            bool changeDetected = false;

            _openVRFacade.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, _poses);

            for (uint i = 0; i < _poses.Length; i++)
            {
                DeviceUse use = DeviceUse.Unknown;

                bool   isConnected  = _devices[i].isConnected;
                string modelName    = _devices[i].modelName;
                string serialNumber = _devices[i].serialNumber;

                ETrackedDeviceClass    deviceClass    = _openVRFacade.GetTrackedDeviceClass(i);
                ETrackedControllerRole controllerRole = _openVRFacade.GetControllerRoleForTrackedDeviceIndex(i);
                string role = _openVRFacade.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_ControllerType_String);

                if (_poses[i].bDeviceIsConnected != isConnected)
                {
                    isConnected = _poses[i].bDeviceIsConnected;

                    if (_poses[i].bDeviceIsConnected)
                    {
                        modelName    = _openVRFacade.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_ModelNumber_String);
                        serialNumber = _openVRFacade.GetStringTrackedDeviceProperty(i, ETrackedDeviceProperty.Prop_SerialNumber_String);

                        _logger.Info($"Device '{modelName}' (class '{deviceClass}', serial number '{serialNumber}') connected at index {i}");
                    }
                    else
                    {
                        _logger.Info($"Device '{modelName}' (class '{deviceClass}', serial number '{serialNumber}') disconnected from index {i}");

                        modelName    = null;
                        serialNumber = null;
                    }

                    changeDetected = true;
                }

                if (deviceClass != _devices[i].deviceClass)
                {
                    _logger.Trace($"Device '{serialNumber}' class changed from '{_devices[i].deviceClass}' to '{deviceClass}'");

                    changeDetected = true;
                }

                if (controllerRole != _devices[i].controllerRole)
                {
                    _logger.Trace($"Device '{serialNumber}' role changed from '{_devices[i].controllerRole}' to '{controllerRole}'");

                    changeDetected = true;
                }

                if (role != _devices[i].role)
                {
                    if (role == null)
                    {
                        _logger.Trace($"Device '{serialNumber}' role unset from '{_devices[i].role}'");
                    }
                    else if (_devices[i].role == null)
                    {
                        _logger.Trace($"Device '{serialNumber}' role set to '{role}'");
                    }
                    else
                    {
                        _logger.Trace($"Device '{serialNumber}' role changed from '{_devices[i].role}' to '{role}'");
                    }

                    changeDetected = true;
                }

                switch (deviceClass)
                {
                case ETrackedDeviceClass.HMD:
                    use = DeviceUse.Head;
                    break;

                case ETrackedDeviceClass.Controller:
                    switch (controllerRole)
                    {
                    case ETrackedControllerRole.LeftHand:
                        use = DeviceUse.LeftHand;
                        break;

                    case ETrackedControllerRole.RightHand:
                        use = DeviceUse.RightHand;
                        break;
                    }

                    break;

                case ETrackedDeviceClass.GenericTracker:
                    switch (role)
                    {
                    case "vive_tracker_waist":
                        use = DeviceUse.Waist;
                        break;

                    case "vive_tracker_left_foot":
                        use = DeviceUse.LeftFoot;
                        break;

                    case "vive_tracker_right_foot":
                        use = DeviceUse.RightFoot;
                        break;
                    }

                    break;
                }

                bool isTracking = _poses[i].bPoseIsValid && _validTrackingResults.Contains(_poses[i].eTrackingResult);

                if (_devices[i].isTracking != isTracking)
                {
                    if (isTracking)
                    {
                        _logger.Info($"Acquired tracking of device '{serialNumber}'");
                    }
                    else
                    {
                        _logger.Info($"Lost tracking of device '{serialNumber}'");
                    }

                    changeDetected = true;
                }

                Vector3    position = Vector3.zero;
                Quaternion rotation = Quaternion.identity;

                if (isTracking)
                {
                    position = _openVRFacade.GetPosition(_poses[i].mDeviceToAbsoluteTracking);
                    rotation = _openVRFacade.GetRotation(_poses[i].mDeviceToAbsoluteTracking);

                    // Driver4VR rotation correction
                    if (role.StartsWith("d4vr_tracker_") && (use == DeviceUse.LeftFoot || use == DeviceUse.RightFoot))
                    {
                        rotation *= Quaternion.Euler(-90, 180, 0);
                    }

                    // KinectToVR rotation correction
                    if (role == "kinect_device")
                    {
                        if (use == DeviceUse.Waist)
                        {
                            rotation *= Quaternion.Euler(-90, 180, 0);
                        }

                        if (use == DeviceUse.LeftFoot || use == DeviceUse.RightFoot)
                        {
                            rotation *= Quaternion.Euler(0, 180, 0);
                        }
                    }
                }

                _devices[i] = new OpenVRDevice(isConnected, isTracking, controllerRole, deviceClass, modelName, serialNumber, role);

                if (isConnected)
                {
                    devices.Add(serialNumber, new TrackedDevice(serialNumber, use, isTracking, position, rotation));
                }
            }

            if (changeDetected)
            {
                devicesChanged?.Invoke();
            }
        }