Jump to content

Connect SuperML | Leeroopedia MCP: Equip your AI agents with best practices, code verification, and debugging knowledge. Powered by Leeroo — building Organizational Superintelligence. Contact us at founders@leeroo.com.

Implementation:Google deepmind Mujoco Engine Ray

From Leeroopedia
Revision as of 12:45, 16 February 2026 by Admin (talk | contribs) (Auto-imported from implementations/Google_deepmind_Mujoco_Engine_Ray.md)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Knowledge Sources
Domains Physics Simulation, Ray Casting, Collision Detection
Last Updated 2026-02-15 04:00 GMT

Overview

Implements ray casting against all MuJoCo geometry types for distance queries, sensor simulation, and selection.

Description

engine_ray.c provides a comprehensive ray casting system that can test rays against all MuJoCo geometry primitives (plane, sphere, capsule, ellipsoid, cylinder, box), as well as triangle meshes, height fields, flex elements, and skins. Rays are mapped to local geometry frames for intersection testing, with analytic solutions for quadric surfaces and iterative methods for SDFs. The system supports body exclusion, geometry group filtering, static body filtering, and bounding volume hierarchy (BVH) acceleration via mju_rayTree and mju_raySlab. Multi-ray batched queries are supported for efficient sensor simulation (e.g., LIDAR), with a preparation phase that precomputes BVH traversal data shared across rays.

Usage

Called via mj_ray() for single ray queries against the full scene, or via mj_multiRay() for batched ray queries from a common origin. Individual geometry tests are available through mju_rayGeom(). Used internally by rangefinder sensors and externally for mouse picking and distance queries.

Code Reference

Source Location

Key Functions

// single ray cast against all geoms in the scene
mjtNum mj_ray(const mjModel* m, const mjData* d, const mjtNum pnt[3],
              const mjtNum vec[3], const mjtByte* geomgroup,
              mjtByte flg_static, int bodyexclude, int geomid[1]);

// batched multi-ray queries from common origin
void mj_multiRay(const mjModel* m, mjData* d, const mjtNum pnt[3],
                 const mjtNum* vec, const mjtByte* geomgroup,
                 mjtByte flg_static, int bodyexclude,
                 int* geomid, mjtNum* dist, int nray, mjtNum cutoff);

// prepare shared data for multi-ray
void mju_multiRayPrepare(const mjModel* m, const mjData* d,
                         const mjtNum pnt[3], const mjtByte* geomgroup,
                         mjtByte flg_static, int bodyexclude, ...);

// ray-geom intersection for a single primitive
mjtNum mju_rayGeom(const mjtNum pos[3], const mjtNum mat[9],
                   const mjtNum size[3], const mjtNum pnt[3],
                   const mjtNum vec[3], int geomtype);

// ray-mesh intersection using BVH
mjtNum mj_rayMesh(const mjModel* m, const mjData* d, int id,
                  const mjtNum pnt[3], const mjtNum vec[3]);

// ray-heightfield intersection
mjtNum mj_rayHfield(const mjModel* m, const mjData* d, int geomid,
                    const mjtNum pnt[3], const mjtNum vec[3]);

// ray-BVH intersection (AABB slab test)
int mju_raySlab(const mjtNum aabb[6], const mjtNum xpos[3],
                const mjtNum xmat[9], const mjtNum pnt[3],
                const mjtNum vec[3], mjtNum* t);

// ray-BVH tree traversal
mjtNum mju_rayTree(const mjModel* m, const mjData* d, int id,
                   const mjtNum pnt[3], const mjtNum vec[3]);

// ray-flex intersection
mjtNum mj_rayFlex(const mjModel* m, const mjData* d, int flex_layer,
                  int flexid, int exclude_bodyid,
                  const mjtNum pnt[3], const mjtNum vec[3]);

// ray-skin intersection
mjtNum mju_raySkin(int nface, int nvert, const int* face,
                   const float* vert, const mjtNum pnt[3],
                   const mjtNum vec[3], int vertid[1]);

Import

#include "engine/engine_ray.h"

I/O Contract

Inputs

Name Type Required Description
m const mjModel* Yes Physics model with geometry data
d const mjData* Yes Simulation state with geometry poses
pnt const mjtNum[3] Yes Ray origin point
vec const mjtNum[3] Yes Ray direction vector
geomgroup const mjtByte* No Group inclusion mask (NULL for all)
flg_static mjtByte Yes Include static (world-welded) geoms
bodyexclude int Yes Body ID to exclude (-1 for none)
nray int Yes (multiRay) Number of rays in batch
cutoff mjtNum Yes (multiRay) Maximum ray distance

Outputs

Name Type Description
return (mj_ray) mjtNum Distance to nearest intersection (-1 if no hit)
geomid int[1] ID of intersected geom (-1 if no hit)
dist mjtNum* Per-ray distances (multiRay)

Related Pages

Page Connections

Double-click a node to navigate. Hold to expand connections.
Principle
Implementation
Heuristic
Environment