mirror of
https://github.com/recp/cglm.git
synced 2025-10-04 01:00:46 +00:00
The `fovy` parameter is expected in radians, which isn't mentioned anywhere in the docs. Causes unnecessary confusion. Might as well point it out.
314 lines
10 KiB
ReStructuredText
314 lines
10 KiB
ReStructuredText
.. default-domain:: C
|
|
|
|
camera
|
|
======
|
|
|
|
Header: cglm/cam.h
|
|
|
|
There are many convenient functions for camera. For instance :c:func:`glm_look`
|
|
is just wrapper for :c:func:`glm_lookat`. Sometimes you only have direction
|
|
instead of target, so that makes easy to build view matrix using direction.
|
|
There is also :c:func:`glm_look_anyup` function which can help build view matrix
|
|
without providing UP axis. It uses :c:func:`glm_vec3_ortho` to get a UP axis and
|
|
builds view matrix.
|
|
|
|
You can also *_default* versions of ortho and perspective to build projection
|
|
fast if you don't care specific projection values.
|
|
|
|
*_decomp* means decompose; these function can help to decompose projection
|
|
matrices.
|
|
|
|
**NOTE**: Be careful when working with high range (very small near, very large
|
|
far) projection matrices. You may not get exact value you gave.
|
|
**float** type cannot store very high precision so you will lose precision.
|
|
Also your projection matrix will be inaccurate due to losing precision
|
|
|
|
Table of contents (click to go):
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Functions:
|
|
|
|
1. :c:func:`glm_frustum`
|
|
#. :c:func:`glm_ortho`
|
|
#. :c:func:`glm_ortho_aabb`
|
|
#. :c:func:`glm_ortho_aabb_p`
|
|
#. :c:func:`glm_ortho_aabb_pz`
|
|
#. :c:func:`glm_ortho_default`
|
|
#. :c:func:`glm_ortho_default_s`
|
|
#. :c:func:`glm_perspective`
|
|
#. :c:func:`glm_persp_move_far`
|
|
#. :c:func:`glm_perspective_default`
|
|
#. :c:func:`glm_perspective_resize`
|
|
#. :c:func:`glm_lookat`
|
|
#. :c:func:`glm_look`
|
|
#. :c:func:`glm_look_anyup`
|
|
#. :c:func:`glm_persp_decomp`
|
|
#. :c:func:`glm_persp_decompv`
|
|
#. :c:func:`glm_persp_decomp_x`
|
|
#. :c:func:`glm_persp_decomp_y`
|
|
#. :c:func:`glm_persp_decomp_z`
|
|
#. :c:func:`glm_persp_decomp_far`
|
|
#. :c:func:`glm_persp_decomp_near`
|
|
#. :c:func:`glm_persp_fovy`
|
|
#. :c:func:`glm_persp_aspect`
|
|
#. :c:func:`glm_persp_sizes`
|
|
|
|
Functions documentation
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
.. c:function:: void glm_frustum(float left, float right, float bottom, float top, float nearVal, float farVal, mat4 dest)
|
|
|
|
| set up perspective peprojection matrix
|
|
|
|
Parameters:
|
|
| *[in]* **left** viewport.left
|
|
| *[in]* **right** viewport.right
|
|
| *[in]* **bottom** viewport.bottom
|
|
| *[in]* **top** viewport.top
|
|
| *[in]* **nearVal** near clipping plane
|
|
| *[in]* **farVal** far clipping plane
|
|
| *[out]* **dest** result matrix
|
|
|
|
.. c:function:: void glm_ortho(float left, float right, float bottom, float top, float nearVal, float farVal, mat4 dest)
|
|
|
|
| set up orthographic projection matrix
|
|
|
|
Parameters:
|
|
| *[in]* **left** viewport.left
|
|
| *[in]* **right** viewport.right
|
|
| *[in]* **bottom** viewport.bottom
|
|
| *[in]* **top** viewport.top
|
|
| *[in]* **nearVal** near clipping plane
|
|
| *[in]* **farVal** far clipping plane
|
|
| *[out]* **dest** result matrix
|
|
|
|
.. c:function:: void glm_ortho_aabb(vec3 box[2], mat4 dest)
|
|
|
|
| set up orthographic projection matrix using bounding box
|
|
| bounding box (AABB) must be in view space
|
|
|
|
Parameters:
|
|
| *[in]* **box** AABB
|
|
| *[in]* **dest** result matrix
|
|
|
|
.. c:function:: void glm_ortho_aabb_p(vec3 box[2], float padding, mat4 dest)
|
|
|
|
| set up orthographic projection matrix using bounding box
|
|
| bounding box (AABB) must be in view space
|
|
|
|
this version adds padding to box
|
|
|
|
Parameters:
|
|
| *[in]* **box** AABB
|
|
| *[in]* **padding** padding
|
|
| *[out]* **d** result matrix
|
|
|
|
.. c:function:: void glm_ortho_aabb_pz(vec3 box[2], float padding, mat4 dest)
|
|
|
|
| set up orthographic projection matrix using bounding box
|
|
| bounding box (AABB) must be in view space
|
|
|
|
this version adds Z padding to box
|
|
|
|
Parameters:
|
|
| *[in]* **box** AABB
|
|
| *[in]* **padding** padding for near and far
|
|
| *[out]* **d** result matrix
|
|
|
|
Returns:
|
|
square of norm / magnitude
|
|
|
|
.. c:function:: void glm_ortho_default(float aspect, mat4 dest)
|
|
|
|
| set up unit orthographic projection matrix
|
|
|
|
Parameters:
|
|
| *[in]* **aspect** aspect ration ( width / height )
|
|
| *[out]* **dest** result matrix
|
|
|
|
.. c:function:: void glm_ortho_default_s(float aspect, float size, mat4 dest)
|
|
|
|
| set up orthographic projection matrix with given CUBE size
|
|
|
|
Parameters:
|
|
| *[in]* **aspect** aspect ration ( width / height )
|
|
| *[in]* **size** cube size
|
|
| *[out]* **dest** result matrix
|
|
|
|
.. c:function:: void glm_perspective(float fovy, float aspect, float nearVal, float farVal, mat4 dest)
|
|
|
|
| set up perspective projection matrix
|
|
|
|
Parameters:
|
|
| *[in]* **fovy** field of view angle (in radians)
|
|
| *[in]* **aspect** aspect ratio ( width / height )
|
|
| *[in]* **nearVal** near clipping plane
|
|
| *[in]* **farVal** far clipping planes
|
|
| *[out]* **dest** result matrix
|
|
|
|
.. c:function:: void glm_persp_move_far(mat4 proj, float deltaFar)
|
|
|
|
| extend perspective projection matrix's far distance
|
|
|
|
| this function does not guarantee far >= near, be aware of that!
|
|
|
|
Parameters:
|
|
| *[in, out]* **proj** projection matrix to extend
|
|
| *[in]* **deltaFar** distance from existing far (negative to shink)
|
|
|
|
.. c:function:: void glm_perspective_default(float aspect, mat4 dest)
|
|
|
|
| set up perspective projection matrix with default near/far
|
|
and angle values
|
|
|
|
Parameters:
|
|
| *[in]* **aspect** aspect aspect ratio ( width / height )
|
|
| *[out]* **dest** result matrix
|
|
|
|
.. c:function:: void glm_perspective_resize(float aspect, mat4 proj)
|
|
|
|
| resize perspective matrix by aspect ratio ( width / height )
|
|
this makes very easy to resize proj matrix when window / viewport reized
|
|
|
|
Parameters:
|
|
| *[in]* **aspect** aspect ratio ( width / height )
|
|
| *[in, out]* **proj** perspective projection matrix
|
|
|
|
.. c:function:: void glm_lookat(vec3 eye, vec3 center, vec3 up, mat4 dest)
|
|
|
|
| set up view matrix
|
|
|
|
**NOTE:** The UP vector must not be parallel to the line of sight from the eye point to the reference point.
|
|
|
|
Parameters:
|
|
| *[in]* **eye** eye vector
|
|
| *[in]* **center** center vector
|
|
| *[in]* **up** up vector
|
|
| *[out]* **dest** result matrix
|
|
|
|
.. c:function:: void glm_look(vec3 eye, vec3 dir, vec3 up, mat4 dest)
|
|
|
|
| set up view matrix
|
|
|
|
convenient wrapper for :c:func:`glm_lookat`: if you only have direction not
|
|
target self then this might be useful. Because you need to get target
|
|
from direction.
|
|
|
|
**NOTE:** The UP vector must not be parallel to the line of sight from the eye point to the reference point.
|
|
|
|
Parameters:
|
|
| *[in]* **eye** eye vector
|
|
| *[in]* **dir** direction vector
|
|
| *[in]* **up** up vector
|
|
| *[out]* **dest** result matrix
|
|
|
|
.. c:function:: void glm_look_anyup(vec3 eye, vec3 dir, mat4 dest)
|
|
|
|
| set up view matrix
|
|
|
|
convenient wrapper for :c:func:`glm_look` if you only have direction
|
|
and if you don't care what UP vector is then this might be useful
|
|
to create view matrix
|
|
|
|
Parameters:
|
|
| *[in]* **eye** eye vector
|
|
| *[in]* **dir** direction vector
|
|
| *[out]* **dest** result matrix
|
|
|
|
.. c:function:: void glm_persp_decomp(mat4 proj, float *nearVal, float *farVal, float *top, float *bottom, float *left, float *right)
|
|
|
|
| decomposes frustum values of perspective projection.
|
|
|
|
Parameters:
|
|
| *[in]* **eye** perspective projection matrix
|
|
| *[out]* **nearVal** near
|
|
| *[out]* **farVal** far
|
|
| *[out]* **top** top
|
|
| *[out]* **bottom** bottom
|
|
| *[out]* **left** left
|
|
| *[out]* **right** right
|
|
|
|
.. c:function:: void glm_persp_decompv(mat4 proj, float dest[6])
|
|
|
|
| decomposes frustum values of perspective projection.
|
|
| this makes easy to get all values at once
|
|
|
|
Parameters:
|
|
| *[in]* **proj** perspective projection matrix
|
|
| *[out]* **dest** array
|
|
|
|
.. c:function:: void glm_persp_decomp_x(mat4 proj, float *left, float *right)
|
|
|
|
| decomposes left and right values of perspective projection.
|
|
| x stands for x axis (left / right axis)
|
|
|
|
Parameters:
|
|
| *[in]* **proj** perspective projection matrix
|
|
| *[out]* **left** left
|
|
| *[out]* **right** right
|
|
|
|
.. c:function:: void glm_persp_decomp_y(mat4 proj, float *top, float *bottom)
|
|
|
|
| decomposes top and bottom values of perspective projection.
|
|
| y stands for y axis (top / botom axis)
|
|
|
|
Parameters:
|
|
| *[in]* **proj** perspective projection matrix
|
|
| *[out]* **top** top
|
|
| *[out]* **bottom** bottom
|
|
|
|
.. c:function:: void glm_persp_decomp_z(mat4 proj, float *nearVal, float *farVal)
|
|
|
|
| decomposes near and far values of perspective projection.
|
|
| z stands for z axis (near / far axis)
|
|
|
|
Parameters:
|
|
| *[in]* **proj** perspective projection matrix
|
|
| *[out]* **nearVal** near
|
|
| *[out]* **farVal** far
|
|
|
|
.. c:function:: void glm_persp_decomp_far(mat4 proj, float * __restrict farVal)
|
|
|
|
| decomposes far value of perspective projection.
|
|
|
|
Parameters:
|
|
| *[in]* **proj** perspective projection matrix
|
|
| *[out]* **farVal** far
|
|
|
|
.. c:function:: void glm_persp_decomp_near(mat4 proj, float * __restrict nearVal)
|
|
|
|
| decomposes near value of perspective projection.
|
|
|
|
Parameters:
|
|
| *[in]* **proj** perspective projection matrix
|
|
| *[out]* **nearVal** near
|
|
|
|
.. c:function:: float glm_persp_fovy(mat4 proj)
|
|
|
|
| returns field of view angle along the Y-axis (in radians)
|
|
|
|
if you need to degrees, use glm_deg to convert it or use this:
|
|
fovy_deg = glm_deg(glm_persp_fovy(projMatrix))
|
|
|
|
Parameters:
|
|
| *[in]* **proj** perspective projection matrix
|
|
|
|
Returns:
|
|
| fovy in radians
|
|
|
|
.. c:function:: float glm_persp_aspect(mat4 proj)
|
|
|
|
| returns aspect ratio of perspective projection
|
|
|
|
Parameters:
|
|
| *[in]* **proj** perspective projection matrix
|
|
|
|
.. c:function:: void glm_persp_sizes(mat4 proj, float fovy, vec4 dest)
|
|
|
|
| returns sizes of near and far planes of perspective projection
|
|
|
|
Parameters:
|
|
| *[in]* **proj** perspective projection matrix
|
|
| *[in]* **fovy** fovy (see brief)
|
|
| *[out]* **dest** sizes order: [Wnear, Hnear, Wfar, Hfar]
|