views:

98

answers:

2

Hello, I'm using OpenGL with gluPerspective, what would I need to do to make it use an axis-system which the origin is top left instead of bottom left?

A: 

You can do this by flipping the y-axis of the projection matrix. So:

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadMatrix( [1  0  0  0; 
               0 -1  0  0; 
               0  0  1  0; 
               0  0  0  1] ); 
            // ^ pseudo-code, replace with actual matrix

That ought to do it.

You could also use a glMultMatrix call with the same matrix (instead of Push and then Load), but this way is more easily reversed (just call glPopMatrix on the GL_PROJECTION stack later).

You can also use the same technique to flip any of the other axes; just put minus signs in the appropriate locations.

tzaman
Wouldn't glLoadMastrix kill off the previously set projection? It completely replaces the projection matrix, which is not what is asked for.
ypnos
That's what the `glPushMatrix` call is for, it pushes the existing matrix down on the stack, preserving the existing transform. The new matrix gets composed with the previous one, it doesn't replace it.
tzaman
As I learned it, and as every manual on the internet I found says, LoadMatrix always replaces the matrix on the stack, and does never get composed. The PushMatrix is only helpful to restore the original matrix (and abandon the one loaded) with PopMatrix afterwards.
ypnos
+1  A: 

I would say direct operating on the projection matrix is a clean way for this operation. But if by any chance you need an alternative:

You can just use glScalef(1.f, -1.f, 1.f) to flip the axis.

This is also just an operation on the GL_MODELVIEW or GL_PROJECTION matrix (whatever is currently active).

ypnos