- Home /
Is this a valid projection matrix and why?
Hi,
from several AR/VR headset I keep getting projection matrices, having non zero value in the second column/ first row.
I wasn't able to find an explanation for this. Is it possible that this is related to some lens correction effect?
Thanks
Edit: This is some example projection matrix data (Samsung Odysee Plus MRTK v2):
0.8804515 -0.00124849 -0.08054376 0
0 0.7055852 0.0006020069 0
0 0 -1.0002 -0.20002
0 0 -1 0
are you sure it's the projection matrix and not a world/view matrix ?
Answer by Bunny83 · May 21, 2019 at 05:17 PM
Well, first of all I recommend to read through my Matrix crash course (If you have trouble reading due to UnityAnswers broken Markdown rendering, I have a clone on github).
Next thing to realise is that matrices can only do affine transformations. Thanks to homogeneous coordinates we can actually do a perspective projection as well as translation with a matrix. Any other non linear operation is not possible using a matrix since matrix multiplication only uses multiplication and addition. So lens distortion can not be fixed with a matrix. Only linear factors can be used (offsets, rotations or shear operation. Even trapezoid transformations are not possible since they are not affine)
To describe what the "3 unusual" values do I start with the 2 values in the 3rd column. Like i explained in my crash course they essentially shift the center of perspective left / right and up / down. However if you look closely on the values you will realise they are quite small. So they are just calibration values for the camera. You have a shift of about 9% on the vertical axis and about 0.09% on the horizontal axis.
The other unusual value (second column, first row) is really unusual for a projection matrix. It will cause a shear operation. However again if you look at the value (0.0012) it's very close to 0. It would cause a slight shear angle of about 0.08 degree. So the vertical lines are tilted by about 0.08°. At a vertical resolution of 1080p that would be about 1.5 pixels off. (So a vertical line from top to bottom would end 1.5 pixels to the left / right from the starting point). Using 0 for this value wouldn't cause almost no change at all.
ps:
I did already write a similar answer 4 days ago but I wasn't home and only had access to a "rudimentary PC". When I submitted the answer, UA decided to give my a 504 Gateway timeout and it was gone for good. So this is a complete rewrite ^^.
Thanks for the link! I already know about matrix math and how to construct a projection matrix. But that is why I wonder where the second column, first rows value is co$$anonymous$$g from. Though the shear is negligible, someone has an idea why some of the mixed reality headsets are setting it.
Well who knows. It could be a fragment of a more complex calculation / calibration routine. The same way when you calculate the inverse of a certain matrix and multiply the original with its own inverse the result is essentially the identity matrix with some close to zero values off the main diagonal.
Your answer
![](https://koobas.hobune.stream/wayback/20220612201523im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
How to project a 3D object onto the screen 0 Answers
How to use two cameras in VR to display 3D object on top of UI panel? 0 Answers
Can DrawMeshInstancedProcedural be used with Single Pass Instanced Rendering in Unity XR project? 0 Answers
VR mirror view custom size and FoV 0 Answers
Cardboard VR Optimization and single pass on 2019.4.1f1 0 Answers