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 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);

this could be useful for gettng a bbox which fits with view frustum and object bounding boxes. In this case you crop view frustum box with objects box

Parameters:
[in] pos object coordinates
[in] m MVP matrix
[in] vp viewport as [x, y, width, height]
[out] dest projected coordinates