Sign in to follow this  

glm matrix layout

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

If you intended to correct an error in the post then please contact us.

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 this post


Link to post
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 this post


Link to post
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 this post


Link to post
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 this post


Link to post
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.

Share this post


Link to post
Share on other sites
Sign in to follow this