PDA

View Full Version : Matrices



04-23-2002, 01:11 PM
Hi folks

First question:

I have a float[16] matrix named matrixA. Now I am searching for the matrix named matrixB. This:

glLoadMatrixf(matrixB);
glMultMatrixf(matrixA);

should be the same as:

glLoadIdentity();

How do I get the second matrix (the one first loaded).

Second question:

Is there somewhere a tutorial how to translate and rotate without OpenGL with float[16] matrices which I can load later with glLoadMatrixf? Till know I used float[3][3]s (only rotation), but they are not supported by OpenGL and I want to put the translation into the matrix now too.

Does somebody know a question

no-one
04-23-2002, 07:49 PM
as far as the first question i have no clue.

as for the second, this hopefully will explain the math and give the idea behind coding what you need.
http://www.geocities.com/SiliconValley/2151/matrices.html

Bob
04-23-2002, 11:00 PM
glLoadMatrixf(matrixB);
glMultMatrixf(matrixA);

should be the same as:

glLoadIdentity();

That means B*A==I.



B*A == I - Remove A from left side by multiplying with A^-1, on both sides, to the right
B*A*A^-1 == I*A^1
B == A^-1

So, there's your unknown matrix. matrixB is the inverse of matrixA.

For your own rotation matrices, there's no difference with OpenGL's 4x4 matrices. It's well explained in no-one's link above. But in short, if you have your rotation matrix like this



[ a d g ]
[ b e h ]
[ c f i ]

then just pad with some extra zeros and ones. This 4x4 matrix will do the same thing, and is perfectly valid in OpenGL.



[ a d g 0 ]
[ b e h 0 ]
[ c f i 0 ]
[ 0 0 0 1 ]

04-24-2002, 01:00 AM
Thanks no-one and Bob, both questions are answered. But now a new question to no-one:
http://www.geocities.com/SiliconValley/2151/matrices.html
shows how to use float[4][4] matrices. Can I simply do this:

glLoadMatrixf((float *)matrix);

or are the x and y values then in the wrong order? Do I first have to do this:

for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
mat16[(i << 2) + j] = matrix[i][j];

glLoadMatrixf(mat16);

or this (other order)?:

for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
mat16[(j << 2) + i] = matrix[i][j];

glLoadMatrixf(mat16);

Thanks for your help,
Thomas

Bob
04-24-2002, 02:58 AM
Even though you said the question was for no-one, I answer it anyway http://www.opengl.org/discussion_boards/ubb/tongue.gif

I don't know if you must transpose it matrix before you upload it to OpenGL, but it should be easy to find out. Upload a translation matrix, and see what happens. If you get some strange result (i.e. not a translation), the elements are obvisouly in the wrong order. Then you must transpose the matrix. You can either do that manually, as your described with your code, or you can let OpenGL do it for you.

Use the extensions GL_ARB_transpose_matrix, or if you have OpenGL 1.2, you don't need the extensions since it's added into the core. glLoadTransposeMatrix/glMultTransposeMatrix will load/multiply a matrix whose element are tranposed.

no-one
04-24-2002, 12:52 PM
thank you, Bob.

04-25-2002, 03:36 AM
Hmm okay, it will take a time until I can try that out... Thanks

Thomas