Jump to content

  • Log In with Google      Sign In   
  • Create Account

Banner advertising on our site currently available from just $5!


1. Learn about the promo. 2. Sign up for GDNet+. 3. Set up your advert!


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.

  • You cannot reply to this topic
5 replies to this topic

#1 uglybdavis   Members   -  Reputation: 1047

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?



Sponsor:

#2 Sponji   Members   -  Reputation: 1594

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

#3 uglybdavis   Members   -  Reputation: 1047

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



#4 Sponji   Members   -  Reputation: 1594

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

#5 TheChubu   Crossbones+   -  Reputation: 6396

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


#6 haegarr   Crossbones+   -  Reputation: 5576

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.



PARTNERS