Perspective projection matrix

Started by
4 comments, last by HenriH 16 years, 3 months ago
I have a perspective projection matrix which is calculated thus: (Taken from OpenGL Reference Manual, 3rd edition)

  f = cotangent(fovy/2)
  dp = near - far

  f/aspect   0        0                0
     0       f        0                0
     0       0  (far+near)/dp   (2*far*near)/dp
     0       0       -1                0
Can you instruct me how to calculate inverse of this matrix? I need this in order to transform coordinates back and forth between object space and window space. It is more convenient to use matrix of my own rather than gluProject/glUnProject. Thanks
Advertisement
Quote:Original post by HenriH
I have a perspective projection matrix which is calculated thus:
(Taken from OpenGL Reference Manual, 3rd edition)

  f = cotangent(fovy/2)  dp = near - far  f/aspect   0        0                0     0       f        0                0     0       0  (far+near)/dp   (2*far*near)/dp     0       0       -1                0


Can you instruct me how to calculate inverse of this matrix? I need this in order to transform coordinates back and forth between object space and window space. It is more convenient to use matrix of my own rather than gluProject/glUnProject.

Thanks
You can special-case matrix inversion for matrices of this sort, but I wouldn't bother if I were you - just use a generic inversion function (if you don't have such a function available and aren't sure how to implement it, post back).
This type of perspective matrix is actually quite easy to invert analytically given its relative sparsity. Since the upper-right and lower-left 2x2 sub-matrices are all 0's, you can invert the upper-left and lower-right sub-matrices independently. The upper-left sub-matrix only has elements along the diagonal so it's trivial to invert, while the lower-right sub-matrix requires some more mental math. But since you can treat it as a 2x2, inversion is still easy (lots of cancellations as well). From some quick back-of-the-envelope math I get:
aspect/f      0           0                    0   0         1/f          0                    0   0          0           0                   -1   0          0    dp/(2*far*near)   (far+near)/(2*far*near)
That's a block-matrix. Behold the power of recursive inversion:

aspect/f            0                 0                 0   0               1/f                0                 0   0                0                 0                -1   0                0         dp/(2*far*near)   (far+near)/(2*far*near)


Edit: Damn you, Zipster. I'll take consolation in the fact that this provides some level of verification [rolleyes].
Ring3 Circus - Diary of a programmer, journal of a hacker.
Wow, amazing! Thanks, I will check if this works.
Yea it does! You saved a lot of hazzle-dazzle from me. Thanks to you all!

This topic is closed to new replies.

Advertisement