views:

4294

answers:

4

I'm new to OpenGL and I'm a little overwhelmed with all of the random functions that I have my in code. They work and I know when to use them, but I don't know why I need them or what they actually do.

I know that glLoadIdentity() replaces the current matrix with the identity matrix, but what exactly does that do? If every program requires it, why isn't the identity matrix by default unless otherwise specified? I don't like to have functions in my code unless I know what they do. I should note that I am using OpenGL exclusively for rich 2D clients so excuse my ignorance if this is something very obvious for 3D.

Also a little confused about glMatrixMode(GL_PROJECTION) VS glMatrixMode(GL_MODELVIEW).

+15  A: 

Identity matrix is the equivalent of 1 for number. As you know any number that multiplies with 1 is itself (e.g. A x 1 = A), the same thing goes for matrix ( MatrixA x IdentifyMatrix = MatrixA). So loading identity matrix is a way to initialize your matrix to the right state before you multiply further matrices into the matrix stack.

glMatrixMode(GL_PROJECTION) deals with the matrices used by perspective transformation or orthogonal transformation.

glMatrixMode(GL_MODELVIEW) deals with matrices used by model-view transformation. That is, to transform your object (aka model) to the view coordinate space (or camera space).

Boon
A: 

I havn't read it, but I know enough people who have to recommend it:

3D Math Primer

I think some of the GL function calls will make a lot more sense to you if you learn the math behind what it's doing.

BigSandwich
+10  A: 

The identity matrix, in terms of the projection and modelview matrices, essentially resets the matrix back to its default state.

As you hopefully know, glTranslate and glRotate are always relative to the matrix's current state. So for instance, if you call glTranslate, you are translating from the matrix's current 'position', not from the origin. But if you want to start over at the origin, that's when you call glLoadIdentity(), and then you can glTranslate from the matrix which is now located at the origin, or glRotate from the matrix which is now oriented in the default direction.

I think Boon's answer, that it is the equivalent of 1, is not exactly correct. The matrix actually looks like this:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

That is the identity matrix. Boon is correct, mathematically, that any matrix multiplied with that matrix (or a matrix that looks like that; diagonal ones, all else 0s) will result in the original matrix, but I don't believe he explained why this is important.

The reason why this is important is because OpenGL multiplies all positions and rotations through each matrix; so when for instance you draw a polygon (glBegin(GL_FACE), some points, glEnd()), it translates it to "world space" by multiplying it with the MODELVIEW, and then translates it from 3D to 2D by multiplying it with the PROJECT matrix, and that gives it the 2D points on screen, along with the depth (from the screen 'camera'), which it uses to draw pixels. But when one of these matrices are the identity matrix, the points are multiplied with the identity matrix and therefore are not changed, so the matrix has no effect; it does not translate the points, it does not rotate them, it leaves them as-is.

I hope this clarifies a bit more!

-Ricky

Ricket
A: 

The identity matrix is used to "initialize" a matrix to a sane default.

One important thing to realize is that matrix multiplications are in a sense, additive. For example, if you take a matrix that starts with the identity matrix, multiply it times a rotation matrix, then multiply it times a scaling matrix, you end up with a matrix that rotates and scales the the matrices it is multiplied against.

dicroce