I've seen two different perspective projection matrices being used but I want to know which one of them is the best. I think that they both output the same but I'm not sure. So if anyone can help me select which one to use I would greatly appreciate it
2 Answers
Even though you can find multiple slightly different formulations for the perspective matrix on the internet, they all do more or less the same thing. They project everything inside a space with the shape of a truncated pyramid (your view frustum) into a space with the shape of a quad and a defined value range (clip space).
Most differences are related to how you define the shape of your frustum. For example, your first matrix uses a height, a width, and an angle together with z-far and z-near value. The second one uses just an x- and y-FOV and the z-far and z-near values to describe the shape of the frustum. This explains the differences in the upper left section.
So what about the lower right section? One big issue here is, that you can choose to use column or row vectors for your vertices/points. Column vectors are multiplied on the right-hand side and row vectors on the left-hand side. The choice you make determines if you have to transpose (switch columns and rows) your matrix or not. The matrices you presented are just targetting different vector representations. I can't tell you without testing/rereading which one is meant for which representation, but if you transpose one of them, they start looking quite similar.
There are still some other minor differences like varying signs, different factors, or a missing addition. The derivation of your second matrix can be found here. I can't tell you exactly where those small differences in the first matrix come from, but you can find some possible explanations in this link (Have a look into the "Are There Different Ways of Building this Matrix?" section). Another good read is this link here.
Which matrix is "correct" depends on how your Graphic API defines its coordinate systems and it's clip space (For OpenGL - you can take the one from the last link I provided). However, there is no "best" choice because they all do more or less the same. Unless you have no special needs for your program (depth precision) or other fancy ideas I can't think of now, just pick the one suited for your API with the inputs (FOV vs width+height+angle) that you like most and start having fun. ;)
-
$\begingroup$ if i were to use the secound matrix what should the fovX and fovY be set to to match the standard fov settings $\endgroup$– NixccJul 2, 2020 at 16:54
-
1$\begingroup$ Good question, I think 90 degrees for both values is pretty common. This also the value showed in one of the pictures in the second link I provided. However, take this as an orientation and not as a rule. Try some other values and take whatever you think looks best to you. Keep in mind, that different monitors/VR googles might need different settings. $\endgroup$– wychmaster ♦Jul 2, 2020 at 21:07
-
2$\begingroup$ Nevermind i found i website for calculating it themetalmuncher.github.io/fov-calc $\endgroup$– NixccJul 2, 2020 at 21:18
The hand written one must be quite wrong. The -2
and Z
got messed up. It should be -2 Zfar Znear
, not -Zfar...
with a Z without dash. In the field above, Zfar
is alone, it should be Zfar + Znear
.
Apart from these typos I prefer it - it has an aspect ratio and no extra minus signs to flip axes. Well it is column-major, but that is OK.