OpenGL/GLM Transformation (Column-Major Order)

glm::mat4 A(1.0f, 0.0f, 0.0f, 0.0f, // column1
                       0.0f, 2.0f, 0.0f, 0.0f, // column2
                       0.0f, 0.0f, 4.0f, 0.0f, // column3
                      
1.0f, 2.0f, 3.0f, 1.0f); // column4
// A =
// 1 0 0 1
// 0 2 0 2
// 0 0 4 3
// 0 0 0 1


glm::mat4 B(1.0f, 0.0f, 0.0f, 0.0f, // column1
                       0.0f, 1.0f, 0.0f, 0.0f,
// column2
                       0.0f, 0.0f, 1.0f, 0.0f,
// column3
                       2.0f, 2.0f, 2.0f, 1.0f); // column4
// B =
// 1 0 0 2
// 0 1 0 2
// 0 0 1 2
// 0 0 0 1


glm::mat4 C = A*B;
// C = A*B =
// 1 0 0 3
// 0 2 0 6
// 0 0 4 11
// 0 0 0 1


glm::mat4 D = B*A;
// D = B*A =
// 1 0 0 3
// 0 2 0 4
// 0 0 4 5
// 0 0 0 1


glm::mat4 E = glm::inverse(A);  // inverse
// E = inverse(A) =
// 1 0 0 -1
// 0 0.5 0 -1
// 0 0 0.25 -0.75
// 0 0 0 1


glm::mat4 I = A * E;   // I = A * A-1
// I = A*E =
// 1 0 0 0
// 0 1 0 0
// 0 0 1 0
// 0 0 0 1


// p’ = M * p (OpenGL/GLM uses Column-Major Order)
glm::vec4 p = glm::vec4(1.0f, 0.0f, 0.0f, 1.0f);
// p = (1, 0, 0)


glm::vec4 q = A * p;
// q = A * p = (2, 2, 3)

glm::vec4 r = B * p;
// r = B * p = (3, 2, 2)

glm::vec4 s = C * p;
// s = A * B * p = (4, 6, 11)

glm::vec4 t = D * p;
// t = B * A * p = (4, 4, 5)


glm::mat4 Tx,Ty,Tz;
Tx = glm::translate(glm::mat4(1.0f), glm::vec3(2.0f, 0.0f, 0.0f)); // RHS x+ right
Ty = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 2.0f, 0.0f)); // RHS y+ up
Tz = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, 2.0f)); // RHS z+ front
// Tx =
// 1 0 0 2
// 0 1 0 0
// 0 0 1 0
// 0 0 0 1


glm::mat4 Rx,Ry,Rz,Ra;
Rx = glm::rotate(glm::mat4(1.0f), 30.0f, glm::vec3(1.0f, 0.0f, 0.0f)); // RHS x+ (Y->Z rotation) OpenGL uses DEGREE angle
Ry = glm::rotate(glm::mat4(1.0f), 60.0f, glm::vec3(0.0f, 1.0f, 0.0f)); // RHS y+ (Z->X rotation)
Rz = glm::rotate(glm::mat4(1.0f), 45.0f, glm::vec3(0.0f, 0.0f, 1.0f)); // RHS z+ (X->Y rotation)
Ra = glm::rotate(glm::mat4(1.0f), 45.0f, glm::vec3(1.0f, 1.0f, 1.0f)); // RHS (arbitrary axis)
// Rx =
// 1 0 0 0
// 0 0.999958 -0.0091384 0
// 0 0.0091384 0.999958 0
// 0 0 0 1


// Ry =
// 0.999833 0 0.018276 0
// 0 1 0 0
// -0.018276 0 0.999833 0
// 0 0 0 1


// Rz =
// 0.999906 -0.0137074 0 0
// 0.0137074 0.999906 0 0
// 0 0 1 0
// 0 0 0 1


// Ra =
// 0.999937 -0.00788263 0.00794526 0
// 0.00794526 0.999937 -0.00788263 0
// -0.00788263 0.00794526 0.999937 0
// 0 0 0 1


glm::mat4 Sx,Sy,Sz;
Sx = glm::scale(glm::mat4(1.0f), glm::vec3(2, 1, 1)); // RHS
Sy = glm::scale(glm::mat4(1.0f), glm::vec3(1, 2, 1)); // RHS
Sz = glm::scale(glm::mat4(1.0f), glm::vec3(1, 1, 2)); // RHS
// Sy =
// 1 0 0 0
// 0 2 0 0
// 0 0 1 0
// 0 0 0 1


// p’ = M3 * M2 * M1 * p (OpenGL uses Column-Major Order)
glm::mat4 TR = Tx * Rz; // Rotate Z, and then Translate X
glm::mat4 RT = Rz * Tx; // Translate X, and then Rotate Z
glm::mat4 TRS = Tx * Rz * Sy; // Scale Y, and then Rotate Z, and then Translate X
glm::mat4 SRT = Sy * Rz * Tx; // Translate X, and then Rotate Z, and then Scale Y
// Tx*Rz =
// 0.707107 -0.707107 0 2
// 0.707107 0.707107 0 0
// 0 0 1 0
// 0 0 0 1


// Rz*Tx =
// 0.707107 -0.707107 0 1.41421
// 0.707107 0.707107 0 1.41421
// 0 0 1 0
// 0 0 0 1


// Tx*Rz*Sy =
// 0.707107 -1.41421 0 2
// 0.707107 1.41421 0 0
// 0 0 1 0
// 0 0 0 1


// Sy*Rz*Tx =
// 0.707107 -0.707107 0 1.41421
// 1.41421 1.41421 0 2.82843
// 0 0 1 0
// 0 0 0 1

Parallelpiped

사용자 삽입 이미지void Parallelpiped::init()
{
 glm::vec3 pu = p + u;
 glm::vec3 pv = p + v;
 glm::vec3 pw = p + w;
 glm::vec3 puv = p + u + v;
 glm::vec3 pvw = p + v + w;
 glm::vec3 puw = p + u + w;
 glm::vec3 puvw = p + u + v + w;


 // Front face
 vbo.addData(&p[0], sizeof(glm::vec3));
 vbo.addData(&pu[0], sizeof(glm::vec3));
 vbo.addData(&puw[0], sizeof(glm::vec3));
 vbo.addData(&p[0], sizeof(glm::vec3));
 vbo.addData(&puw[0], sizeof(glm::vec3));
 vbo.addData(&pw[0], sizeof(glm::vec3));
 
 // Back face
 vbo.addData(&puv[0], sizeof(glm::vec3));
 vbo.addData(&pv[0], sizeof(glm::vec3));
 vbo.addData(&pvw[0], sizeof(glm::vec3));
 vbo.addData(&puv[0], sizeof(glm::vec3));
 vbo.addData(&pvw[0], sizeof(glm::vec3));
 vbo.addData(&puvw[0], sizeof(glm::vec3));


 // Left face
 vbo.addData(&pv[0], sizeof(glm::vec3));
 vbo.addData(&p[0], sizeof(glm::vec3));
 vbo.addData(&pw[0], sizeof(glm::vec3));
 vbo.addData(&pv[0], sizeof(glm::vec3));
 vbo.addData(&pw[0], sizeof(glm::vec3));
 vbo.addData(&pvw[0], sizeof(glm::vec3));


 // Right face
 vbo.addData(&pu[0], sizeof(glm::vec3));
 vbo.addData(&puv[0], sizeof(glm::vec3));
 vbo.addData(&puvw[0], sizeof(glm::vec3));
 vbo.addData(&pu[0], sizeof(glm::vec3));
 vbo.addData(&puvw[0], sizeof(glm::vec3));
 vbo.addData(&puw[0], sizeof(glm::vec3));


 // Top face
 vbo.addData(&pw[0], sizeof(glm::vec3));
 vbo.addData(&puw[0], sizeof(glm::vec3));
 vbo.addData(&puvw[0], sizeof(glm::vec3));
 vbo.addData(&pw[0], sizeof(glm::vec3));
 vbo.addData(&puvw[0], sizeof(glm::vec3));
 vbo.addData(&pvw[0], sizeof(glm::vec3));


 // Bottom face
 vbo.addData(&pv[0], sizeof(glm::vec3));
 vbo.addData(&puv[0], sizeof(glm::vec3));
 vbo.addData(&pu[0], sizeof(glm::vec3));
 vbo.addData(&pv[0], sizeof(glm::vec3));
 vbo.addData(&pu[0], sizeof(glm::vec3));
 vbo.addData(&p[0], sizeof(glm::vec3));


 numVertices = 36;


 // create VBO
 vbo.createVBO();
 vbo.bindVBO();
 vbo.uploadDataToGPU(GL_STATIC_DRAW);


 // create a VAO
 glGenVertexArrays(1, &vao);
 glBindVertexArray(vao);
 glEnableVertexAttribArray(0);
 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);


 isLoaded = true;
}

GLM Matrix (Column-major order)

int foo()
{
glm::vec4 Position = glm::vec4(glm:: vec3(0.0f), 1.0f);
glm::mat4 Model = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f, 2.0f, 3.0f));
printf(“%f %f %f %f\n”, Model[0][0], Model[1][0], Model[2][0], Model[3][0]);
printf(“%f %f %f %f\n”, Model[0][1], Model[1][1], Model[2][1], Model[3][1]);
printf(“%f %f %f %f\n”, Model[0][2], Model[1][2], Model[2][2], Model[3][2]);
printf(“%f %f %f %f\n”, Model[0][3], Model[1][3], Model[2][3], Model[3][3]);

glm::vec4 Transformed = Model * Position;

return 0;
}