public void Update() { for (uint deviceIdx = 0; deviceIdx < OpenVR.k_unMaxTrackedDeviceCount; ++deviceIdx) { ControllerStateTracker controllerStateTracker = controllerStateTrackers[deviceIdx]; controllerStateTracker.Update(); } }
public void Update(FrameUpdateParameters updateParameters) { if (trackedDeviceIdx == UnattachedSentinel) { for (uint deviceIdx = 0; deviceIdx < OpenVR.k_unMaxTrackedDeviceCount; ++deviceIdx) { ControllerStateTracker stateTracker = controllerManager.StateTrackers[deviceIdx]; if (!stateTracker.NonMenuActive) { continue; } if (!stateTracker.IsPressed(EVRButtonId.k_EButton_Grip)) { continue; } trackedDeviceIdx = deviceIdx; TrackedDevicePose_t gamePose = updateParameters.GamePoses[deviceIdx]; Matrix controllerToWorldTransform = gamePose.mDeviceToAbsoluteTracking.Convert(); Matrix worldToControllerTransform = Matrix.Invert(controllerToWorldTransform); objectToControllerTransform = objectToWorldTransform * worldToControllerTransform; } } if (trackedDeviceIdx != UnattachedSentinel) { ControllerStateTracker stateTracker = controllerManager.StateTrackers[trackedDeviceIdx]; if (!stateTracker.NonMenuActive || !stateTracker.IsPressed(EVRButtonId.k_EButton_Grip)) { trackedDeviceIdx = UnattachedSentinel; return; } TrackedDevicePose_t gamePose = updateParameters.GamePoses[trackedDeviceIdx]; Matrix controllerToWorldTransform = gamePose.mDeviceToAbsoluteTracking.Convert(); objectToWorldTransform = objectToControllerTransform * controllerToWorldTransform; } }
public DeviceTracker(InverseKinematicsUserInterface parentInstance, ControllerStateTracker stateTracker) { this.parentInstance = parentInstance; this.stateTracker = stateTracker; }
public void Update() { for (uint deviceIdx = 0; deviceIdx < OpenVR.k_unMaxTrackedDeviceCount; ++deviceIdx) { ControllerStateTracker controllerStateTracker = controllerManager.StateTrackers[deviceIdx]; if (!controllerStateTracker.MenuActive) { continue; } uint primaryAxisIdx = 0; EVRButtonId primaryAxisButtonId = EVRButtonId.k_EButton_Axis0 + (int)primaryAxisIdx; if (controllerStateTracker.WasClicked(primaryAxisButtonId) || controllerStateTracker.WasClicked(EVRButtonId.k_EButton_A)) //k_EButton_A is the A/X button on touch { model.Press(); } if (controllerStateTracker.WasClicked(EVRButtonId.k_EButton_Grip)) { model.PressSecondary(); } EVRControllerAxisType axisType = (EVRControllerAxisType)OpenVR.System.GetInt32TrackedDeviceProperty(deviceIdx, ETrackedDeviceProperty.Prop_Axis0Type_Int32 + (int)primaryAxisIdx); if (axisType == EVRControllerAxisType.k_eControllerAxis_TrackPad) { //use interial scrolling if (controllerStateTracker.HasTouchDelta(primaryAxisIdx)) { Vector2 delta = controllerStateTracker.GetTouchDelta(primaryAxisIdx); velocities[deviceIdx] = delta / controllerStateTracker.GetUpdateRate(); ApplyDelta(delta, deviceIdx, primaryAxisIdx); } else if (!controllerStateTracker.IsTouched(primaryAxisButtonId)) { Vector2 velocity = velocities[deviceIdx]; if (velocity != Vector2.Zero) { if (velocity.LengthSquared() < 1e-5f) { velocity = Vector2.Zero; model.DoneMove(); } else { velocity *= 0.99f; ApplyDelta(velocity, deviceIdx, primaryAxisIdx); } velocities[deviceIdx] = velocity; } } } else { //use velocity scrolling if (controllerStateTracker.IsTouched(primaryAxisButtonId)) { Vector2 position = controllerStateTracker.GetAxisPosition(primaryAxisIdx); Vector2 velocity = PowerCurve(position, 2) * 0.2f; Vector2 delta = velocity; ApplyDelta(delta, deviceIdx, primaryAxisIdx); } else if (controllerStateTracker.BecameUntouched(primaryAxisButtonId)) { model.DoneMove(); } } } }