glm matrix layout

Started by
4 comments, last by haegarr 10 years, 1 month ago

Does anyone know the matrix layout for glm? I know it's laid out linearly in memory, i'm wondering where the basis vectors are.

To my knowledge it looks like this

Xx, Xy, Xz, 0

Yx, Yy, Yz, 0

Zx, Zy, Zz, 0

Tx, Ty, Tz, 1

So, assuming a linear array of memory

flat* matrix = glm::value_ptr(mat);

The right vector would be row 1

glm::vec3 right = glm::vec3(matrix[0], matrix[1], matrix[2]);

The up vector would be row 2

glm::vec3 up = glm::vec3(matrix[4], matrix[5], matrix[6]);

The forward vector would be row 3

glm::vec3 forward = glm::vec3(matrix[8], matrix[9], matrix[10]);

and the position would be row 4

glm::vec3 position = glm::vec3(matrix[12], matrix[13], matrix[14]);

Also, how would one go from a 4x4 matrix to a quaternion?

Right now my assumption is

glm::quat a = glm::quat_cast(mat);

Can anyone please shed some light on weather or not i'm doing this right?

Advertisement

Yeah, you are doing it right, but I'd flip that drawing of the matrix layout because the matrices are accessed as columns. You can access the columns with [] operator. For example matrix[3] will give the last column in mat4, which should be the translation part. So you can say glm::vec3 position = glm::vec3(mat[3]);

Imagine that the mat4 contains vec4 columns[4], and the value_ptr of that would be &columns[0].x.

Derp

Wait, i tought the matrix in OpenGL was laid out linearly, so it indexes:

00 01 02 03

04 05 06 07

08 09 10 11

12 13 14 15

glm::value_ptr converts a mat4 into a float* for linear access.

But, the overloaded [] operator of glm accessess these elements column first,

that is element 12 would be accessed as mat[3][0]

I think.......

Yes, the matrix is laid out linearly as columns, you're just printing them as rows. It's still the same if you replace glm::value_ptr(mat) with &mat[0][0]. mat[3][0] == (&mat[0][0])[12].

Derp

http://en.wikipedia.org/wiki/Row-major_order

There you have an explanation of row major ordering and column major ordering. GLM uses column major ordering by default (which is OpenGL's traditional layout), and all vectors are represented as column vectors.

"I AM ZE EMPRAH OPENGL 3.3 THE CORE, I DEMAND FROM THEE ZE SHADERZ AND MATRIXEZ"

My journals: dustArtemis ECS framework and Making a Terrain Generator

In the manual of glm (v0.9.3, section 4.11) it is mentioned that glm matrices use column-major order. This term means that the indices of consecutive memory places a mapped onto a matrix like so


| 00 04 08 12 |
| 01 05 09 13 |
| 02 06 10 14 |
| 03 07 11 15 |

[ 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 ]

This obviously allows for a simple access to columns, because those are given by 4 consecutive memory places.

This topic is closed to new replies.

Advertisement