Prevent object stretching at higher FOV

While testing the camera out in the editor, I noticed that objects begin to appear longer when front facing; although I’ve not programmed rotation for the camera yet I imagine it would do the same. Before I delve into that though, I’d like to know if there is a way to stop the objects from appearing “stretched,” widenned, or otherwise, when at higher FOVs. I’ve played a many FPS games and all of which have FOVs upwards of 100 without this effect. How come I can’t seem to make the FOV higher without stretching the objects on screen? What steps can I take in order to solve it?

135303-nostretch.png
135305-stretch2.png

“I’ve played a many FPS games and all
of which have FOVs upwards of 100
without this effect”

That’s very unlikely. Maybe that game actually used to specify the horizontal FOV instead of the vertical. That means if you have a 100 horizontal FOV the vertical would be much smaller (especially on wide screen). I always play Quake with 120 FOV and there is a lot of stretching going on at the sides of the screens. The same holds true for any other ID tech games (Return to castle wolfenstein, Medal Of Honor, Jedi Knight 2 and even the old and new Doom games) as well as many other games (like Battlefield, Halflife, Unreal Tournament …)

Perspective projection always has some degree of distortion. That’s the nature of perspective projection. There are ways to reduce the distortion by using a non linear projection. However this can not be achieved with just a projection matrix since that’s limited to linear transformations. You would need a post processing filter. You may want to look for the so called Pannini projection. It seems someone made a rendering toolkit for Unity which implemented the pannini projection. The assetstore link in the post seems to be outdated, however i guess this is the same asset (not free).

The Pannini projection has some other issues. The main issue is that it either makes the performance worse, or that it makes the image quality worse (especially in the center). Due to the post processing of the rendered image, certain parts of the screen get magnified. This lowers the resolution of those areas and it might look blurry. To solve that you usually render the image larger than it’s displayed.