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

**0**

# Perspective projection matrix

Started by HenriH, Jan 03 2008 03:29 AM

5 replies to this topic

###
#1
Members - Reputation: **122**

Posted 03 January 2008 - 03:29 AM

I have a perspective projection matrix which is calculated thus:
(Taken from OpenGL Reference Manual, 3rd edition)

Sponsor:

###
#2
Members - Reputation: **2069**

Posted 03 January 2008 - 03:36 AM

Quote: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).

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

###
#3
Crossbones+ - Reputation: **1685**

Posted 03 January 2008 - 08:20 AM

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)

###
#4
Members - Reputation: **1122**

Posted 03 January 2008 - 08:28 AM

That's a block-matrix. Behold the power of recursive inversion:

Edit: Damn you, Zipster. I'll take consolation in the fact that this provides some level of verification [rolleyes].

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].