Lianthe

03-01-2016, 11:30 AM

// Custom implementation of the LookAt function

glm::mat4 calculate_lookAt_matrix(glm::vec3 position, glm::vec3 target, glm::vec3 worldUp)

{

// 1. Position = known

// 2. Calculate cameraDirection

glm::vec3 zaxis = glm::normalize(position - target);

// 3. Get positive right axis vector

glm::vec3 xaxis = glm::normalize(glm::cross(glm::normalize(worldUp), zaxis));

// 4. Calculate camera up vector

glm::vec3 yaxis = glm::cross(zaxis, xaxis);

// Create translation and rotation matrix

// In glm we access elements as mat[col][row] due to column-major layout

glm::mat4 translation; // Identity matrix by default

translation[3][0] = -position.x; // Third column, first row

translation[3][1] = -position.y;

translation[3][2] = -position.z;

glm::mat4 rotation;

rotation[0][0] = xaxis.x; // First column, first row

rotation[1][0] = xaxis.y;

rotation[2][0] = xaxis.z;

rotation[0][1] = yaxis.x; // First column, second row

rotation[1][1] = yaxis.y;

rotation[2][1] = yaxis.z;

rotation[0][2] = zaxis.x; // First column, third row

rotation[1][2] = zaxis.y;

rotation[2][2] = zaxis.z;

// Return lookAt matrix as combination of translation and rotation matrix

return rotation * translation; // Remember to read from right to left (first translation then rotation)

}

This is a custom implementation of the lookAt function.

What i can't understand is how exactly these axes coordinates makes the world rotate around us in that rotation matrix, inside the LookAt function? and how are we looking at the direction we specified by simply multiplying our vertices with that rotation matrix? In other words, i couldn't understand how rotation matrix works in this function.

glm::mat4 calculate_lookAt_matrix(glm::vec3 position, glm::vec3 target, glm::vec3 worldUp)

{

// 1. Position = known

// 2. Calculate cameraDirection

glm::vec3 zaxis = glm::normalize(position - target);

// 3. Get positive right axis vector

glm::vec3 xaxis = glm::normalize(glm::cross(glm::normalize(worldUp), zaxis));

// 4. Calculate camera up vector

glm::vec3 yaxis = glm::cross(zaxis, xaxis);

// Create translation and rotation matrix

// In glm we access elements as mat[col][row] due to column-major layout

glm::mat4 translation; // Identity matrix by default

translation[3][0] = -position.x; // Third column, first row

translation[3][1] = -position.y;

translation[3][2] = -position.z;

glm::mat4 rotation;

rotation[0][0] = xaxis.x; // First column, first row

rotation[1][0] = xaxis.y;

rotation[2][0] = xaxis.z;

rotation[0][1] = yaxis.x; // First column, second row

rotation[1][1] = yaxis.y;

rotation[2][1] = yaxis.z;

rotation[0][2] = zaxis.x; // First column, third row

rotation[1][2] = zaxis.y;

rotation[2][2] = zaxis.z;

// Return lookAt matrix as combination of translation and rotation matrix

return rotation * translation; // Remember to read from right to left (first translation then rotation)

}

This is a custom implementation of the lookAt function.

What i can't understand is how exactly these axes coordinates makes the world rotate around us in that rotation matrix, inside the LookAt function? and how are we looking at the direction we specified by simply multiplying our vertices with that rotation matrix? In other words, i couldn't understand how rotation matrix works in this function.