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: