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
Perspective projection matrix
I have a perspective projection matrix which is calculated thus:
(Taken from OpenGL Reference Manual, 3rd edition)
Quote:Original post by HenriHYou 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).
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
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:
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].
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement