Collision

2D & 3D collision detection — Rectangle, BoundingBox, Ray, sphere, line.

Collision reference

11 2D + 8 3D collision functions exposed as receiver methods on Rectangle, Vector2, Ray, BoundingBox, or via the Collision namespace for symmetric tests.

2D collision

Rectangle.collides(rect: Rectangle, other: Rectangle) -> Bool

Category: 2D · raylib: CheckCollisionRecs

Axis-aligned rect/rect overlap test. Workhorse for tile games, platformers, paddles.

if Rectangle.collides(paddle, ball) { -- reverse velocity }

raylib cheatsheet · Iron source · Test usage

Rectangle.intersection(rect: Rectangle, other: Rectangle) -> Rectangle

Category: 2D · raylib: GetCollisionRec

Overlap rectangle between two rects. Returns zero-sized rect if no overlap.

val overlap = Rectangle.intersection(paddle, ball)

raylib cheatsheet · Iron source · Test usage

Rectangle.contains_point(rect: Rectangle, point: Vector2) -> Bool

Category: 2D · raylib: CheckCollisionPointRec

Point-in-rectangle test. Common for mouse hover / click regions.

if Rectangle.contains_point(button, Mouse.get_position()) { -- hover }

raylib cheatsheet · Iron source · Test usage

Rectangle.collides_circle(rect: Rectangle, center: Vector2, radius: Float32) -> Bool

Category: 2D · raylib: CheckCollisionCircleRec

Circle-vs-rectangle overlap. Useful for circular hitboxes interacting with tile geometry.

if Rectangle.collides_circle(wall, ball_center, Float32(5.0)) { }

raylib cheatsheet · Iron source · Test usage

Vector2.inside_triangle(point: Vector2, p1, p2, p3: Vector2) -> Bool

Category: 2D · raylib: CheckCollisionPointTriangle

Point-in-triangle test.

if Vector2.inside_triangle(cursor, a, b, c) { }

raylib cheatsheet · Iron source · Test usage

Vector2.inside_polygon(point: Vector2, points: [Vector2]) -> Bool

Category: 2D · raylib: CheckCollisionPointPoly

Ray-casting point-in-polygon algorithm. Works for any simple polygon.

if Vector2.inside_polygon(cursor, hex_vertices) { }

raylib cheatsheet · Iron source · Test usage

Vector2.on_line(point: Vector2, p1, p2: Vector2, threshold: Int32) -> Bool

Category: 2D · raylib: CheckCollisionPointLine

Point-near-line-segment test. Threshold is pixel distance.

if Vector2.on_line(cursor, start, finish, Int32(5)) { }

raylib cheatsheet · Iron source · Test usage

Collision.circles(c1: Vector2, r1: Float32, c2: Vector2, r2: Float32) -> Bool

Category: 2D · raylib: CheckCollisionCircles

Circle-circle intersection test. Symmetric; uses Collision namespace.

if Collision.circles(a_pos, Float32(5.0), b_pos, Float32(5.0)) { }

raylib cheatsheet · Iron source · Test usage

Collision.circle_line(center: Vector2, radius: Float32, p1, p2: Vector2) -> Bool

Category: 2D · raylib: CheckCollisionCircleLine

Circle vs. line-segment intersection.

if Collision.circle_line(ball, Float32(5.0), wall_a, wall_b) { }

raylib cheatsheet · Iron source · Test usage

Collision.point_circle(point: Vector2, center: Vector2, radius: Float32) -> Bool

Category: 2D · raylib: CheckCollisionPointCircle

Point-in-circle test.

if Collision.point_circle(cursor, center, Float32(20.0)) { }

raylib cheatsheet · Iron source · Test usage

Collision.lines(start_a, end_a, start_b, end_b: Vector2) -> (Bool, Vector2)

Category: 2D · raylib: CheckCollisionLines

Line-segment vs line-segment intersection. Returns (hit, intersection-point).

val (hit, point) = Collision.lines(a1, a2, b1, b2)

raylib cheatsheet · Iron source · Test usage

3D collision

BoundingBox.collides(box: BoundingBox, other: BoundingBox) -> Bool

Category: 3D · raylib: CheckCollisionBoxes

AABB overlap. First-line broad-phase test for 3D worlds.

if BoundingBox.collides(player_bbox, enemy_bbox) { }

raylib cheatsheet · Iron source · Test usage

BoundingBox.collides_sphere(box: BoundingBox, center: Vector3, radius: Float32) -> Bool

Category: 3D · raylib: CheckCollisionBoxSphere

AABB vs sphere overlap.

if BoundingBox.collides_sphere(box, pos, Float32(1.0)) { }

raylib cheatsheet · Iron source · Test usage

Collision.spheres(c1: Vector3, r1: Float32, c2: Vector3, r2: Float32) -> Bool

Category: 3D · raylib: CheckCollisionSpheres

Sphere-sphere overlap.

if Collision.spheres(a_pos, Float32(1.0), b_pos, Float32(1.0)) { }

raylib cheatsheet · Iron source · Test usage

Ray.hit_sphere(ray: Ray, center: Vector3, radius: Float32) -> RayCollision

Category: 3D · raylib: GetRayCollisionSphere

Ray vs sphere intersection — RayCollision{ hit, distance, point, normal }.

val hit = Ray.hit_sphere(ray, enemy, Float32(1.0))
if hit.hit { }

raylib cheatsheet · Iron source · Test usage

Ray.hit_box(ray: Ray, box: BoundingBox) -> RayCollision

Category: 3D · raylib: GetRayCollisionBox

Ray vs axis-aligned bounding box.

val hit = Ray.hit_box(ray, Model.bounding_box(model))

raylib cheatsheet · Iron source · Test usage

Ray.hit_mesh(ray: Ray, mesh: Mesh, transform: Matrix) -> RayCollision

Category: 3D · raylib: GetRayCollisionMesh

Ray vs per-triangle mesh test with world transform. Expensive — usually gated on BBox test first.

val hit = Ray.hit_mesh(ray, mesh, Matrix.identity())

raylib cheatsheet · Iron source · Test usage

Ray.hit_triangle(ray: Ray, p1, p2, p3: Vector3) -> RayCollision

Category: 3D · raylib: GetRayCollisionTriangle

Ray vs triangle.

val hit = Ray.hit_triangle(ray, a, b, c)

raylib cheatsheet · Iron source · Test usage

Ray.hit_quad(ray: Ray, p1, p2, p3, p4: Vector3) -> RayCollision

Category: 3D · raylib: GetRayCollisionQuad

Ray vs quad (4 vertices). Raylib splits internally into two triangles.

val hit = Ray.hit_quad(ray, tl, tr, br, bl)

raylib cheatsheet · Iron source · Test usage

See also