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: