All the different FOVs of Pimax 5k+

Recently I was looking at projection matrices and from where they come and realized that there is actually finally the info available about what the different FOVs offered by Pimax mean.

Just for the record I should state that I run the tests on:

  • Pimax 5k+
  • PiTool v1.0.1.91 (HMD Firmware v181)
  • Parallel projection OFF

If for some reason Pimax decide to change the headset characteristics, these results become obsolete. They also may differ for Pimax 8k.

EDIT 15.4.2019: I have added another post to address the configuration with the parallel projection turned on (All the parallel FOVs of Pimax 5k+).

There is a function in OpenVR IVRSystem::GetProjectionRaw which returns the tangents of the angles of the left, right, bottom and top clipping planes for each eye projection. The values it returns are taken from the headset driver, so they are basically the hardware capabilities, with which the headset work and are defined by design and optical properties of the headset.

On the side note, the above mentioned function is bugged and returns the values for the top and bottom swapped, but it seems like everyone already got around it - the bug was first reported 3 years ago, but never fixed (as per GitHub).

It is important to keep in mind that these are theoretical values, i.e. something the headset expects from the application to be able to display the image correctly. It does not however mean that the user will be able to enjoy the full view (as defined by the headset) as some parts of the view get masked (as I showed in my previous post), some get so distorted that will not be visible anymore.

I run simple tests which queried the aforementioned function for the values, while setting the different FOVs in PiTool.

Small FOV

HMD driver recommended render target resolution: 2638x2633

Left eye
tan_left=-1.197888, tan_right=1.346154, tan_bottom=-1.269841, tan_top=1.269841
atan_left=-50.14°, atan_right=53.39°, atan_bottom=-51.78°, atan_top=51.78°
horizontal=2.54, vertical=2.54, aspect=1.00

Right eye
tan_left=-1.346154, tan_right=1.197888, tan_bottom=-1.269841, tan_top=1.269841
atan_left=-53.39°, atan_right=50.14°, atan_bottom=-51.78°, atan_top=51.78°
horizontal=2.54, vertical=2.54, aspect=1.00

The angles are measured from the view axes and they are four so the view does not have to be symmetrical, which is the case with Pimax, where the views only differ by the “outward” angle.

By summing up the left and right, or bottom and top we can obtain the total horizontal or vertical FOV for the particular view, which in this case is:

Total single eye FOV
horizontal_FOV=103.53°, vertical_FOV=103.56°

Normal FOV

HMD driver recommended render target resolution: 3202x2633

Left eye
tan_left=-1.742203, tan_right=1.346154, tan_bottom=-1.269841, tan_top=1.269841
atan_left=-60.14°, atan_right=53.39°, atan_bottom=-51.78°, atan_top=51.78°
horizontal=3.09, vertical=2.54, aspect=1.22

Right eye
tan_left=-1.346154, tan_right=1.742203, tan_bottom=-1.269841, tan_top=1.269841
atan_left=-53.39°, atan_right=60.14°, atan_bottom=-51.78°, atan_top=51.78°
horizontal=3.09, vertical=2.54, aspect=1.22

Total single eye FOV
horizontal_FOV=113.53°, vertical_FOV=103.56°

Large FOV

HMD driver recommended render target resolution: 4267x2633
This is capped by OpenVR to 4096x2527.

Left eye
tan_left=-2.769231, tan_right=1.346154, tan_bottom=-1.269841, tan_top=1.269841
atan_left=-70.14°, atan_right=53.39°, atan_bottom=-51.78°, atan_top=51.78°
horizontal=4.12, vertical=2.54, aspect=1.62

Right eye
tan_left=-1.346154, tan_right=2.769231, tan_bottom=-1.269841, tan_top=1.269841
atan_left=-53.39°, atan_right=70.14°, atan_bottom=-51.78°, atan_top=51.78°
horizontal=4.12, vertical=2.54, aspect=1.62

Total single eye FOV
horizontal_FOV=123.53°, vertical_FOV=103.56°

We can see that the vertical FOV does not change over the different FOV choices and the horizontal FOV is scaling by 10°.

Now the question is, what is the overall FOV of the headset as the views themselves are also at the angle, which is 20° (10° outwards at each side)?

This can be easily calculated from left FOV from the left eye and the right FOV from the right eye while including the view geometry:

Total horizontal FOV  -> atan_left(left) + atan_right(right) + 20°
Small horizontal FOV  -> 50,14° + 50,14° + 20° = 120,28°
Normal horizontal FOV -> 60,14° + 60,14° + 20° = 140,28°
Large horizontal FOV  -> 70,14° + 70,14° + 20° = 160,28°
Total vertical FOV = Single view vertical FOV = 103,56°

We can also calculate (theoretical) angular overlap, by using the view angle and the “inner” FOVs of the left and right view respectively:

Angular overlap -> atan_right(left) + atan_left(right) - 20°
-> 53,39° + 53,39° - 20° = 86,78°

Following picture illustrates the formulas:

21 Likes

now compare it to a vive

Thank you for the in-depth investigation :+1:
 

IIRC a while back people were reporting a weird double image in the center of their vision when using Large FOV. It sounds like the overlapping sections probably weren’t aligned properly.

Very nice find!

Is there any way to find how far away the eyes are supposed to be positioned from the screen? That could help determining how thick the padding should be at any given IPD to get the proper geometry alignment with both eyes.

I believe that the design is calibrated to one particular “eye depth”, but without doing some precise measurement on the headset itself it will be difficult to tell. Basically you would need to:

  1. set the headset to the particular IPD value (ipd)
  2. measure the distance between the lenses centers (d_lens)
  3. calculate the distance to the eye as d_eye as

d_eye = (d_lens - ipd) / sin(10°))

But I am not sure what exactly this d_eye defines, is it the distance to the center of the eye, or the the retina, or to the pupil - have not yet figured this one :smiley:

3 Likes

According to Doc-Ok’s A Follow-up on Eye Tracking, the best eye depth to choose is:

  • If you have eye tracking, then choose pupil
  • If you don’t have eye tracking, then choose center of the eye

Whether or not Pimax decided to go with this method is another story.

2 Likes

I measure all this FOV over FOV tests and get identical values.
Please!! Measure vertical FOV with parallel projection ON.

??? aren’t the angles the same, should be independent of how far you elongate a axis, with PP you just make the outer line(s) longer so it does not change the angle, so the fov is still the same

Interesting those numbers figures are more In the range that I percieve than the 170 degrees regularly started

see my post https://community.openmr.ai/t/parallel-projections-option-renders-too-big-vertical-fov-and-25-performance-is-lost/18689

1 Like

So is 140 FOV is normal view then the Valve index will be similar at 135

Strange, Many people say Horizontal FOV is 170°.

155° on normal, 125° on small.

Yes, you can try the ROV test environment in SteamVR.

For me, it depends of how you adjust the headset. I had 175 of FOV, but a lot of glare. I adjust the headset, with a thick foam, and now I have exactly 170 in Large. My friends too, but some has 165 and others 172.

1 Like

The headset reports the values given above itself, so there is no way they could be different.

You cannot observe bigger FOV than the headset reports. This is not technically possible, because of how the projection geometry works.

We are talking about my sight FOV or the geometric FOV? Because it’s not the same.

I’m talking about my sight FOV. And the software doesn’t have nothing to do about that. Is about the screen, lenses and distance.

In Vive, with 110, you can improve it to 125 with thinners foams. The geometic FOV is 1:1? Well, it depends, because I think that geometric FOV never is 1:1.

I am talking about the maximum FOV the headset can display (as stated in the original post). The values reported by the headset driver (cited in the original post) are used by the application to calculate the projection view matrix (viewing frustum) and then to render the (game) image accordingly.

The analogy is like setting FOV in Quake 3 to some particular value. If you set it to 90° then the game will render the view with 90° horizontally, and you can stretch it, zoom it, use the curved display or do whatever you want to do with it, it will still contain only 90° of the horizontal view.

Coming back the Pimax headset (it works the same way for all the headsets), it means, that the application will render only 160° horizontally (for Large FOV), 140° for Normal and 120° for small FOV, and it does not change whether you look at it from the distance, or use super-thin facepad. In best case, you can get close enough to see the image borders and the black panel around, but it will not give you more (FOV) of the scene.

You can observe smaller FOV than that because for example of lens distortion or having part of the display obscured by the lenses/headset. But you can never observe bigger FOV, because it is simply not rendered by the app.

1 Like

Did you try ROV test? Because in this case we don’t know why it said we can see 170 degrees. It’s a manual test.

I know ROV test, I tried it long time ago on my Vive, but never on Pimax. However, I am pretty sure that if you measure anything > 160° (for Large FOV) then you are either using it wrong (maybe have misplaced head) or the test is not indicating it correctly.

I guess the best would be to ask the author @knob2001 for an explanation.

1 Like

Risa2000 do you have the FOV GetProjectionRaw() values for your Vive?