>

2015년 4월 8일 수요일

glm::mat has internally column major representation.

$ brew install glm
----------------------------
glm test code.
----------------------------
  • Each row and column in glm::mat4 is zero-based:
    
        glm::mat4 m4( 1.0f ); // construct identity matrix
        m4[ 0 ]     // column zero
        m4[ 0 ].x   // same as m4[ 0 ][ 0 ]
        m4[ 0 ].y   // same as m4[ 0 ][ 1 ]
        m4[ 0 ].z   // same as m4[ 0 ][ 2 ]
        m4[ 0 ].w   // same as m4[ 0 ][ 3 ]
    
    
  • Each column of matrix glm::mat4 is a vec4.
  • To set the entire column, e.g. for translation,
    
        glm::mat4 m4( 1.0f ); // construct identity matrix
        m4[ 3 ] = glm::vec4( vec3( x, y, z ), 1.0f );
    
    


1:  #include <iostream>  
2:  using namespace std;  
3:  // Include GLM  
4:  #include <glm/glm.hpp>  
5:  #include <glm/gtc/matrix_transform.hpp>  
6:  #include <glm/gtc/type_ptr.hpp>  
7:  #include <glm/gtx/transform.hpp>  
8:  #include <glm/gtx/string_cast.hpp>  
9:  #include <math.h>  
10:  float deg2rad(float deg) { return deg*M_PI/180.; }  
11:  void print (glm::mat3 r, string s)  
12:  {  
13:      cout << s << endl;  
14:      for (int i=0; i<3; i++) {  
15:          for (int j=0; j<3; j++) {  
16:              cout << " " << r[i][j] ;  
17:          }  
18:          cout << endl;  
19:      }  
20:  }  
21:  void print (const glm::mat4 &r, string s)  
22:  {  
23:      cout << s << endl;  
24:      for (int i=0; i<4; i++) {  
25:          for (int j=0; j<4; j++) {  
26:              cout << " " << r[i][j] ;  
27:          }  
28:          cout << endl;  
29:      }  
30:  }  
31:  void print(const glm::vec3& v, string s)  
32:  {  
33:      cout << s << endl;  
34:      for (int i=0; i<3; i++) {  
35:          cout << " " << v[i] ;  
36:      }  
37:      cout << endl;  
38:  }  
39:  int main()  
40:  {  
41:   float degree = 45.;  
42:   glm::vec3 zAxis(0.f, 0.f, 1.f);  
43:   glm::mat3 R3 = glm::mat3(glm::rotate (deg2rad(degree),zAxis));  
44:   glm::mat4 R4 = glm::rotate (deg2rad(degree),zAxis);  
45:   cout << "Note that glm matrices are stored in column major order!" << endl;  
46:   cout << "----" << endl;  
47:   print(R3, "R3");  
48:   printf("----\n");  
49:   cout << "The following will show you column vectors enclosed by parantheses." << endl;  
50:   cout << "R3: " << glm::to_string(R3) << endl;  
51:   printf("----\n");  
52:   print(R4, "R4");  
53:   printf("----\n");  
54:   glm::vec2 p(1,0), q(0,1);  
55:   glm::vec3 u(1,1,1);  
56:   glm::vec3 ru = R3 * u,  
57:        rp = R3 * glm::vec3(p,1),  
58:        rq = R3 * glm::vec3(q,1);  
59:   printf("This is the 1st column of R3.\n");  
60:   print(rp, "rp:");  
61:   printf("----\n");  
62:   printf("This is the 2nd column of R3.\n");  
63:   print(rq, "rq:");  
64:   printf("----\n");  
65:   printf("This is the 45 degrees rotation result of (1,1,1) about the z-axis.\n");  
66:   print(ru, "ru:");  
67:   printf("----\n");  
68:   glm::mat3 H(1.0); // identity matrix  
69:   H[2].x = 1.0; // (0,2)-element of H  
70:   cout << "H: " << glm::to_string(H) << endl;  
71:   H[2] = glm::vec3(2.0f, 3.0f, 1.0f); // 2d translation  
72:   cout << "H: " << glm::to_string(H) << endl;  
73:   glm::mat3 T = H * R3;  
74:   cout << "H*R: " << glm::to_string(T) << endl;  
75:   return 0;  
76:  }  
77:  // EOF //