Rapier C — 3D / f32 0.36.0+c.0
Loading...
Searching...
No Matches
URDF and MJCF import

Available only with RAPIER_ROBOTICS in 3D/f32. More...

Data Structures

struct  R3UrdfLoaderOptions
 Loader configuration. More...
struct  R3MjcfLoaderOptions
 Loader configuration. More...
struct  R3RenderMaterial
 Imported physically based visual material; no texture ownership. More...
struct  R3MjcfVisualMeshInfo
 Copied metadata for a borrowed MJCF visual mesh. More...

Macros

#define R3_MESH_CONVERTER_TRIMESH   0
 Load each mesh as a triangle mesh, with the given trimesh flags.
#define R3_MESH_CONVERTER_OBB   1
 Replace each mesh by its oriented bounding box.
#define R3_MESH_CONVERTER_AABB   2
 Replace each mesh by its axis-aligned bounding box.
#define R3_MESH_CONVERTER_CONVEX_HULL   3
 Replace each mesh by its convex hull.
#define R3_MESH_CONVERTER_CONVEX_DECOMPOSITION   4
 Replace each mesh by its convex decomposition.

Typedefs

typedef struct R3LoadedMeshes R3LoadedMeshes
 Shapes loaded from a mesh file (STL, COLLADA or Wavefront OBJ), one per mesh of the file.
typedef struct R3MjcfContactHooks R3MjcfContactHooks
 Owned physics hooks applying the <contact> rules (excluded pairs, pair friction) of an inserted MJCF robot.
typedef struct R3MjcfRobot R3MjcfRobot
 Loaded MJCF robot and its visual/keyframe data.
typedef struct R3MjcfRobotHandles R3MjcfRobotHandles
 Owned container of borrowed handles and actuators of an inserted MJCF robot.
typedef struct R3UrdfRobot R3UrdfRobot
 Loaded URDF robot; insertion clones its simulation objects.
typedef struct R3UrdfRobotHandles R3UrdfRobotHandles
 Owned container of borrowed handles to an inserted URDF robot.
typedef struct R3UrdfLoaderOptions R3UrdfLoaderOptions
 Loader configuration.
typedef struct R3MjcfLoaderOptions R3MjcfLoaderOptions
 Loader configuration.
typedef struct R3MjcfVisualMesh R3MjcfVisualMesh
 A borrowed visual declaration, valid until its robot is freed or its body storage changes.
typedef struct R3RenderMaterial R3RenderMaterial
 Imported physically based visual material; no texture ownership.
typedef struct R3MjcfVisualMeshInfo R3MjcfVisualMeshInfo
 Copied metadata for a borrowed MJCF visual mesh.

Functions

struct R3UrdfLoaderOptions r3DefaultUrdfLoaderOptions (void)
 Return native default urdf loader options.
R3Status r3FreeUrdfRobot (struct R3UrdfRobot *object)
 Release an owned urdf robot.
struct R3UrdfRobot * r3UrdfRobotFromFile (const char *path, const struct R3UrdfLoaderOptions *options)
 Load from a UTF-8 path.
R3Status r3UrdfRobot_AppendTransform (struct R3UrdfRobot *robot, struct R3Pose transform)
 Apply an additional transform to the loaded robot before insertion.
R3Status r3FreeUrdfRobotHandles (struct R3UrdfRobotHandles *handles)
 Release an owned urdf robot handles.
struct R3UrdfRobotHandles * r3UrdfRobot_InsertUsingImpulseJoints (struct R3World *world, const struct R3UrdfRobot *robot)
 Inserts a clone; the source robot remains owned by the caller.
struct R3UrdfRobotHandles * r3UrdfRobot_InsertUsingMultibodyJoints (struct R3World *world, const struct R3UrdfRobot *robot, uint8_t options)
 Inserts a clone; the source robot remains owned by the caller.
size_t r3UrdfRobotHandles_Bodies (const struct R3UrdfRobotHandles *handles, struct R3RigidBodyHandle *buffer, size_t capacity)
 One body handle per imported URDF link, in source order.
struct R3MjcfLoaderOptions r3DefaultMjcfLoaderOptions (void)
 Return native default mjcf loader options.
R3Status r3FreeMjcfRobot (struct R3MjcfRobot *object)
 Release an owned mjcf robot.
struct R3MjcfRobot * r3MjcfRobotFromFile (const char *path, const struct R3MjcfLoaderOptions *options)
 Load from a UTF-8 path.
R3Status r3MjcfRobot_AppendTransform (struct R3MjcfRobot *robot, struct R3Pose transform)
 Apply an additional transform to the loaded robot before insertion.
R3Status r3FreeMjcfRobotHandles (struct R3MjcfRobotHandles *handles)
 Release an owned mjcf robot handles.
struct R3MjcfRobotHandles * r3MjcfRobot_InsertUsingImpulseJoints (struct R3World *world, const struct R3MjcfRobot *robot)
 Inserts a clone; the source robot remains owned by the caller.
struct R3MjcfRobotHandles * r3MjcfRobot_InsertUsingMultibodyJoints (struct R3World *world, const struct R3MjcfRobot *robot, uint8_t options)
 Inserts a clone; the source robot remains owned by the caller.
size_t r3MjcfRobotHandles_Bodies (const struct R3MjcfRobotHandles *handles, struct R3RigidBodyHandle *buffer, size_t capacity)
 Body handles in source order; absent MJCF bodies have invalid handles.
struct R3Vector r3MjcfRobot_Gravity (const struct R3MjcfRobot *robot)
 Resolved model gravity before the caller chooses a world convention.
size_t r3MjcfRobot_BodyCount (const struct R3MjcfRobot *robot)
 Return the number of source MJCF bodies.
size_t r3MjcfRobot_BodyColliderCount (const struct R3MjcfRobot *robot, size_t body)
 Return the collider count for a source body index.
R3Status r3MjcfRobot_SetBodyColliderCollisionGroups (struct R3MjcfRobot *robot, size_t body, size_t collider, struct R3InteractionGroups groups)
 Set collision groups on a collider in the loaded robot, before insertion.
size_t r3MjcfRobot_KeyframeCount (const struct R3MjcfRobot *robot)
 Return the number of imported keyframes.
size_t r3MjcfRobot_KeyframeName (const struct R3MjcfRobot *robot, size_t key, char *buffer, size_t capacity)
 Copies a NUL-terminated UTF-8 name.
R3Status r3MjcfRobot_AppendKeyframe (struct R3MjcfRobot *robot, const struct R3MjcfRobot *source, size_t key)
 Append a keyframe from the source MJCF model to the loaded robot.
size_t r3MjcfRobot_KeyframeControls (const struct R3MjcfRobot *robot, size_t key, R3Real *buffer, size_t capacity)
 Copy actuator controls for the selected keyframe.
size_t r3MjcfRobotHandles_ActuatorCount (const struct R3MjcfRobotHandles *handles)
 Return the number of imported actuators.
R3Status r3MjcfRobotHandles_ApplyKeyframe (const struct R3MjcfRobotHandles *handles, const struct R3MjcfRobot *robot, size_t key)
 Apply the selected keyframe to the inserted robot.
R3Status r3MjcfRobotHandles_ApplyControlsScaled (const struct R3MjcfRobotHandles *handles, const R3Real *controls, size_t count, R3Real gain)
 Apply actuator controls with per-actuator scaling to the inserted robot.
size_t r3MjcfRobot_BodyVisualCount (const struct R3MjcfRobot *robot, size_t body)
 Return the number of visual meshes for a source body.
const R3MjcfVisualMesh * r3MjcfRobot_BodyVisual (const struct R3MjcfRobot *robot, size_t body, size_t visual)
 Borrow a visual mesh by body/visual index.
struct R3MjcfVisualMeshInfo r3MjcfVisualMesh_Info (const R3MjcfVisualMesh *visual)
 Return a copy of visual pose, color, material, and geometry-kind flags.
R3SharedShape * r3MjcfVisualMesh_CloneShape (const R3MjcfVisualMesh *visual)
 Returns an owned shared shape reference.
size_t r3MjcfVisualMesh_Uvs (const R3MjcfVisualMesh *visual, float *buffer, size_t capacity)
 Copies flattened pairs of per-vertex UV coordinates.
size_t r3MjcfVisualMesh_Normals (const R3MjcfVisualMesh *visual, float *buffer, size_t capacity)
 Copies flattened triples of per-vertex normals.
size_t r3MjcfVisualMesh_Texture (const R3MjcfVisualMesh *visual, char *buffer, size_t capacity)
 Copies a NUL-terminated texture path, or an empty string for untextured meshes.
struct R3UrdfRobot * r3UrdfRobotFromString (const char *urdf, const char *mesh_dir, const struct R3UrdfLoaderOptions *options)
 Load a URDF robot from a NUL-terminated UTF-8 string.
R3Status r3FreeMjcfContactHooks (struct R3MjcfContactHooks *hooks)
 Release owned MJCF contact hooks.
struct R3MjcfContactHooks * r3MjcfRobotHandles_ContactHooks (const struct R3MjcfRobotHandles *handles, const struct R3MjcfRobot *robot)
 Build the contact rules of an inserted MJCF robot.
struct R3PhysicsHooks r3MjcfContactHooks_PhysicsHooks (const struct R3MjcfContactHooks *hooks)
 Return physics hooks forwarding to these contact rules, with hooks as their user_data.
R3Status r3FreeLoadedMeshes (struct R3LoadedMeshes *meshes)
 Release owned loaded meshes.
struct R3LoadedMeshes * r3LoadedMeshesFromFile (const char *path, uint32_t converter, uint32_t trimesh_flags, struct R3Vector scale)
 Load every mesh of a file from a UTF-8 path and convert it into a shape with converter (an R3_MESH_CONVERTER_* value).
size_t r3LoadedMeshes_Count (const struct R3LoadedMeshes *meshes)
 Return the number of meshes read from the file, including those that failed to convert.
R3SharedShape * r3LoadedMeshes_CloneShape (const struct R3LoadedMeshes *meshes, size_t index)
 Return an owned shape wrapper sharing the geometry of a loaded mesh.
struct R3Pose r3LoadedMeshes_Pose (const struct R3LoadedMeshes *meshes, size_t index)
 Return the pose to give the shape of a loaded mesh (for example the center of its bounding box).

Detailed Description

Available only with RAPIER_ROBOTICS in 3D/f32.

Loaded robots and insertion-result containers are independently owned; freeing these containers does not remove the world's inserted entities. Visual pointers borrow the loaded MJCF robot.

Macro Definition Documentation

◆ R3_MESH_CONVERTER_AABB

#define R3_MESH_CONVERTER_AABB   2

Replace each mesh by its axis-aligned bounding box.

◆ R3_MESH_CONVERTER_CONVEX_DECOMPOSITION

#define R3_MESH_CONVERTER_CONVEX_DECOMPOSITION   4

Replace each mesh by its convex decomposition.

◆ R3_MESH_CONVERTER_CONVEX_HULL

#define R3_MESH_CONVERTER_CONVEX_HULL   3

Replace each mesh by its convex hull.

◆ R3_MESH_CONVERTER_OBB

#define R3_MESH_CONVERTER_OBB   1

Replace each mesh by its oriented bounding box.

◆ R3_MESH_CONVERTER_TRIMESH

#define R3_MESH_CONVERTER_TRIMESH   0

Load each mesh as a triangle mesh, with the given trimesh flags.

Typedef Documentation

◆ R3LoadedMeshes

Shapes loaded from a mesh file (STL, COLLADA or Wavefront OBJ), one per mesh of the file.

Release with the matching Free function.

◆ R3MjcfContactHooks

Owned physics hooks applying the <contact> rules (excluded pairs, pair friction) of an inserted MJCF robot.

Release with the matching Free function.

◆ R3MjcfLoaderOptions

typedef struct R3MjcfLoaderOptions R3MjcfLoaderOptions

Loader configuration.

Initialize with DefaultMjcfLoaderOptions; no destructor. Blueprint array views and shared shapes are borrowed through the load call.

◆ R3MjcfRobot

typedef struct R3MjcfRobot R3MjcfRobot

Loaded MJCF robot and its visual/keyframe data.

Release with the matching Free function.

◆ R3MjcfRobotHandles

Owned container of borrowed handles and actuators of an inserted MJCF robot.

Release with the matching Free function.

◆ R3MjcfVisualMesh

A borrowed visual declaration, valid until its robot is freed or its body storage changes.

◆ R3MjcfVisualMeshInfo

typedef struct R3MjcfVisualMeshInfo R3MjcfVisualMeshInfo

Copied metadata for a borrowed MJCF visual mesh.

◆ R3RenderMaterial

typedef struct R3RenderMaterial R3RenderMaterial

Imported physically based visual material; no texture ownership.

◆ R3UrdfLoaderOptions

typedef struct R3UrdfLoaderOptions R3UrdfLoaderOptions

Loader configuration.

Initialize with DefaultUrdfLoaderOptions; no destructor. Blueprint array views and shared shapes are borrowed through the load call.

◆ R3UrdfRobot

typedef struct R3UrdfRobot R3UrdfRobot

Loaded URDF robot; insertion clones its simulation objects.

Release with the matching Free function.

◆ R3UrdfRobotHandles

Owned container of borrowed handles to an inserted URDF robot.

Release with the matching Free function.

Function Documentation

◆ r3DefaultMjcfLoaderOptions()

struct R3MjcfLoaderOptions r3DefaultMjcfLoaderOptions ( void )

Return native default mjcf loader options.

This POD value owns no resources.

◆ r3DefaultUrdfLoaderOptions()

struct R3UrdfLoaderOptions r3DefaultUrdfLoaderOptions ( void )

Return native default urdf loader options.

This POD value owns no resources.

◆ r3FreeLoadedMeshes()

R3Status r3FreeLoadedMeshes ( struct R3LoadedMeshes * meshes)

Release owned loaded meshes.

NULL is allowed. Do not pass borrowed pointers or free the object twice.

◆ r3FreeMjcfContactHooks()

R3Status r3FreeMjcfContactHooks ( struct R3MjcfContactHooks * hooks)

Release owned MJCF contact hooks.

NULL is allowed. Do not free them while a step still uses them, and do not free them twice.

◆ r3FreeMjcfRobot()

R3Status r3FreeMjcfRobot ( struct R3MjcfRobot * object)

Release an owned mjcf robot.

NULL is allowed. Do not pass borrowed pointers or free the object twice.

◆ r3FreeMjcfRobotHandles()

R3Status r3FreeMjcfRobotHandles ( struct R3MjcfRobotHandles * handles)

Release an owned mjcf robot handles.

NULL is allowed. Do not pass borrowed pointers or free the object twice.

◆ r3FreeUrdfRobot()

R3Status r3FreeUrdfRobot ( struct R3UrdfRobot * object)

Release an owned urdf robot.

NULL is allowed. Do not pass borrowed pointers or free the object twice.

◆ r3FreeUrdfRobotHandles()

R3Status r3FreeUrdfRobotHandles ( struct R3UrdfRobotHandles * handles)

Release an owned urdf robot handles.

NULL is allowed. Do not pass borrowed pointers or free the object twice.

◆ r3LoadedMeshes_CloneShape()

R3SharedShape * r3LoadedMeshes_CloneShape ( const struct R3LoadedMeshes * meshes,
size_t index )

Return an owned shape wrapper sharing the geometry of a loaded mesh.

Release it with FreeSharedShape. Returns NULL with INVALID_ARGUMENT if the index is out of range or if that mesh failed to convert.

◆ r3LoadedMeshes_Count()

size_t r3LoadedMeshes_Count ( const struct R3LoadedMeshes * meshes)

Return the number of meshes read from the file, including those that failed to convert.

◆ r3LoadedMeshes_Pose()

struct R3Pose r3LoadedMeshes_Pose ( const struct R3LoadedMeshes * meshes,
size_t index )

Return the pose to give the shape of a loaded mesh (for example the center of its bounding box).

Reports INVALID_ARGUMENT if the index is out of range or if that mesh failed to convert.

◆ r3LoadedMeshesFromFile()

struct R3LoadedMeshes * r3LoadedMeshesFromFile ( const char * path,
uint32_t converter,
uint32_t trimesh_flags,
struct R3Vector scale )

Load every mesh of a file from a UTF-8 path and convert it into a shape with converter (an R3_MESH_CONVERTER_* value).

trimesh_flags (R3_TRIMESH_* bits) apply to R3_MESH_CONVERTER_TRIMESH and must be 0 otherwise. scale multiplies the vertices before conversion. A mesh failing to convert does not fail the load; see r3LoadedMeshes_CloneShape.

◆ r3MjcfContactHooks_PhysicsHooks()

struct R3PhysicsHooks r3MjcfContactHooks_PhysicsHooks ( const struct R3MjcfContactHooks * hooks)

Return physics hooks forwarding to these contact rules, with hooks as their user_data.

Pass them to r3Step; hooks must outlive every step using them. The inserted colliders already enable the contact-filtering and contact-modification hooks.

◆ r3MjcfRobot_AppendKeyframe()

R3Status r3MjcfRobot_AppendKeyframe ( struct R3MjcfRobot * robot,
const struct R3MjcfRobot * source,
size_t key )

Append a keyframe from the source MJCF model to the loaded robot.

◆ r3MjcfRobot_AppendTransform()

R3Status r3MjcfRobot_AppendTransform ( struct R3MjcfRobot * robot,
struct R3Pose transform )

Apply an additional transform to the loaded robot before insertion.

◆ r3MjcfRobot_BodyColliderCount()

size_t r3MjcfRobot_BodyColliderCount ( const struct R3MjcfRobot * robot,
size_t body )

Return the collider count for a source body index.

◆ r3MjcfRobot_BodyCount()

size_t r3MjcfRobot_BodyCount ( const struct R3MjcfRobot * robot)

Return the number of source MJCF bodies.

◆ r3MjcfRobot_BodyVisual()

const R3MjcfVisualMesh * r3MjcfRobot_BodyVisual ( const struct R3MjcfRobot * robot,
size_t body,
size_t visual )

Borrow a visual mesh by body/visual index.

Valid until the robot is freed or its storage changes; never free this pointer.

◆ r3MjcfRobot_BodyVisualCount()

size_t r3MjcfRobot_BodyVisualCount ( const struct R3MjcfRobot * robot,
size_t body )

Return the number of visual meshes for a source body.

◆ r3MjcfRobot_Gravity()

struct R3Vector r3MjcfRobot_Gravity ( const struct R3MjcfRobot * robot)

Resolved model gravity before the caller chooses a world convention.

◆ r3MjcfRobot_InsertUsingImpulseJoints()

struct R3MjcfRobotHandles * r3MjcfRobot_InsertUsingImpulseJoints ( struct R3World * world,
const struct R3MjcfRobot * robot )

Inserts a clone; the source robot remains owned by the caller.

Returns owned handles.

◆ r3MjcfRobot_InsertUsingMultibodyJoints()

struct R3MjcfRobotHandles * r3MjcfRobot_InsertUsingMultibodyJoints ( struct R3World * world,
const struct R3MjcfRobot * robot,
uint8_t options )

Inserts a clone; the source robot remains owned by the caller.

Returns owned handles.

◆ r3MjcfRobot_KeyframeControls()

size_t r3MjcfRobot_KeyframeControls ( const struct R3MjcfRobot * robot,
size_t key,
R3Real * buffer,
size_t capacity )

Copy actuator controls for the selected keyframe.

See also
Arrays and output buffers

◆ r3MjcfRobot_KeyframeCount()

size_t r3MjcfRobot_KeyframeCount ( const struct R3MjcfRobot * robot)

Return the number of imported keyframes.

◆ r3MjcfRobot_KeyframeName()

size_t r3MjcfRobot_KeyframeName ( const struct R3MjcfRobot * robot,
size_t key,
char * buffer,
size_t capacity )

Copies a NUL-terminated UTF-8 name.

Count includes NUL; unnamed keys return an empty string.

See also
Arrays and output buffers

◆ r3MjcfRobot_SetBodyColliderCollisionGroups()

R3Status r3MjcfRobot_SetBodyColliderCollisionGroups ( struct R3MjcfRobot * robot,
size_t body,
size_t collider,
struct R3InteractionGroups groups )

Set collision groups on a collider in the loaded robot, before insertion.

◆ r3MjcfRobotFromFile()

struct R3MjcfRobot * r3MjcfRobotFromFile ( const char * path,
const struct R3MjcfLoaderOptions * options )

Load from a UTF-8 path.

Validates options before reading the file. Options and their blueprint resources are borrowed through this call; the robot is owned.

◆ r3MjcfRobotHandles_ActuatorCount()

size_t r3MjcfRobotHandles_ActuatorCount ( const struct R3MjcfRobotHandles * handles)

Return the number of imported actuators.

◆ r3MjcfRobotHandles_ApplyControlsScaled()

R3Status r3MjcfRobotHandles_ApplyControlsScaled ( const struct R3MjcfRobotHandles * handles,
const R3Real * controls,
size_t count,
R3Real gain )

Apply actuator controls with per-actuator scaling to the inserted robot.

◆ r3MjcfRobotHandles_ApplyKeyframe()

R3Status r3MjcfRobotHandles_ApplyKeyframe ( const struct R3MjcfRobotHandles * handles,
const struct R3MjcfRobot * robot,
size_t key )

Apply the selected keyframe to the inserted robot.

◆ r3MjcfRobotHandles_Bodies()

size_t r3MjcfRobotHandles_Bodies ( const struct R3MjcfRobotHandles * handles,
struct R3RigidBodyHandle * buffer,
size_t capacity )

Body handles in source order; absent MJCF bodies have invalid handles.

See also
Arrays and output buffers

◆ r3MjcfRobotHandles_ContactHooks()

struct R3MjcfContactHooks * r3MjcfRobotHandles_ContactHooks ( const struct R3MjcfRobotHandles * handles,
const struct R3MjcfRobot * robot )

Build the contact rules of an inserted MJCF robot.

robot must be the robot these handles were inserted from. The rules refer to the inserted colliders; the returned hooks are owned.

◆ r3MjcfVisualMesh_CloneShape()

R3SharedShape * r3MjcfVisualMesh_CloneShape ( const R3MjcfVisualMesh * visual)

Returns an owned shared shape reference.

Returns an owned shape wrapper sharing the geometry. Release it with FreeSharedShape.

◆ r3MjcfVisualMesh_Info()

struct R3MjcfVisualMeshInfo r3MjcfVisualMesh_Info ( const R3MjcfVisualMesh * visual)

Return a copy of visual pose, color, material, and geometry-kind flags.

◆ r3MjcfVisualMesh_Normals()

size_t r3MjcfVisualMesh_Normals ( const R3MjcfVisualMesh * visual,
float * buffer,
size_t capacity )

Copies flattened triples of per-vertex normals.

See also
Arrays and output buffers

◆ r3MjcfVisualMesh_Texture()

size_t r3MjcfVisualMesh_Texture ( const R3MjcfVisualMesh * visual,
char * buffer,
size_t capacity )

Copies a NUL-terminated texture path, or an empty string for untextured meshes.

See also
Arrays and output buffers

◆ r3MjcfVisualMesh_Uvs()

size_t r3MjcfVisualMesh_Uvs ( const R3MjcfVisualMesh * visual,
float * buffer,
size_t capacity )

Copies flattened pairs of per-vertex UV coordinates.

See also
Arrays and output buffers

◆ r3UrdfRobot_AppendTransform()

R3Status r3UrdfRobot_AppendTransform ( struct R3UrdfRobot * robot,
struct R3Pose transform )

Apply an additional transform to the loaded robot before insertion.

◆ r3UrdfRobot_InsertUsingImpulseJoints()

struct R3UrdfRobotHandles * r3UrdfRobot_InsertUsingImpulseJoints ( struct R3World * world,
const struct R3UrdfRobot * robot )

Inserts a clone; the source robot remains owned by the caller.

Returns owned handles.

◆ r3UrdfRobot_InsertUsingMultibodyJoints()

struct R3UrdfRobotHandles * r3UrdfRobot_InsertUsingMultibodyJoints ( struct R3World * world,
const struct R3UrdfRobot * robot,
uint8_t options )

Inserts a clone; the source robot remains owned by the caller.

Returns owned handles.

◆ r3UrdfRobotFromFile()

struct R3UrdfRobot * r3UrdfRobotFromFile ( const char * path,
const struct R3UrdfLoaderOptions * options )

Load from a UTF-8 path.

Validates options before reading the file. Options and their blueprint resources are borrowed through this call; the robot is owned.

◆ r3UrdfRobotFromString()

struct R3UrdfRobot * r3UrdfRobotFromString ( const char * urdf,
const char * mesh_dir,
const struct R3UrdfLoaderOptions * options )

Load a URDF robot from a NUL-terminated UTF-8 string.

Relative mesh paths are resolved from mesh_dir (NULL resolves them from the current directory). Options and their blueprint resources are borrowed through this call; the robot is owned.

◆ r3UrdfRobotHandles_Bodies()

size_t r3UrdfRobotHandles_Bodies ( const struct R3UrdfRobotHandles * handles,
struct R3RigidBodyHandle * buffer,
size_t capacity )

One body handle per imported URDF link, in source order.

Links merged away by squeezeEmptyFixedLinks have no entry.

See also
Arrays and output buffers