# glm matrix layout

This topic is 2064 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

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?

##### Share on other sites

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.

##### Share on other sites

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.......

##### Share on other sites

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].

##### Share on other sites

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.

##### Share on other sites

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.

• ### Game Developer Survey

We are looking for qualified game developers to participate in a 10-minute online survey. Qualified participants will be offered a \$15 incentive for your time and insights. Click here to start!

• 14
• 30
• 9
• 16
• 22