Project / UnProject

Header: cglm/project.h

Viewport is required as vec4 [X, Y, Width, Height] but this doesn’t mean that you should store it as vec4. You can convert your data representation to vec4 before passing it to related functions.

Table of contents (click to go):

Functions:

  1. glm_unprojecti()
  2. glm_unproject()
  3. glm_project()

Functions documentation

void glm_unprojecti(vec3 pos, mat4 invMat, vec4 vp, vec3 dest)
maps the specified viewport coordinates into specified space [1] the matrix should contain projection matrix.

if you don’t have ( and don’t want to have ) an inverse matrix then use glm_unproject() version. You may use existing inverse of matrix in somewhere else, this is why glm_unprojecti exists to save inversion cost

[1] space:
  • if m = invProj: View Space
  • if m = invViewProj: World Space
  • if m = invMVP: Object Space

You probably want to map the coordinates into object space so use invMVP as m

Computing viewProj:

glm_mat4_mul(proj, view, viewProj);
glm_mat4_mul(viewProj, model, MVP);
glm_mat4_inv(viewProj, invMVP);
Parameters:
[in] pos point/position in viewport coordinates
[in] invMat matrix (see brief)
[in] vp viewport as [x, y, width, height]
[out] dest unprojected coordinates
void glm_unproject(vec3 pos, mat4 m, vec4 vp, vec3 dest)
maps the specified viewport coordinates into specified space [1] the matrix should contain projection matrix.

this is same as glm_unprojecti() except this function get inverse matrix for you.

[1] space:
  • if m = proj: View Space
  • if m = viewProj: World Space
  • if m = MVP: Object Space

You probably want to map the coordinates into object space so use MVP as m

Computing viewProj and MVP:

glm_mat4_mul(proj, view, viewProj);
glm_mat4_mul(viewProj, model, MVP);
Parameters:
[in] pos point/position in viewport coordinates
[in] m matrix (see brief)
[in] vp viewport as [x, y, width, height]
[out] dest unprojected coordinates
void glm_project(vec3 pos, mat4 m, vec4 vp, vec3 dest)
map object coordinates to window coordinates

Computing MVP:

glm_mat4_mul(proj, view, viewProj);
glm_mat4_mul(viewProj, model, MVP);
Parameters:
[in] pos object coordinates
[in] m MVP matrix
[in] vp viewport as [x, y, width, height]
[out] dest projected coordinates
float glm_project_z(vec3 pos, mat4 m)
map object’s z coordinate to window coordinates

this is same as glm_project() except this function projects only Z coordinate which reduces a few calculations and parameters.

Computing MVP:

glm_mat4_mul(proj, view, viewProj);
glm_mat4_mul(viewProj, model, MVP);
Parameters:
[in] pos object coordinates
[in] m MVP matrix
Returns:
projected z coordinate