Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Resolved XR Rig Hand rotation after upgrading to Unity 2020.3.6f and OpenXR Plugin 1.1.1

Discussion in 'XR Interaction Toolkit and Input' started by langokalla, Apr 30, 2021.

  1. langokalla

    langokalla

    Joined:
    Aug 4, 2020
    Posts:
    22
    After upgrading my project from 2020.3.5f to 2020.3.6f, Unity also updated the OpenXR plugin to version 1.1.1.

    My project uses the same setup of an action based XR Rig as the Unity XR Interaction Toolkit Example project, and has worked fine. However, after the upgrade I noticed both hands has rotated 90 degrees upwards (now pointing straight up, and not forward, when actually pointing the controllers forward). I tried rotating the ActionBasedController's ModelTransform 90 degrees back to compensate for this, and the hand model is fine again, but the XR Ray Interactors and their XRLineInteractorVisual and LineRenderer is still pointing straight up.

    To make sure my XR Rig or project was not messed up in any way, I cloned the Unity XR Interaction Toolkit Example project again and upgraded that project to 2020.3.6f and OpenXR Plugin 1.1.1 to see if the same thing happens, and it does.

    I also checked the XR Interaction Debugger to see if the actual rotation input from the controllers were different on the two Unity versions, but they are also the same. So there is something going on under the hood after the update.

    Does anyone have an explanation for why this happens? Is it OpenXR just deciding on a different "default rotation" and Unity just has not updated their packages and/or examples? What do you think?

    Edit:
    How to reproduce https://github.com/Unity-Technologies/XR-Interaction-Toolkit-Examples/issues/65
     
    Last edited: Apr 30, 2021
    dpcactus likes this.
  2. langokalla

    langokalla

    Joined:
    Aug 4, 2020
    Posts:
    22
    Now it is important to also mention that upgrading the Unity XR Interaction Toolkit Example project to use the OpenXR Plugin in Unity 2020.3.5f works fine. No issues there, so the bug must come from somewhere in the upgrade of Unity version or OpenXR Plugin version, and not the conversion itself.
     
  3. langokalla

    langokalla

    Joined:
    Aug 4, 2020
    Posts:
    22
    Update:
    Changing Project Settings -> XR Plugin Management to Oculus solves the rotation bug, so I can say with certainty the bug comes from the OpenXR Plugin version 1.1.1
     
    zxyctn and dpcactus like this.
  4. dpcactus

    dpcactus

    Joined:
    Jan 13, 2020
    Posts:
    53
    Had the same issue and went back to Oculus XR Plugin.

    Bottom line: Can confirm this issue.
     
    langokalla likes this.
  5. joejo

    joejo

    Unity Technologies

    Joined:
    May 26, 2016
    Posts:
    958
    Please file a bug with a small repro project and report the case id here. Thank you.
     
    langokalla likes this.
  6. langokalla

    langokalla

    Joined:
    Aug 4, 2020
    Posts:
    22
    Bug has been filed with case id 1333391.
     
    dpcactus likes this.
  7. the_real_apoxol

    the_real_apoxol

    Unity Technologies

    Joined:
    Dec 18, 2020
    Posts:
    467
    Thank you for submitting a bug. I downloaded your sample project and I do see the rotation you mentioned. In 1.1.1 of the OpenXR plugin we fixed a bug with the Oculus Controller Profile that was causing the
    devicePose
    and
    pointer
    poses to be the same when the Oculus runtime in fact reports two different poses. This differs from the Oculus Plugin which only reports a
    Hand
    pose that is not the same pose as either of the other two, but closer to the
    pointer
    pose I believe. I changed the bindings in your project for device position and rotation from
    devicePosition
    and
    deviceRotation
    to
    pointerPosition
    and
    pointerRotation
    respectively and it fixed the issue. The
    devicePose
    in the oculus runtime points up the grip rather than out the front of the controller. If you install the
    ControllerSample
    you can visualize this.
    Hope this helps, I will also note this on the bug report.
     
    Last edited: May 5, 2021
    hhoffren and thep3000 like this.
  8. mk1987

    mk1987

    Joined:
    Mar 18, 2019
    Posts:
    53
    I had this exact same problem and this has definitely solved it with in editor! Now i've understood this both options are potentially useful it just needs some explanation on the documentation side. Will the pointer and devicepose behave similar to oculus for windows and vive despite the change in 1.1.1?

    Thank you @the_real_apoxol !
     
  9. the_real_apoxol

    the_real_apoxol

    Unity Technologies

    Joined:
    Dec 18, 2020
    Posts:
    467
    Generally I think you can expect each of the runtimes to interpret the meaning of
    devicePose
    (
    grip
    ) and
    pointer
    (
    aim
    ) the same. The concept of
    grip
    and
    aim
    in OpenXR are pretty common to all of the controller profiles. It is possible for a runtime to do something wildly different for either of those but I would imagine users would help them correct that quickly.
     
  10. langokalla

    langokalla

    Joined:
    Aug 4, 2020
    Posts:
    22
    This also solved the issue for me. Thanks @the_real_apoxol !

    I guess the XRI Default Input Actions needs to be updated to accommodate that change also.
     
  11. OlaBrahammar

    OlaBrahammar

    Joined:
    Jan 9, 2017
    Posts:
    10
    Can you please explain where you change these bindings? Is it an asset file somewhere? Or a script?
    Thank you
     
  12. the_real_apoxol

    the_real_apoxol

    Unity Technologies

    Joined:
    Dec 18, 2020
    Posts:
    467
    Usually in XRRig, or TrackedPoseDriver components on the rig
     
    OlaBrahammar likes this.
  13. unitydreamer29

    unitydreamer29

    Joined:
    Dec 27, 2020
    Posts:
    47
    In the .inputactions file, when changing to pointerPosition, and pointerRotation, I don't see any generic [LeftHand XR Controller] or [RightHand XR Controller], only bindings specific to Oculus.

    So when changing from device to pointer, the rotation issue is solved for my Rift device, but the HTC Vive no longer works with this input actions file. Any way to get around this?
     
  14. the_real_apoxol

    the_real_apoxol

    Unity Technologies

    Joined:
    Dec 18, 2020
    Posts:
    467
    You can bind to multiple things in the same action but also <XRController>/pointerPosition should work
     
  15. unitydreamer29

    unitydreamer29

    Joined:
    Dec 27, 2020
    Posts:
    47
    Thanks @the_real_apoxol, I didn't catch these under the "optional controls" area.
     
  16. unitydreamer29

    unitydreamer29

    Joined:
    Dec 27, 2020
    Posts:
    47
    Just tested this with Rift S on the SteamVR runtime instead of Oculus, and the results are wildly different.

    Had to change the OpenXR runtime through SteamVR settings (the dropdown within Unity OpenXR plugin doesn't seem to do anything). The right hand is completely fine, but the left hand has a positional offset, as well as a 45 degree rotational offset.

    I have the left and right hands set up identically as below:

    upload_2021-6-11_21-37-59.png
     
  17. the_real_apoxol

    the_real_apoxol

    Unity Technologies

    Joined:
    Dec 18, 2020
    Posts:
    467
    Does the Oculus Runtime look correct to you? What I am seeing is the oculus runtime looks ok but the SteamVR runtime seems to be offset quite a bit. Changing the OpenXR plugin version does not seem to make a difference.
     
  18. unitydreamer29

    unitydreamer29

    Joined:
    Dec 27, 2020
    Posts:
    47
    Yeah, Oculus Runtime looks good. After reading some of the other threads in the VR forums, it seems like the issue is caused by a SteamVR update.
     
  19. the_real_apoxol

    the_real_apoxol

    Unity Technologies

    Joined:
    Dec 18, 2020
    Posts:
    467
    We are actively working with valve to try to get the SteamVR Runtime issue resolved.
     
  20. ThePurpleSprinkles

    ThePurpleSprinkles

    Joined:
    Sep 22, 2018
    Posts:
    16
    Has this been fixed yet? If not, is there some workaround I can do to change the controller rotation?
     
  21. the_real_apoxol

    the_real_apoxol

    Unity Technologies

    Joined:
    Dec 18, 2020
    Posts:
    467
  22. ThePurpleSprinkles

    ThePurpleSprinkles

    Joined:
    Sep 22, 2018
    Posts:
    16
    I just tested this, and it still does not work.
    I am on SteamVR Beta version 1.18.5 and OpenXR plugin version 1.2.3.
     
  23. the_real_apoxol

    the_real_apoxol

    Unity Technologies

    Joined:
    Dec 18, 2020
    Posts:
    467
    Can you describe exactly what you are seeing and supply the bindings you are using for your controllers (specifically in the tracked pose driver).

    Thank you
     
  24. ThePurpleSprinkles

    ThePurpleSprinkles

    Joined:
    Sep 22, 2018
    Posts:
    16
    The XR Ray Interactors and my hand models are angled around 30 degrees up from where they are on Oculus Runtime.
    My bindings look like this on both controllers:
    upload_2021-7-1_18-27-7.png
    I don't have a tracked pose driver at all.

    Update: I do have a tracked pose driver but it is on the camera and has center eye position and rotation bindings
     
    Last edited: Jul 1, 2021
  25. the_real_apoxol

    the_real_apoxol

    Unity Technologies

    Joined:
    Dec 18, 2020
    Posts:
    467
    Try using the following bindings instead:

    Position: (add two bindings)
    Code (CSharp):
    1. <OculusGoController>{LeftHand}/devicePosition
    2. <XRController>{LeftHand}/pointerPosition
    Rotation: (add two bindings)
    Code (CSharp):
    1. <OculusGoController>{LeftHand}/deviceRotation
    2. <XRController>{LeftHand}/pointerRotation
    This is basically mapping the Oculus XR plugin controller to devicePosition and deviceRotation and all other controllers (OpenXR ones are the goal) to pointerPosition and pointerRotation. The reason for this is that the Oculus XR Plugin only has one pose and that pose is close to the "aim" pose from OpenXR. OpenXR has two poses, grip & aim, but devicePosition and deviceRotation are basically shortcuts to grip in OpenXR and not aim. By using pointerPosition and pointerRotation you are instead using aim. This is something we are hoping to clarify in future version of XR by making the poses more explicit and removing the generic `device` values.
     
  26. ThePurpleSprinkles

    ThePurpleSprinkles

    Joined:
    Sep 22, 2018
    Posts:
    16
    This worked! Thank you so much!
     
  27. kalineh

    kalineh

    Joined:
    Dec 23, 2015
    Posts:
    240
    @the_real_apoxol Can you elaborate slightly how the bindings are resolved here? Will the system use the first valid name match it finds, and ignore later ones? From the docs I got the impression it pulls from all input bindings and uses the most active one.

    I'm just trying to setup similar system here for each platform:
    pc: pointerPosition/Rotation
    rift: pointerPosition/Rotation
    quest2: devicePosition/Rotation

    (also making sure that it's valid using the same quest2 via link for the pc/rift builds)
     
  28. the_real_apoxol

    the_real_apoxol

    Unity Technologies

    Joined:
    Dec 18, 2020
    Posts:
    467
    With OpenXR only one binding will provide data at a time as it is determined based on which interaction profile is currently active.
     
    kalineh likes this.
  29. chriscode2020

    chriscode2020

    Joined:
    Jul 4, 2020
    Posts:
    2
    I'm struggling with this issue on the oculus quest 2, I have set up the bindings as recommended above but still have the issue. I'm using the XRI Default input actions. Am I missing a step?
    upload_2021-12-7_15-49-51.png
     
  30. kalineh

    kalineh

    Joined:
    Dec 23, 2015
    Posts:
    240
    The issue is that Quest2 runtime reports 'devicePosition', not 'pointerPosition', so you must use that for native quest builds. The controller name seems to be reported the same on both PC and Quest, so you need a platform define check (UNITY_ANDROID). So the simple fix is #if UNITY_ANDROID use devicePosition, not pointerPosition.

    However, if you have the editor set to android platform and play in the editor via oculus link, UNITY_ANDROID will still be active but in editor play you need to be using pointerPosition so you need an additional UNITY_EDITOR override.

    For our setup, we just set devicePosition as the default, and add this small override script and override pointerPosition for 'standalone' and 'editor' flags.

    Code (CSharp):
    1. using UnityEngine;
    2. using UnityEngine.InputSystem;
    3.  
    4. public class TrackedPoseDriverPlatformOverride
    5.     : MonoBehaviour
    6. {
    7.     public UnityEngine.InputSystem.XR.TrackedPoseDriver trackedPose;
    8.  
    9.     public bool android;
    10.     public bool standalone;
    11.     public bool editor;
    12.  
    13.     public bool dontOverrideInEditor;
    14.  
    15.     [Header("Position")]
    16.     public InputAction inputPosition;
    17.  
    18.     [Header("Rotation")]
    19.     public InputAction inputRotation;
    20.  
    21.     private void Awake()
    22.     {
    23. #if UNITY_EDITOR
    24.         if (dontOverrideInEditor)
    25.             return;
    26. #endif
    27.  
    28. #if UNITY_STANDALONE
    29.         if (standalone)
    30.         {
    31.             trackedPose.positionAction.Disable();
    32.             trackedPose.positionAction = inputPosition;
    33.             trackedPose.positionAction.Enable();
    34.  
    35.             trackedPose.rotationAction.Disable();
    36.             trackedPose.rotationAction = inputRotation;
    37.             trackedPose.rotationAction.Enable();
    38.         }
    39. #endif
    40.  
    41. #if UNITY_ANDROID
    42.         if (android)
    43.         {
    44.             trackedPose.positionAction.Disable();
    45.             trackedPose.positionAction = inputPosition;
    46.             trackedPose.positionAction.Enable();
    47.  
    48.             trackedPose.rotationAction.Disable();
    49.             trackedPose.rotationAction = inputRotation;
    50.             trackedPose.rotationAction.Enable();
    51.         }
    52. #endif
    53.  
    54. #if UNITY_EDITOR
    55.         if (editor)
    56.         {
    57.             trackedPose.positionAction.Disable();
    58.             trackedPose.positionAction = inputPosition;
    59.             trackedPose.positionAction.Enable();
    60.  
    61.             trackedPose.rotationAction.Disable();
    62.             trackedPose.rotationAction = inputRotation;
    63.             trackedPose.rotationAction.Enable();
    64.         }
    65. #endif
    66.     }
    67. }
    68.  
     
    Last edited: Dec 8, 2021
  31. chriscode2020

    chriscode2020

    Joined:
    Jul 4, 2020
    Posts:
    2
    So I had another issue, I'd used the Device Based XR Controller, rather than the Action Based XR Controller. As soon as I switched to Action Based I achieved the results described in this thread.
     
    StenCG likes this.
  32. VincentSerpico

    VincentSerpico

    Joined:
    May 15, 2018
    Posts:
    5
    Thank you. This solved my problem when I imported Create With VR lesson from 2020.3 to 2021.3 and then back to 2020.3
     
  33. ConorHigginsFC

    ConorHigginsFC

    Joined:
    Jun 28, 2021
    Posts:
    1
    I am currently having this issue, is there any way to resolve this using the Device Based XR Controller?
     
  34. DartFrogYT

    DartFrogYT

    Joined:
    Apr 10, 2018
    Posts:
    1
    Sooo where would that be in the VR core project template? Right/LeftController have a TrackedPoseDriver, but the only Pose Source options are Left Controller or Right Controller

    Sorry if it's something simple that I'm missing, I'm just starting haha
     
  35. Deleted User

    Deleted User

    Guest

    Bumpity Bump?

    I'm trying to set up a FinalIK character with the XR rig and another asset, and it isn't pretty. Using Oculus and OpenXR as the other asset requires an XR rig.
     

    Attached Files:

  36. proeminentcode

    proeminentcode

    Joined:
    Oct 27, 2020
    Posts:
    1
    I had the same issue using BNG Framework with SteamVR and OpenXR. I found the solution, but it is different a bit from what was mentionated above. Also, this issue was for grabbing, I could not grabe objects with Oculus Quest 2 Link using SteamVR.

    I'm using Unity3D version 2023.1.11f1 for Windows Standalone plaftorm using BNG Framework from assets store.

    1. Change the bindings for both hands and the XR Plug-in Management from Projects settings (as shown in solution 1 to 4 screen shots)

    2. Do this set up

    3. Add this code for the rotation in the InputBridge file

    Code (CSharp):
    1. public Quaternion GetControllerLocalRotation(ControllerHand handSide) {
    2.             Quaternion localRotation = Quaternion.identity;
    3.            
    4.             // Check if OpenXR Display
    5.             if (XRSettings.loadedDeviceName == "OpenXR Display")
    6.             {
    7.                 // Check if not null
    8.                 if (handSide == ControllerHand.Left) {
    9.                     // GetLeftController().TryGetFeatureValue(CommonUsages.deviceRotation, out localRotation);
    10.                     localRotation = _multiplatformManagerVR.steamVrLeftHandRotation.action.ReadValue<Quaternion>();
    11.                 }
    12.                 else if (handSide == ControllerHand.Right) {
    13.                     // GetRightController().TryGetFeatureValue(CommonUsages.deviceRotation, out localRotation);
    14.                     localRotation = _multiplatformManagerVR.steamVrRightHandRotation.action.ReadValue<Quaternion>();
    15.                 }
    16.             }
    17.             else
    18.             {
    19.                 if (handSide == ControllerHand.Left) {
    20.                     GetLeftController().TryGetFeatureValue(CommonUsages.deviceRotation, out localRotation);
    21.                 }
    22.                 else if (handSide == ControllerHand.Right) {
    23.                     GetRightController().TryGetFeatureValue(CommonUsages.deviceRotation, out localRotation);
    24.                 }
    25.             }
    26.  
    27.             return localRotation;
    28.         }
    4. Add this code in the InputBridge file inside the method public virtual void UpdateSteamInput() after the line with:

    Code (CSharp):
    1. #if STEAM_VR_SDK
    2. ...
    3. ...
    4. ...
    5. prevVal = RightGrip;
    6. RightGrip = correctValue(SteamVR_Actions.vRIF_RightGrip.axis);
    And add this code to solve the grabbing:

    Code (CSharp):
    1. // Workaround version
    2.             if (_multiplatformManagerVR != null)
    3.             {
    4.                 LeftGrip = _multiplatformManagerVR.steamVrLeftHandGrab.action.ReadValue<float>();
    5.                 LeftGripDown = _multiplatformManagerVR.steamVrLeftHandGrab.action.IsPressed();
    6.                
    7.                 RightGrip =  _multiplatformManagerVR.steamVrRightHandGrab.action.ReadValue<float>();
    8.                 RightGripDown = _multiplatformManagerVR.steamVrRightHandGrab.action.ReadValue<float>() > 0;
    9.             }
    5. Check screen shot solution 5 for the final overview regarding components

    P.S. MultiplatformManagerVR is a component that I made to make things easier and organize stuff:

    Code (CSharp):
    1. using System;
    2. using BNG;
    3. using UnityEditor.Experimental.GraphView;
    4. using UnityEngine;
    5.  
    6. #if !UNITY_ANDROID
    7. using Valve.VR;
    8. #endif
    9.  
    10. using UnityEngine.XR;
    11. using UnityEngine.InputSystem;
    12.  
    13. namespace UnityTemplateProjects.Helpers
    14. {
    15.     public class MultiplatformManagerVR : MonoBehaviour
    16.     {
    17.         [Header("Settings")]
    18.         public bool forceXrInput = false;
    19.         public InputBridge inputBridge;
    20. #if !UNITY_ANDROID
    21.         public SteamVR_ActivateActionSetOnLoad steamVRActivateActionSetOnLoad;
    22. #endif
    23.  
    24.         [Header("Bindings")]
    25.         public UnityEngine.InputSystem.InputActionAsset bindingXrInput;
    26.         public UnityEngine.InputSystem.InputActionAsset bindingSteamVR;
    27.  
    28.         [Header("SteamVR references")]
    29.         public InputActionReference steamVrLeftHandGrab;
    30.         public InputActionReference steamVrRightHandGrab;
    31.         public InputActionReference steamVrLeftHandRotation;
    32.         public InputActionReference steamVrRightHandRotation;
    33.  
    34.         private string _inputSourceHeadset;
    35.        
    36.         private void Awake()
    37.         {
    38.             DontDestroyOnLoad(gameObject);
    39.            
    40.             // Check if MultiplatformManagerVR already exists
    41.             if (FindObjectsOfType<MultiplatformManagerVR>().Length > 1)
    42.             {
    43.                 // Check if debug
    44.                 if (Debug.isDebugBuild)
    45.                 {
    46.                     Debug.Log("<color=yellow>MultiplatformManagerVR -> Awake() -> duplicated MultiplatformManagerVR, destroy current gameObject</color>");
    47.                 }
    48.                        
    49.                 Destroy(this.gameObject);
    50.             }
    51.             else
    52.             {
    53.                 // Check if debug
    54.                 if (Debug.isDebugBuild)
    55.                 {
    56.                     Debug.Log("<color=pink>MultiplatformManagerVR -> Awake() -> no other MultiplatformManagerVR gameObject found</color>");
    57.                 }
    58.             }
    59.            
    60.             // Check if debug
    61.             if (Debug.isDebugBuild)
    62.             {
    63.                 Debug.Log("MultiplatformManagerVR -> Awake()");
    64.                 Debug.Log("MultiplatformManagerVR -> Awake() -> isDeviceActive: " + XRSettings.isDeviceActive);
    65.                 Debug.Log("MultiplatformManagerVR -> Awake() -> loadedDeviceName: " + XRSettings.loadedDeviceName);
    66.                 Debug.Log("MultiplatformManagerVR -> Awake() -> InputSource: " + inputBridge.InputSource);
    67.             }
    68.            
    69.             // Check if for XRInput
    70.             if (forceXrInput)
    71.             {
    72.                 // Oculus/Keyboard
    73.                 PlayerPrefs.SetString("inputSourceHeadset", "XRInput");
    74.                 _inputSourceHeadset = "XRInput";
    75.                 inputBridge.actionSet = bindingXrInput;
    76.             }
    77.             else
    78.             {
    79.                 // Handle loadedDeviceName
    80.                 switch (XRSettings.loadedDeviceName)
    81.                 {
    82.                     case "oculus display":
    83.                         // Oculus
    84.                         PlayerPrefs.SetString("inputSourceHeadset", "XRInput");
    85.                         _inputSourceHeadset = "XRInput";
    86.                         inputBridge.InputSource = XRInputSource.XRInput;
    87.                         inputBridge.actionSet = bindingXrInput;
    88.                         steamVRActivateActionSetOnLoad.enabled = false;
    89.                         break;
    90.                     case "OpenXR Display":
    91.                         // SteamVR
    92.                         PlayerPrefs.SetString("inputSourceHeadset", "SteamVR");
    93.                         _inputSourceHeadset = "SteamVR";
    94.                         inputBridge.InputSource = XRInputSource.SteamVR;
    95.                         inputBridge.actionSet = bindingSteamVR;
    96.                         steamVRActivateActionSetOnLoad.enabled = true;
    97.                         break;
    98.                     default:
    99.                         // Keyboard
    100.                         PlayerPrefs.SetString("inputSourceHeadset", "XRInput");
    101.                         _inputSourceHeadset = "XRInput";
    102.                         inputBridge.InputSource = XRInputSource.XRInput;
    103.                         inputBridge.actionSet = bindingXrInput;
    104.                                    
    105.                         // Check if not Android
    106.                         #if !UNITY_ANDROID
    107.                             steamVRActivateActionSetOnLoad.enabled = false;
    108.                         #endif
    109.                        
    110.                         break;
    111.                 }
    112.             }
    113.  
    114.            
    115.            
    116.             // Check if not Android
    117.             #if !UNITY_ANDROID
    118.                 // Check if Steam component is not null
    119.                 if (steamVRActivateActionSetOnLoad == null)
    120.                 {
    121.                     // Check if debug
    122.                     if (Debug.isDebugBuild)
    123.                     {
    124.                         Debug.Log("MultiplatformManagerVR -> Awake() -> get SteamVR_ActivateActionSetOnLoad component...");
    125.                     }
    126.                
    127.                     steamVRActivateActionSetOnLoad = GetComponent<SteamVR_ActivateActionSetOnLoad>();
    128.                 }
    129.             #endif
    130.         }
    131.  
    132.         private void Update()
    133.         {
    134.             // Check if should be XR Input no matter what
    135.             if (forceXrInput)
    136.             {
    137.                 // Check if debug
    138.                 if (Debug.isDebugBuild)
    139.                 {
    140.                     Debug.Log("MultiplatformManagerVR -> Update() -> XR Input no matter what");
    141.                 }
    142.                
    143.                 // Check if XR Input
    144.                 if (inputBridge.InputSource == XRInputSource.XRInput) return;
    145.                
    146.                 // Not XRInput so set it by force
    147.                 inputBridge.InputSource = XRInputSource.XRInput;
    148.                 PlayerPrefs.SetString("inputSourceHeadset", "XRInput");
    149.                 inputBridge.actionSet = bindingXrInput;
    150.                
    151.                 // Check if Android
    152.                 #if UNITY_ANDROID
    153.                     steamVRActivateActionSetOnLoad.enabled = false;
    154.                 #endif
    155.             }
    156.             else
    157.             {
    158.                 // Check if SteamVR
    159.                 if (_inputSourceHeadset == "SteamVR")
    160.                 {
    161.                     // SteamVR
    162.                     inputBridge.InputSource = XRInputSource.SteamVR;
    163.                     steamVRActivateActionSetOnLoad.enabled = true;
    164.                 }
    165.                 else
    166.                 {
    167.                     // XRInput
    168.                     inputBridge.InputSource = XRInputSource.XRInput;
    169.                     steamVRActivateActionSetOnLoad.enabled = false;
    170.                 }
    171.             }
    172.         }
    173.     }
    174. }
    I'm so happy that I found the solution and I truly want others to benefit from it.

    This solution will fix grabbing and hands rotation 100%

    Take care and never give up with anything!
    Persist, learn, do something new, repeat.
     

    Attached Files: