After using the Unity Data Collector, I end up with the following values. A couple of questions here based on the figures below:

1. The gaze direction vectors are supposed to be directional unit vectors. Which means x^2+y^2+z^2 should be equal to 1. But in many places, they are slightly above 1 or below 0.
2. The convergence accuracy in Fig. 2 is always above 1 which cannot be the case as it has to be between 0 and 1.
3. What is the units of convergence distance in Fig. 2? Is it in the same units as the objects placed in Unity? For example, if the camera is placed at {0,0,-120}, then does a convergence distance of 1.0560 indicate that the user was looking at 1.0560 * direction specified by the {x,y,z} directional unit gaze vectors?

Fig 1:

Fig 2:

Hi Ritz,

1. The unit vectors stay relatively close to 1. For the first frame in figure 1 I'm getting something like 0.033*0.033+0.18*0.18+0.983*0.983 = 0.999778, which is quite close to one (though I didn't run each frame in your numbers).

Due to floating point precision, they will rarely be exactly one - however I believe the main source of inaccuracy here is the rounding in the Unity Data Collector when it writes to CSV. If you modify it to write the full value not limited to a certain number of digits, it should be a little closer.

If you do get particularly bad data there, let me know. I believe there are still some cases where it exports 0,0,0 in some cases when the eyes are not tracking, so I'd like to fix anything like that.

2. Convergence accuracy is deprecated. I apologize that this is not documented and will correct this in a future release.

We had the accuracy measure as a way for developers to selectively discard data when the accuracy is low, but we never had a meaningful way of representing that, and exposing the data leads to developers having to set arbitrary thresholds which are of little value in this case.

Basically, convergence data is never very accurate just due to the nature of it being a secondary calculation from other data. It gets you in the ballpark, but is best used intended to be combined with another method, such as ray tracing into the scene. For example, if you raytrace the user looking through a window at a tree, your ray will hit both the window and the tree, and you can then use the convergence data to disambiguate whether the user is looking at the window or the tree, by which ray hit is closer to the convergence distance.

In general, the closer the convergence distance, the more accurate. Once you're looking more than a few meters away, the eyes are close enough to parallel that is becomes very difficult to distinguish. You can see this in the eye cameras if you position an object 5m away or 500m away, the eyes barely move.

Within the near field though convergence distance is very useful - for example if you're looking around in the cockpit of a ship or the such.

3. Units of convergence distance in our C/C++/C#/Python SDK are in meters. We standardize on meters for all physical outputs (even things like IPD which are usually in millimeters), simply for consistency in the API. Our Unity plugin does not do any further space conversions if you look at GetWorldGazeConvergence in FoveInterfaceBase.cs.