Skip to content

Commit d5acca8

Browse files
committed
Ugly hack to fix Oculus desktop targetRaySpace bug + bug fix for alwaysUseGrip
1 parent 715bff6 commit d5acca8

File tree

1 file changed

+52
-4
lines changed

1 file changed

+52
-4
lines changed

Packages/webxr/Runtime/Scripts/WebXRController.cs

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ public enum Axis2DTypes
5858

5959
private string[] profiles = null;
6060

61+
private int oculusLinkBugTest = 0;
62+
private Quaternion oculusOffsetRay = Quaternion.Euler(90f, 0, 0);
63+
private Quaternion oculusOffsetGrip = Quaternion.Euler(-90f, 0, 0);
64+
6165
[SerializeField] private bool alwaysUseGrip = false;
6266
public Vector3 gripPosition { get; private set;} = Vector3.zero;
6367
public Quaternion gripRotation { get; private set;} = Quaternion.identity;
@@ -303,10 +307,37 @@ private void OnControllerUpdate(WebXRControllerData controllerData)
303307

304308
profiles = controllerData.profiles;
305309

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+
}
310341

311342
trigger = controllerData.trigger;
312343
squeeze = controllerData.squeeze;
@@ -332,6 +363,23 @@ private void OnControllerUpdate(WebXRControllerData controllerData)
332363
}
333364
}
334365

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+
335383
private void OnHandUpdateInternal(WebXRHandData handData)
336384
{
337385
if (handData.hand == (int)hand)

0 commit comments

Comments
 (0)