Skip to main content
New Participant
June 16, 2020

OVRCameraRig use per eye cameras changes scale

I'm working on a 3D image/video solution so I'm using the 'per eye camera' option in the OVR Camera Rig in Unity.  I noticed that if I toggle this setting on and off, the scale of the world is radically affected.  With the per eye camera setting off, the eye separation appears correct, but when I switch it on, it seems to jump.  I don't seem to have any control over this and so it is completely breaking my project.  I'm using Unity 2019.3.2.f1 on OVR 1.42.0.  This issue occurs when using Oculus Link on the quest from the editor and also in the Quest build.
This topic has been closed for replies.

7 replies

New Participant
June 16, 2020
I've done some more digging and it looks like the eye separation is in line with the user setting on the headset.  I'm now suspecting the FOV as a possible source.  I tried a completely separate project and found the same issue (toggling the per eye camera setting in the OVR Camera Rig changes the perception of scale).  I noticed that the hand tracking is correctly aligned with my real-world hand when using the single camera, but when per eye cameras are enabled, my real-world hand moved much further than my virtual hand.
Up and Coming
January 9, 2021
This still appears to be a problem with the latest Unity 2020.2.1f1 and the latest Oculus SDK.

It's pretty easy to recreate as well. use a prefab Oculus camera rig, add a cube to one of the controllers, run, looks fine. Tick on Camera per eye and it's wrong (smaller).

I'm also looking into solutions :)
Up and Coming
January 9, 2021
Update:

So I've found a fix, in OVRCameraRig.cs I changed 

if (!hmdPresent || monoscopic)
{
leftEyeAnchor.localPosition = centerEyeAnchor.localPosition;
rightEyeAnchor.localPosition = centerEyeAnchor.localPosition;
leftEyeAnchor.localRotation = centerEyeAnchor.localRotation;
rightEyeAnchor.localRotation = centerEyeAnchor.localRotation;
}
else
{
                leftEyeAnchor.localPosition = centerEyeAnchor.localPosition;
                rightEyeAnchor.localPosition = centerEyeAnchor.localPosition;
                leftEyeAnchor.localRotation = centerEyeAnchor.localRotation;
                rightEyeAnchor.localRotation = centerEyeAnchor.localRotation;

Vector3 leftEyePosition = Vector3.zero;
Vector3 rightEyePosition = Vector3.zero;
Quaternion leftEyeRotation = Quaternion.identity;
Quaternion rightEyeRotation = Quaternion.identity;

if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.LeftEye, NodeStatePropertyType.Position, OVRPlugin.Node.EyeLeft, OVRPlugin.Step.Render, out leftEyePosition))
leftEyeAnchor.localPosition = leftEyePosition;
if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.RightEye, NodeStatePropertyType.Position, OVRPlugin.Node.EyeRight, OVRPlugin.Step.Render, out rightEyePosition))
rightEyeAnchor.localPosition = rightEyePosition;
if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.LeftEye, NodeStatePropertyType.Orientation, OVRPlugin.Node.EyeLeft, OVRPlugin.Step.Render, out leftEyeRotation))
leftEyeAnchor.localRotation = leftEyeRotation;
if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.RightEye, NodeStatePropertyType.Orientation, OVRPlugin.Node.EyeRight, OVRPlugin.Step.Render, out rightEyeRotation))
rightEyeAnchor.localRotation = rightEyeRotation;
}
}

to this:

if (!hmdPresent || monoscopic)
{
leftEyeAnchor.localPosition = centerEyeAnchor.localPosition;
rightEyeAnchor.localPosition = centerEyeAnchor.localPosition;
leftEyeAnchor.localRotation = centerEyeAnchor.localRotation;
rightEyeAnchor.localRotation = centerEyeAnchor.localRotation;
}
else
{
                leftEyeAnchor.localPosition = centerEyeAnchor.localPosition;
                rightEyeAnchor.localPosition = centerEyeAnchor.localPosition;
                leftEyeAnchor.localRotation = centerEyeAnchor.localRotation;
                rightEyeAnchor.localRotation = centerEyeAnchor.localRotation;

/*
Vector3 leftEyePosition = Vector3.zero;
Vector3 rightEyePosition = Vector3.zero;
Quaternion leftEyeRotation = Quaternion.identity;
Quaternion rightEyeRotation = Quaternion.identity;

if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.LeftEye, NodeStatePropertyType.Position, OVRPlugin.Node.EyeLeft, OVRPlugin.Step.Render, out leftEyePosition))
leftEyeAnchor.localPosition = leftEyePosition;
if (OVRNodeStateProperties.GetNodeStatePropertyVector3(Node.RightEye, NodeStatePropertyType.Position, OVRPlugin.Node.EyeRight, OVRPlugin.Step.Render, out rightEyePosition))
rightEyeAnchor.localPosition = rightEyePosition;
if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.LeftEye, NodeStatePropertyType.Orientation, OVRPlugin.Node.EyeLeft, OVRPlugin.Step.Render, out leftEyeRotation))
leftEyeAnchor.localRotation = leftEyeRotation;
if (OVRNodeStateProperties.GetNodeStatePropertyQuaternion(Node.RightEye, NodeStatePropertyType.Orientation, OVRPlugin.Node.EyeRight, OVRPlugin.Step.Render, out rightEyeRotation))
rightEyeAnchor.localRotation = rightEyeRotation;
*/
}
}

basically making the left and right camera do this

leftEyeAnchor.localPosition = centerEyeAnchor.localPosition;
rightEyeAnchor.localPosition = centerEyeAnchor.localPosition;
leftEyeAnchor.localRotation = centerEyeAnchor.localRotation;
rightEyeAnchor.localRotation = centerEyeAnchor.localRotation;

seems to work :)
New Participant
March 25, 2022

Thanks for this workaround! It's a strange issue, still occurring in2020.3.30f1. 

New Participant
May 24, 2021

This was a bothering issue, thanks for the workaround! Works 🙂

New Participant
August 29, 2023

I am using Meta Quest Pro, I  have been had the same small scale problem under the setting UsePerEye Cameras Enabled in OVRCameraRig, and also EyeTracking Requested in OVRManager so that the IPD setting of the the both eye lenz of Qeuest Pro is reflected to the local position values of LeftEyeAnchor, RightEyeAnchor in Unity.
 
 I do not think the way posted above that setting CenterEyeAnchor's position to LeftEyeAnchor, RightEyeAnchor is the correct solution because it caused IPD=0. 
 
If someone knows the way to see correct scale viewing with the setting of UsePerEye Cameras Enabled, please let me know.