示例#1
0
        /// <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;
                    }
                }
            }
        }
示例#2
0
 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);
         }
     }
 }
示例#3
0
        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;
                }
            }
        }
示例#4
0
        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();
            }
        }
示例#5
0
 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);
     }
 }
示例#7
0
        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();
        }
示例#8
0
 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("");
            }
        }