Noticed yesterday that previously working hands in Oculus Quest 2 are now badly distorted after an Oculus browser update the day before. I’m using OculusHand_R.fbx and OculusHand_L.fbx from github. The boxes and spheres hands work OK, the low poly version of the hand is different though still distorted:
Originally followed this example mostly: three.js/webxr_vr_handinput_profiles.html at e48fc94dfeaecfcbfa977ba67549e6108b370cbf · mrdoob/three.js · GitHub and got models from here: three.js/examples/models/fbx at dev · mrdoob/three.js · GitHub. Tried switching to using the mb models directly from Oculus, LeftHand.mb and RightHand.mb, in their own mb directory, that did not work, just invisible hands that could still activate controls though. I also tried switching to the latest version of threejs, no change. Searched here and online and did not find any references to this, or newer hand models. Emailed Oculus support also, awaiting their reply. Also checked in A-frame, and it has the same issue.
Also used a headset that had not had its browser updated yet, and, though there were other issues, the hands were OK:
Finally, I allowed the browser to update on this previously not-yet updated 2nd headset, and the distortion then appeared there too, making it seem more likely that the version is the issue, rather than an error with the first headset itself.
The distortion may be seen using an Oculus Quest 2 with the current browser version at threejs.org/examples/?q=hand#webxr_vr_handinput_profiles or Hand Tracking! • A-Frame .
Is there a new model I should download, or something else that needs to be done now to get the hand models to display correctly?
Also, this from Oculus: “…there was an issue in the Browser that was fixed that messed up the way models look in Browser, however, they are currently remaking those hand models to be fixed. These will be ready sometime this week.”
They said they would let me know - not sure how that works in terms of getting the new models and installing them.
Thanks again for all your help
Any idea how to implement? Asked this question of Oculus also:
For the previous models, they were in their own directory named “fbx” and code referenced them like this:
var handModelFactory = new XRHandModelFactory().setPath( “/images/fbx/” );
and for each hand:
hand2.add(handModelFactory.createHandModel( hand2, “oculus” ));
So, I put the new glb models in their own glb directory, and the code pointing now to it:
var handModelFactory = new XRHandModelFactory().setPath( “/images/glb/” );
I put the json in the same directory.
That didn’t work, so I changed the hand request to:
hand2.add(handModelFactory.createHandModel( hand2, “generic-hand” ));
Oculus said to use the loader method - will try that. Also, a similar issue may be showing up in changes made to threejs.org/examples/?q=hand#webxr_vr_handinput_profiles - two of the four modes are now blank, instead of distorted as they were before
Per Oculus, trying to use the load method for the new hand models; this is how far I got. The hand glb is loading, and will show if added to the scene itself or the rig, but doesn’t show when added to the hand. Not sure if or how to reverse order or other method to both invoke the hand renderer, and the model, and put them together. In the code below, the renderer and loader have been set up previously. Thank you for any help or insight on what I’m missing.
var hand2 = renderer.xr.getHand( 1 );
var asset_path = ‘/images/glb/left.glb’;
loader.load(asset_path, function ( gltf ) {
hand2.add( gltf.scene ); // not working
},
function ( xhr ) {
debug( ( xhr.loaded / xhr.total * 100 ) + “% left hand loaded” );
},
function ( error ) {
alert( error );
} );
Same issue here
Hands seem to load fine, but aren’t displayed
And trying to debug this is very difficult.
Oculus link mode, replace oculus models by generic ones. Only way is to debug from device itself (near impossible for me) XRHandModelFactory is convoluted and error logs never print.
I guess I just wait for things to stabilize between three updates and oculus browser
The “Quick Fix” about halfway down the page at the above github link, VR - Oculus Quest 2 hand-bone orientation changes · Issue #21666 · mrdoob/three.js · GitHub does work if you are editing a local version of XRHandOculusMeshModel.js and can add the suggested bone rotation changes - it also may need “this.handedness = handedness;” at the top of the constructor to allow the left hand to work.
Change #21712 shown there also worked in my testing, if all the changed files are downloaded and placed in a matching directory structure - if doing that, also change the path in XRHandModelFactory().setPath to /three.js/examples/models/gltf/Hands/ and place the new hands there using the new file names shown in the list of changed files. Those and the other referenced files mostly all (not the examples) need to be placed in the correct relative directory structure - the console for the desktop version of the page should warn if any required files are missing.
Waiting for the published version might be the least inefficient way to go, or the only option if importing remote files for three.js.
Getting Oculus Link or any other method to easily report errors is a challenge. For one-time errors, alert works - though it stops the VR, you should be able to see the message when you exit VR. In a loop though it can crash the page and force restarting the headset. Sending the test message to a text field, visible to the admin user or developer, also works, or if all else fails an old-fashioned ajax script to send an email. These also take resources to run and can crash the page if repeated too many times or too frequently. Don’t see much in the way of search results anymore for those solutions, so let me know and if it’s OK with the moderator I can post some starter code for them here, if you don’t find something more readily elsewhere.
You’re most welcome. In my earlier testing, simply replacing the hands, without changing the code, did not work. The existing fbx hands work OK with the Quick Fix mentioned, or the new glb hands work with the code in the changed files for fix #21712. There’s another fix there which works also, #21743.