/// <summary> /// Updates the HMD. /// </summary> private void UpdateHMD() { CVRSystem hmd = Hmd; if (renderPoses.Length > 0) { ETrackingResult result = renderPoses[0].eTrackingResult; VRInitializing = result == ETrackingResult.Uninitialized; VRCalibrating = result == ETrackingResult.Calibrating_InProgress || result == ETrackingResult.Calibrating_OutOfRange; VROutOfRange = result == ETrackingResult.Running_OutOfRange || result == ETrackingResult.Calibrating_OutOfRange; if (result == ETrackingResult.Running_OK) { // Get poses for each eye (left, right, center) renderPoses[0].ToMatrix(out Matrix mCenter); mCenter.ToVRPose(out VRPose center); EyesProperties[2].Pose = center; for (int i = 0; i < 2; i++) { VREye eye = EyesProperties[i]; VREyeTexture texture = eye.Texture; hmd.GetProjectionMatrix((EVREye)i, texture.NearPlane, texture.FarPlane).ToMatrix(out Matrix projection); projection.Invert(); eye.Projection = projection; hmd.GetEyeToHeadTransform((EVREye)i).ToMatrix(out Matrix mOffset); mOffset *= mCenter; mOffset.ToVRPose(out VRPose pose); eye.Pose = pose; } } } }
private void OnNewPoses(TrackedDevicePose_t[] poses) { this.eyes[0] = new SteamVR_Utils.RigidTransform(this.hmd.GetEyeToHeadTransform(EVREye.Eye_Left)); this.eyes[1] = new SteamVR_Utils.RigidTransform(this.hmd.GetEyeToHeadTransform(EVREye.Eye_Right)); for (int i = 0; i < poses.Length; i++) { bool bDeviceIsConnected = poses[i].bDeviceIsConnected; if (bDeviceIsConnected != SteamVR.connected[i]) { SteamVR_Events.DeviceConnected.Send(i, bDeviceIsConnected); } } if ((long)poses.Length > 0L) { ETrackingResult eTrackingResult = poses[(int)((UIntPtr)0)].eTrackingResult; bool flag = eTrackingResult == ETrackingResult.Uninitialized; if (flag != SteamVR.initializing) { SteamVR_Events.Initializing.Send(flag); } bool flag2 = eTrackingResult == ETrackingResult.Calibrating_InProgress || eTrackingResult == ETrackingResult.Calibrating_OutOfRange; if (flag2 != SteamVR.calibrating) { SteamVR_Events.Calibrating.Send(flag2); } bool flag3 = eTrackingResult == ETrackingResult.Running_OutOfRange || eTrackingResult == ETrackingResult.Calibrating_OutOfRange; if (flag3 != SteamVR.outOfRange) { SteamVR_Events.OutOfRange.Send(flag3); } } }
private void SetTrackingStateColor(ETrackingResult eTrackingResult) { if (_stateImage) { switch (eTrackingResult) { case ETrackingResult.Uninitialized: _stateImage.color = Color.red; break; case ETrackingResult.Calibrating_OutOfRange: _stateImage.color = Orange; break; case ETrackingResult.Calibrating_InProgress: _stateImage.color = Color.yellow; break; case ETrackingResult.Running_OutOfRange: _stateImage.color = Color.cyan; break; case ETrackingResult.Running_OK: _stateImage.color = Color.green; break; default: _stateImage.color = Color.magenta; break; } } }
private void TrackingLoop() { try { EVRInitError initError = EVRInitError.None; CVRSystem cvrSystem = OpenVR.Init(ref initError, EVRApplicationType.VRApplication_Utility); var chaperone = OpenVR.Chaperone; var quadArea = new HmdQuad_t(); chaperone.GetPlayAreaRect(ref quadArea); _playArea = quadArea.ToPlayArea(); if (initError != EVRInitError.None) { throw new InvalidOperationException($"EVR init erro: {initError}"); } while (_keepReading) { TrackedDevicePose_t[] trackedDevicePoses = new TrackedDevicePose_t[OpenVR.k_unMaxTrackedDeviceCount]; cvrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0f, trackedDevicePoses); for (uint trackedDeviceIndex = 0; trackedDeviceIndex < OpenVR.k_unMaxTrackedDeviceCount; trackedDeviceIndex++) { if (cvrSystem.IsTrackedDeviceConnected(trackedDeviceIndex)) { ETrackedDeviceClass deviceClass = cvrSystem.GetTrackedDeviceClass(trackedDeviceIndex); if (true) { VRControllerState_t controllerState = new VRControllerState_t(); cvrSystem.GetControllerState(1, ref controllerState, (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t))); ETrackingResult trackingResult = trackedDevicePoses[trackedDeviceIndex].eTrackingResult; bool trigger = controllerState.rAxis1.x > 0.9f; bool menuButton = (controllerState.ulButtonPressed & (1ul << (int)EVRButtonId.k_EButton_ApplicationMenu)) != 0; bool gripButton = (controllerState.ulButtonPressed & (1ul << (int)EVRButtonId.k_EButton_Grip)) != 0; if (trackingResult == ETrackingResult.Running_OK) { HmdMatrix34_t trackingMatrix = trackedDevicePoses[trackedDeviceIndex].mDeviceToAbsoluteTracking; Vector3 speedVector = trackedDevicePoses[trackedDeviceIndex].vVelocity.ToVelocityVector(); Vector3 position = trackingMatrix.ToPositionVector(); DeviceTrackingData trackingUpdate = new DeviceTrackingData((int)trackedDeviceIndex, deviceClass.ToString(), position, trackingMatrix.ToRotationQuaternion()); NewPoseUpdate?.Invoke(this, trackingUpdate); } } } } Thread.Sleep(UpdatedInterval); } } catch (Exception e) { Console.WriteLine($"Error: {e}"); } finally { OpenVR.Shutdown(); } }
private void OnTrackingChanged(SteamVR_Action_Skeleton0 fromAction, ETrackingResult trackingState) { if (onTrackingChanged != null) { onTrackingChanged.Invoke(this, inputSource, trackingState); } if (onTrackingChangedEvent != null) { onTrackingChangedEvent.Invoke(this, inputSource, trackingState); } }
protected virtual void OnTrackingChanged(SteamVR_Action_Pose changedAction, SteamVR_Input_Sources changedSource, ETrackingResult trackingChanged) { if (onTrackingChanged != null) { onTrackingChanged.Invoke(this, inputSource, trackingChanged); } if (onTrackingChangedEvent != null) { onTrackingChangedEvent.Invoke(this, inputSource, trackingChanged); } }
private static void SteamVr() { Console.WriteLine("Starting"); EVRInitError initError = EVRInitError.None; CVRSystem cvrSystem = OpenVR.Init(ref initError, EVRApplicationType.VRApplication_Utility); Console.WriteLine("Error: " + initError.ToString()); if (cvrSystem == null) { Console.WriteLine("Error!"); } while (true) { Thread.Sleep(1); TrackedDevicePose_t[] trackedDevicePose = new TrackedDevicePose_t[OpenVR.k_unMaxTrackedDeviceCount]; cvrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseRawAndUncalibrated, 0f, trackedDevicePose); VRControllerState_t controllerState = new VRControllerState_t(); cvrSystem.GetControllerState(1, ref controllerState, (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(VRControllerState_t))); int trigger = controllerState.rAxis1.x > 0.9f ? 1 : 0; bool topButtom = (controllerState.ulButtonPressed & (1ul << (int)EVRButtonId.k_EButton_ApplicationMenu)) != 0; TrackedDevicePose_t pose = trackedDevicePose[1]; ETrackingResult trackingResult = pose.eTrackingResult; HmdMatrix34_t hmdMatrix = pose.mDeviceToAbsoluteTracking; Position pos = new Position(hmdMatrix); Rotation rot = new Rotation(hmdMatrix); Console.WriteLine($"Position: {pos} Rotation: {rot} trigger {trigger} app {topButtom}"); foreach (Socket client in _clients.ToArray()) { try { client.Send(Encoding.ASCII.GetBytes($"S{pos.ToData()} {rot.ToData()} {trigger} {(topButtom ? 1 : 0)}E")); } catch (Exception) { _clients.Remove(client); } } } for (int i = 0; i < OpenVR.k_unMaxTrackedDeviceCount; i++) { if (cvrSystem?.IsTrackedDeviceConnected((uint)i) ?? false) { ETrackedDeviceClass deviceClass = cvrSystem.GetTrackedDeviceClass((uint)i); Console.WriteLine($"index: {i} is {deviceClass}"); } } Console.ReadLine(); OpenVR.Shutdown(); Console.WriteLine("Shut down"); Console.ReadLine(); }
private void OnNewPoses(params object[] args) { TrackedDevicePose_t[] array = (TrackedDevicePose_t[])args[0]; this.eyes[0] = new SteamVR_Utils.RigidTransform(this.hmd.GetEyeToHeadTransform(EVREye.Eye_Left)); this.eyes[1] = new SteamVR_Utils.RigidTransform(this.hmd.GetEyeToHeadTransform(EVREye.Eye_Right)); for (int i = 0; i < array.Length; i++) { bool bDeviceIsConnected = array[i].bDeviceIsConnected; if (bDeviceIsConnected != SteamVR.connected[i]) { SteamVR_Utils.Event.Send("device_connected", new object[] { i, bDeviceIsConnected }); } } if ((long)array.Length > 0L) { ETrackingResult eTrackingResult = array[(int)((UIntPtr)0)].eTrackingResult; bool flag = eTrackingResult == ETrackingResult.Uninitialized; if (flag != SteamVR.initializing) { SteamVR_Utils.Event.Send("initializing", new object[] { flag }); } bool flag2 = eTrackingResult == ETrackingResult.Calibrating_InProgress || eTrackingResult == ETrackingResult.Calibrating_OutOfRange; if (flag2 != SteamVR.calibrating) { SteamVR_Utils.Event.Send("calibrating", new object[] { flag2 }); } bool flag3 = eTrackingResult == ETrackingResult.Running_OutOfRange || eTrackingResult == ETrackingResult.Calibrating_OutOfRange; if (flag3 != SteamVR.outOfRange) { SteamVR_Utils.Event.Send("out_of_range", new object[] { flag3 }); } } }
private String GetDeviceState(ETrackingResult eTrackingResult) { switch (eTrackingResult) { case ETrackingResult.Uninitialized: return(nameof(ETrackingResult.Uninitialized)); case ETrackingResult.Calibrating_InProgress: return(nameof(ETrackingResult.Calibrating_InProgress)); case ETrackingResult.Calibrating_OutOfRange: return(nameof(ETrackingResult.Calibrating_OutOfRange)); case ETrackingResult.Running_OK: return(nameof(ETrackingResult.Running_OK)); case ETrackingResult.Running_OutOfRange: return(nameof(ETrackingResult.Running_OutOfRange)); default: return(""); } }