I would like to finish the series on all the different FOVs of Pimax headset (https://community.openmr.ai/t/all-the-different-fovs-of-pimax-5k/16053) (https://community.openmr.ai/t/all-the-parallel-fovs-of-pimax-5k/18700) by taking a closer look at the diagonal FOV.
First, I need to say that specifying diagonal FOV for the headset (without knowing the aspect ratio) is useless in an exactly same way as specifying a pixel count instead of the monitor resolution. If one knows the correct (display) aspect ratio one can calculate the (display) resolution from the pixel count, but in general it does not give much of the information.
For some reason however the marketing departments seem to be loving it especially when they fail their math and can claim the arbitrary numbers. Luckily, it is easy to verify the marketing claims, once one gets the headset and does some calculations.
The FOV calculation model is defined by the following picture:
The view is drawn in scale to correspond to the total stereo Normal FOV of Pimax 5k+ (but it should not differ much from 8K). Total stereo means assuming both eyes, and Normal FOV is the PiTool config option. I chose Normal FOV, because the Large FOV would get cluttered (it is too wide) and Small FOV has not very big difference between the horizontal and the vertical FOV. The picture however serves just as an illustration of the model. The calculation presented below is equally valid for any type of FOV.
The total stereo FOVs corresponding to the different configurations for Pimax 5k+ are (taken from https://community.openmr.ai/t/all-the-different-fovs-of-pimax-5k/16053):
Small FOV horizontal = 120,28° vertical = 103,56°
Normal FOV horizontal = 140,28° vertical = 103,56°
Large FOV horizontal = 160,28° vertical = 103,56°
For those interested I include the calculation here, otherwise just skip to the results.
Calculation
Let’s define the points in the model with the following coordinates
bottom, left -> BL = [tan_left, tan_bottom, 1]
bottom, right -> BR = [tan_right, tan_bottom, 1]
top, left -> TL = [tan_left, tan_top, 1]
top, right -> TR = [tan_right, tan_top, 1]
:where:
tan_left = -atan(FOV_horiz/2), tan_right = atan(FOV_horiz/2)
tan_bottom = -atan(FOV_vert/2), tan_top = atan(FOV_vert/2)
:where:
FOV_horiz is corresponding (total stereo) horizontal FOV
FOV_vert is corresponding (total stereo) vertical FOV
:further:
O = [0, 0, 0] (system and view origin)
Using the Euclidean geometry we can calculate the diagonal FOV as an angle BL-O-TR
:
FOV_diag = acos( dot(BL,TR) / (|BL|*|TR|) )
:where:
dot(BL,TR) is the dot product of the vectors BL and TR
|X| is the length of the vector X
Results
Small FOV horizontal = 120,28° vertical = 103,56° diagonal = 130,23°
Normal FOV horizontal = 140,28° vertical = 103,56° diagonal = 143,66°
Large FOV horizontal = 160,28° vertical = 103,56° diagonal = 160,74°