Perspective projection matrix

This topic is 3820 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

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 on other sites
Quote:
 Original post by HenriHI 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 0Can 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 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 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 on other sites
Wow, amazing! Thanks, I will check if this works.

Share on other sites
Yea it does! You saved a lot of hazzle-dazzle from me. Thanks to you all!

• 48
• 12
• 10
• 10
• 9
• Forum Statistics

• Total Topics
631374
• Total Posts
2999653
×