• Create Account

## glm matrix layout

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

5 replies to this topic

### #1uglybdavis  Members

1065
Like
0Likes
Like

Posted 17 February 2014 - 08:21 PM

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?

### #2Sponji  Members

2269
Like
0Likes
Like

Posted 18 February 2014 - 01:27 AM

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

### #3uglybdavis  Members

1065
Like
0Likes
Like

Posted 18 February 2014 - 11:16 AM

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

### #4Sponji  Members

2269
Like
0Likes
Like

Posted 18 February 2014 - 11:40 AM

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

### #5TheChubu  Members

8954
Like
0Likes
Like

Posted 18 February 2014 - 02:29 PM

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

### #6haegarr  Members

7187
Like
0Likes
Like

Posted 18 February 2014 - 02:30 PM

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.

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.