@@ -58,6 +58,10 @@ public enum Axis2DTypes
58
58
59
59
private string [ ] profiles = null ;
60
60
61
+ private int oculusLinkBugTest = 0 ;
62
+ private Quaternion oculusOffsetRay = Quaternion . Euler ( 90f , 0 , 0 ) ;
63
+ private Quaternion oculusOffsetGrip = Quaternion . Euler ( - 90f , 0 , 0 ) ;
64
+
61
65
[ SerializeField ] private bool alwaysUseGrip = false ;
62
66
public Vector3 gripPosition { get ; private set ; } = Vector3 . zero ;
63
67
public Quaternion gripRotation { get ; private set ; } = Quaternion . identity ;
@@ -303,10 +307,37 @@ private void OnControllerUpdate(WebXRControllerData controllerData)
303
307
304
308
profiles = controllerData . profiles ;
305
309
306
- gripRotation = controllerData . gripRotation ;
307
- gripPosition = controllerData . gripPosition ;
308
- transform . localRotation = alwaysUseGrip ? gripRotation : controllerData . rotation ;
309
- transform . localPosition = alwaysUseGrip ? gripPosition : controllerData . position ;
310
+ if ( oculusLinkBugTest != 1 )
311
+ {
312
+ gripRotation = controllerData . gripRotation ;
313
+ gripPosition = controllerData . gripPosition ;
314
+ if ( alwaysUseGrip )
315
+ {
316
+ transform . localRotation = controllerData . rotation * controllerData . gripRotation ;
317
+ transform . localPosition = controllerData . rotation * ( controllerData . position + controllerData . gripPosition ) ;
318
+ }
319
+ else
320
+ {
321
+ transform . localRotation = controllerData . rotation ;
322
+ transform . localPosition = controllerData . position ;
323
+ }
324
+ CheckOculusLinkBug ( ) ;
325
+ }
326
+ else
327
+ { // Oculus on desktop returns wrong rotation for targetRaySpace, this is an ugly hack to fix it
328
+ gripRotation = controllerData . gripRotation * oculusOffsetGrip ;
329
+ gripPosition = controllerData . gripPosition ;
330
+ if ( alwaysUseGrip )
331
+ {
332
+ transform . localRotation = controllerData . rotation * controllerData . gripRotation ;
333
+ transform . localPosition = controllerData . rotation * ( controllerData . position + controllerData . gripPosition ) ;
334
+ }
335
+ else
336
+ {
337
+ transform . localRotation = controllerData . rotation * oculusOffsetRay ;
338
+ transform . localPosition = controllerData . position ;
339
+ }
340
+ }
310
341
311
342
trigger = controllerData . trigger ;
312
343
squeeze = controllerData . squeeze ;
@@ -332,6 +363,23 @@ private void OnControllerUpdate(WebXRControllerData controllerData)
332
363
}
333
364
}
334
365
366
+ // Oculus on desktop returns wrong rotation for targetRaySpace, this is an ugly hack to fix it
367
+ private void CheckOculusLinkBug ( )
368
+ {
369
+ if ( oculusLinkBugTest == 0
370
+ && profiles != null && profiles . Length > 0 )
371
+ {
372
+ if ( profiles [ 0 ] == "oculus-touch" && gripRotation . x > 0 )
373
+ {
374
+ oculusLinkBugTest = 1 ;
375
+ }
376
+ else
377
+ {
378
+ oculusLinkBugTest = 2 ;
379
+ }
380
+ }
381
+ }
382
+
335
383
private void OnHandUpdateInternal ( WebXRHandData handData )
336
384
{
337
385
if ( handData . hand == ( int ) hand )
0 commit comments