Sign in to follow this  
HenriH

Perspective projection matrix

Recommended Posts

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

Share this post


Link to post
Share on other sites
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).

Share this post


Link to post
Share on other sites
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)

Share this post


Link to post
Share on other sites
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].

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this