Header: cglm/ray.h

This is for collision-checks used by ray-tracers and the like.

Table of contents (click to go):


  1. glm_ray_triangle()

  2. glm_ray_sphere()

  3. glm_ray_at()

Functions documentation

bool glm_ray_triangle(vec3 origin, vec3 direction, vec3 v0, vec3 v1, vec3 v2, float *d)

MΓΆller–Trumbore ray-triangle intersection algorithm

[in] origin origin of ray
[in] direction direction of ray
[in] v0 first vertex of triangle
[in] v1 second vertex of triangle
[in] v2 third vertex of triangle
[in, out] d float pointer to save distance to intersection
[out] intersection whether there is intersection
bool glm_ray_sphere(vec3 origin, vec3 dir, vec4 s, float *__restrict t1, float *__restrict t2)

ray sphere intersection

returns false if there is no intersection if true:

  • t1 > 0, t2 > 0: ray intersects the sphere at t1 and t2 both ahead of the origin

  • t1 < 0, t2 > 0: ray starts inside the sphere, exits at t2

  • t1 < 0, t2 < 0: no intersection ahead of the ray ( returns false )

  • the caller can check if the intersection points (t1 and t2) fall within a specific range (for example, tmin < t1, t2 < tmax) to determine if the intersections are within a desired segment of the ray

[in] origin ray origin
[in] dir normalized ray direction
[in] s sphere [center.x, center.y, center.z, radii]
[out] t1 near point1 (closer to origin)
[out] t2 far point2 (farther from origin)
whether there is intersection
bool glm_ray_at(vec3 orig, vec3 dir, float t, vec3 point)

point using t by 𝐏(𝑑)=𝐀+𝑑𝐛

[in] origin ray origin
[in] dir ray direction
[out] t parameter
[out] point point at t
point at t