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); } }
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); }
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(); } }