ColliderBuilder

Struct ColliderBuilder 

Source
pub struct ColliderBuilder {
Show 17 fields pub shape: SharedShape, pub mass_properties: ColliderMassProps, pub friction: f32, pub friction_combine_rule: CoefficientCombineRule, pub restitution: f32, pub restitution_combine_rule: CoefficientCombineRule, pub position: Isometry<f32>, pub is_sensor: bool, pub active_collision_types: ActiveCollisionTypes, pub active_hooks: ActiveHooks, pub active_events: ActiveEvents, pub user_data: u128, pub collision_groups: InteractionGroups, pub solver_groups: InteractionGroups, pub enabled: bool, pub contact_force_event_threshold: f32, pub contact_skin: f32,
}
Expand description

A builder for creating colliders with custom shapes and properties.

This builder lets you create collision shapes and configure their physical properties (friction, bounciness, density, etc.) before adding them to your world.

§Common shapes

§Example

// Create a bouncy ball
let collider = ColliderBuilder::ball(0.5)
    .restitution(0.9)       // Very bouncy
    .friction(0.1)          // Low friction (slippery)
    .density(2.0);           // Heavy material
colliders.insert_with_parent(collider, body_handle, &mut bodies);

Fields§

§shape: SharedShape

The shape of the collider to be built.

§mass_properties: ColliderMassProps

Controls the way the collider’s mass-properties are computed.

§friction: f32

The friction coefficient of the collider to be built.

§friction_combine_rule: CoefficientCombineRule

The rule used to combine two friction coefficients.

§restitution: f32

The restitution coefficient of the collider to be built.

§restitution_combine_rule: CoefficientCombineRule

The rule used to combine two restitution coefficients.

§position: Isometry<f32>

The position of this collider.

§is_sensor: bool

Is this collider a sensor?

§active_collision_types: ActiveCollisionTypes

Contact pairs enabled for this collider.

§active_hooks: ActiveHooks

Physics hooks enabled for this collider.

§active_events: ActiveEvents

Events enabled for this collider.

§user_data: u128

The user-data of the collider being built.

§collision_groups: InteractionGroups

The collision groups for the collider being built.

§solver_groups: InteractionGroups

The solver groups for the collider being built.

§enabled: bool

Will the collider being built be enabled?

§contact_force_event_threshold: f32

The total force magnitude beyond which a contact force event can be emitted.

§contact_skin: f32

An extra thickness around the collider shape to keep them further apart when colliding.

Implementations§

Source§

impl ColliderBuilder

Source

pub fn new(shape: SharedShape) -> Self

Initialize a new collider builder with the given shape.

Source

pub fn compound(shapes: Vec<(Isometry<f32>, SharedShape)>) -> Self

Initialize a new collider builder with a compound shape.

Source

pub fn ball(radius: f32) -> Self

Creates a sphere (3D) or circle (2D) collider.

The simplest and fastest collision shape. Use for:

  • Balls and spheres
  • Approximate round objects
  • Projectiles
  • Particles
§Parameters
  • radius - The sphere’s radius
Source

pub fn halfspace(outward_normal: Unit<Vector<f32>>) -> Self

Initialize a new collider build with a half-space shape defined by the outward normal of its planar boundary.

Source

pub fn voxels(voxel_size: Vector<f32>, voxels: &[Point<i32>]) -> Self

Initializes a shape made of voxels.

Each voxel has the size voxel_size and grid coordinate given by voxels. The primitive_geometry controls the behavior of collision detection at voxels boundaries.

For initializing a voxels shape from points in space, see Self::voxels_from_points. For initializing a voxels shape from a mesh to voxelize, see Self::voxelized_mesh.

Source

pub fn voxels_from_points( voxel_size: Vector<f32>, points: &[Point<f32>], ) -> Self

Initializes a collider made of voxels.

Each voxel has the size voxel_size and contains at least one point from centers. The primitive_geometry controls the behavior of collision detection at voxels boundaries.

Source

pub fn voxelized_mesh( vertices: &[Point<f32>], indices: &[[u32; 2]], voxel_size: f32, fill_mode: FillMode, ) -> Self

Initializes a voxels obtained from the decomposition of the given trimesh (in 3D) or polyline (in 2D) into voxelized convex parts.

Source

pub fn cuboid(hx: f32, hy: f32) -> Self

Initialize a new collider builder with a cuboid shape defined by its half-extents.

Source

pub fn round_cuboid(hx: f32, hy: f32, border_radius: f32) -> Self

Initialize a new collider builder with a round cuboid shape defined by its half-extents and border radius.

Source

pub fn capsule_from_endpoints(a: Point<f32>, b: Point<f32>, radius: f32) -> Self

Initialize a new collider builder with a capsule defined from its endpoints.

See also ColliderBuilder::capsule_x, ColliderBuilder::capsule_y, (and ColliderBuilder::capsule_z in 3D only) for a simpler way to build capsules with common orientations.

Source

pub fn capsule_x(half_height: f32, radius: f32) -> Self

Initialize a new collider builder with a capsule shape aligned with the x axis.

Source

pub fn capsule_y(half_height: f32, radius: f32) -> Self

Creates a capsule (pill-shaped) collider aligned with the Y axis.

Capsules are cylinders with hemispherical caps. Excellent for characters because:

  • Smooth collision (no getting stuck on edges)
  • Good for upright objects (characters, trees)
  • Fast collision detection
§Parameters
  • half_height - Half the height of the cylindrical part (not including caps)
  • radius - Radius of the cylinder and caps

Example: capsule_y(1.0, 0.5) creates a 3.0 tall capsule (1.0×2 cylinder + 0.5×2 caps)

Source

pub fn segment(a: Point<f32>, b: Point<f32>) -> Self

Creates a line segment collider between two points.

Useful for thin barriers, edges, or 2D line-based collision. Has no thickness - purely a mathematical line.

Source

pub fn triangle(a: Point<f32>, b: Point<f32>, c: Point<f32>) -> Self

Creates a single triangle collider.

Use for simple 3-sided shapes or as building blocks for more complex geometry.

Source

pub fn round_triangle( a: Point<f32>, b: Point<f32>, c: Point<f32>, border_radius: f32, ) -> Self

Initializes a collider builder with a triangle shape with round corners.

Source

pub fn polyline( vertices: Vec<Point<f32>>, indices: Option<Vec<[u32; 2]>>, ) -> Self

Initializes a collider builder with a polyline shape defined by its vertex and index buffers.

Source

pub fn trimesh( vertices: Vec<Point<f32>>, indices: Vec<[u32; 3]>, ) -> Result<Self, TriMeshBuilderError>

Creates a triangle mesh collider from vertices and triangle indices.

Use for complex, arbitrary shapes like:

  • Level geometry and terrain
  • Imported 3D models
  • Custom irregular shapes

Performance note: Triangle meshes are slower than primitive shapes (balls, boxes, capsules). Consider using compound shapes or simpler approximations when possible.

§Parameters
  • vertices - Array of 3D points
  • indices - Array of triangles, each is 3 indices into the vertex array
§Example
use rapier3d::prelude::*;
use nalgebra::Point3;

let vertices = vec![
    Point3::new(0.0, 0.0, 0.0),
    Point3::new(1.0, 0.0, 0.0),
    Point3::new(0.0, 1.0, 0.0),
];
let triangle: [u32; 3] = [0, 1, 2];
let indices = vec![triangle];  // One triangle
let collider = ColliderBuilder::trimesh(vertices, indices)?;
Source

pub fn trimesh_with_flags( vertices: Vec<Point<f32>>, indices: Vec<[u32; 3]>, flags: TriMeshFlags, ) -> Result<Self, TriMeshBuilderError>

Initializes a collider builder with a triangle mesh shape defined by its vertex and index buffers and flags controlling its pre-processing.

Source

pub fn converted_trimesh( vertices: Vec<Point<f32>>, indices: Vec<[u32; 3]>, converter: MeshConverter, ) -> Result<Self, MeshConverterError>

Initializes a collider builder with a shape converted from the given triangle mesh index and vertex buffer.

All the conversion variants could be achieved with other constructors of ColliderBuilder but having this specified by an enum can occasionally be easier or more flexible (determined at runtime).

Source

pub fn convex_decomposition( vertices: &[Point<f32>], indices: &[[u32; 2]], ) -> Self

Creates a compound collider by decomposing a mesh/polyline into convex pieces.

Concave shapes (like an ‘L’ or ‘C’) are automatically broken into multiple convex parts for efficient collision detection. This is often faster than using a trimesh.

Uses the V-HACD algorithm. Good for imported models that aren’t already convex.

Source

pub fn round_convex_decomposition( vertices: &[Point<f32>], indices: &[[u32; 2]], border_radius: f32, ) -> Self

Initializes a collider builder with a compound shape obtained from the decomposition of the given trimesh (in 3D) or polyline (in 2D) into convex parts dilated with round corners.

Source

pub fn convex_decomposition_with_params( vertices: &[Point<f32>], indices: &[[u32; 2]], params: &VHACDParameters, ) -> Self

Initializes a collider builder with a compound shape obtained from the decomposition of the given trimesh (in 3D) or polyline (in 2D) into convex parts.

Source

pub fn round_convex_decomposition_with_params( vertices: &[Point<f32>], indices: &[[u32; 2]], params: &VHACDParameters, border_radius: f32, ) -> Self

Initializes a collider builder with a compound shape obtained from the decomposition of the given trimesh (in 3D) or polyline (in 2D) into convex parts dilated with round corners.

Source

pub fn convex_hull(points: &[Point<f32>]) -> Option<Self>

Creates the smallest convex shape that contains all the given points.

Computes the “shrink-wrap” around a point cloud. Useful for:

  • Creating collision shapes from vertex data
  • Approximating complex shapes with a simpler convex one

Returns None if the points don’t form a valid convex shape.

Performance: Convex shapes are much faster than triangle meshes!

Source

pub fn round_convex_hull( points: &[Point<f32>], border_radius: f32, ) -> Option<Self>

Initializes a new collider builder with a round 2D convex polygon or 3D convex polyhedron obtained after computing the convex-hull of the given points. The shape is dilated by a sphere of radius border_radius.

Source

pub fn convex_polyline(points: Vec<Point<f32>>) -> Option<Self>

Creates a new collider builder that is a convex polygon formed by the given polyline assumed to be convex (no convex-hull will be automatically computed).

Source

pub fn round_convex_polyline( points: Vec<Point<f32>>, border_radius: f32, ) -> Option<Self>

Creates a new collider builder that is a round convex polygon formed by the given polyline assumed to be convex (no convex-hull will be automatically computed). The polygon shape is dilated by a sphere of radius border_radius.

Source

pub fn heightfield(heights: DVector<f32>, scale: Vector<f32>) -> Self

Initializes a collider builder with a heightfield shape defined by its set of height and a scale factor along each coordinate axis.

Source

pub fn default_friction() -> f32

Returns the default friction value used when not specified (0.5).

Source

pub fn default_density() -> f32

Returns the default density value used when not specified (1.0).

Source

pub fn user_data(self, data: u128) -> Self

Stores custom user data with this collider (128-bit integer).

Use to associate game data (entity ID, type, etc.) with physics objects.

§Example
let collider = ColliderBuilder::ball(0.5)
    .user_data(entity_id as u128)
    .build();
Source

pub fn collision_groups(self, groups: InteractionGroups) -> Self

Sets which collision groups this collider belongs to and can interact with.

Use this to control what can collide with what (like collision layers). See InteractionGroups for examples.

§Example
// Player bullet: in group 1, only hits group 2 (enemies)
let groups = InteractionGroups::new(Group::GROUP_1, Group::GROUP_2);
let bullet = ColliderBuilder::ball(0.1)
    .collision_groups(groups)
    .build();
Source

pub fn solver_groups(self, groups: InteractionGroups) -> Self

Sets solver groups (advanced collision filtering for contact resolution).

Similar to collision_groups but specifically for the contact solver. Most users should use collision_groups() instead - this is for advanced scenarios where you want collisions detected but not resolved (e.g., one-way platforms).

Source

pub fn sensor(self, is_sensor: bool) -> Self

Makes this collider a sensor (trigger zone) instead of a solid collision shape.

Sensors detect overlaps but don’t create physical collisions. Use for:

  • Trigger zones (checkpoints, danger areas)
  • Collectible item detection
  • Proximity sensors
  • Win/lose conditions

You’ll receive collision events when objects enter/exit the sensor.

§Example
let trigger = ColliderBuilder::cuboid(5.0, 5.0, 5.0)
    .sensor(true)
    .build();
Source

pub fn active_hooks(self, active_hooks: ActiveHooks) -> Self

Enables custom physics hooks for this collider (advanced).

See ActiveHooks for details on custom collision filtering.

Source

pub fn active_events(self, active_events: ActiveEvents) -> Self

Enables event generation for this collider.

Set to ActiveEvents::COLLISION_EVENTS for start/stop notifications. Set to ActiveEvents::CONTACT_FORCE_EVENTS for force threshold events.

§Example
let sensor = ColliderBuilder::ball(1.0)
    .sensor(true)
    .active_events(ActiveEvents::COLLISION_EVENTS)
    .build();
Source

pub fn active_collision_types( self, active_collision_types: ActiveCollisionTypes, ) -> Self

Sets which body type combinations can collide with this collider.

See ActiveCollisionTypes for details. Most users don’t need to change this.

Source

pub fn friction(self, friction: f32) -> Self

Sets the friction coefficient (slipperiness) for this collider.

  • 0.0 = ice (very slippery)
  • 0.5 = wood on wood
  • 1.0 = rubber (high grip)

Default is 0.5.

Source

pub fn friction_combine_rule(self, rule: CoefficientCombineRule) -> Self

Sets how friction coefficients are combined when two colliders touch.

Options: Average, Min, Max, Multiply. Default is Average. Most games can ignore this and use the default.

Source

pub fn restitution(self, restitution: f32) -> Self

Sets the restitution coefficient (bounciness) for this collider.

  • 0.0 = no bounce (clay, soft)
  • 0.5 = moderate bounce
  • 1.0 = perfect elastic bounce
  • >1.0 = super bouncy (gains energy!)

Default is 0.0.

Source

pub fn restitution_combine_rule(self, rule: CoefficientCombineRule) -> Self

Sets the rule to be used to combine two restitution coefficients in a contact.

Source

pub fn density(self, density: f32) -> Self

Sets the density (mass per unit volume) of this collider.

Mass will be computed as: density × volume. Common densities:

  • 1000.0 = water
  • 2700.0 = aluminum
  • 7850.0 = steel

⚠️ Use either density() OR mass(), not both (last call wins).

§Example
let steel_ball = ColliderBuilder::ball(0.5).density(7850.0).build();
Source

pub fn mass(self, mass: f32) -> Self

Sets the total mass of this collider directly.

Angular inertia is computed automatically from the shape and mass.

⚠️ Use either mass() OR density(), not both (last call wins).

§Example
// 10kg ball regardless of its radius
let collider = ColliderBuilder::ball(0.5).mass(10.0).build();
Source

pub fn mass_properties(self, mass_properties: MassProperties) -> Self

Sets the mass properties of the collider this builder will build.

This will be overridden by a call to Self::density or Self::mass so it only makes sense to call either Self::density or Self::mass or Self::mass_properties.

Source

pub fn contact_force_event_threshold(self, threshold: f32) -> Self

Sets the force threshold for triggering contact force events.

When total contact force exceeds this value, a ContactForceEvent is generated (if ActiveEvents::CONTACT_FORCE_EVENTS is enabled).

Use for detecting hard impacts, breaking objects, or damage systems.

§Example
let glass = ColliderBuilder::cuboid(1.0, 1.0, 0.1)
    .active_events(ActiveEvents::CONTACT_FORCE_EVENTS)
    .contact_force_event_threshold(1000.0)  // Break at 1000N
    .build();
Source

pub fn translation(self, translation: Vector<f32>) -> Self

Sets where the collider sits relative to its parent body.

For attached colliders, this is the offset from the body’s origin. For standalone colliders, this is the world position.

§Example
// Collider offset 2 units to the right of the body
let collider = ColliderBuilder::ball(0.5)
    .translation(vector![2.0, 0.0, 0.0])
    .build();
Source

pub fn rotation(self, angle: AngVector<f32>) -> Self

Sets the collider’s rotation relative to its parent body.

For attached colliders, this rotates the collider relative to the body. For standalone colliders, this is the world rotation.

Source

pub fn position(self, pos: Isometry<f32>) -> Self

Sets the collider’s full pose (position + rotation) relative to its parent.

For attached colliders, this is relative to the parent body. For standalone colliders, this is the world pose.

Source

pub fn position_wrt_parent(self, pos: Isometry<f32>) -> Self

👎Deprecated: Use .position instead.

Sets the initial position (translation and orientation) of the collider to be created, relative to the rigid-body it is attached to.

Source

pub fn delta(self, delta: Isometry<f32>) -> Self

👎Deprecated: Use .position instead.

Set the position of this collider in the local-space of the rigid-body it is attached to.

Source

pub fn contact_skin(self, skin_thickness: f32) -> Self

Sets the contact skin of the collider.

The contact skin acts as if the collider was enlarged with a skin of width skin_thickness around it, keeping objects further apart when colliding.

A non-zero contact skin can increase performance, and in some cases, stability. However it creates a small gap between colliding object (equal to the sum of their skin). If the skin is sufficiently small, this might not be visually significant or can be hidden by the rendering assets.

Source

pub fn enabled(self, enabled: bool) -> Self

Sets whether this collider starts enabled or disabled.

Default is true (enabled). Set to false to create a disabled collider.

Source

pub fn build(&self) -> Collider

Finalizes the collider and returns it, ready to be added to the world.

§Example
let collider = ColliderBuilder::ball(0.5)
    .friction(0.7)
    .build();
colliders.insert_with_parent(collider, body_handle, &mut bodies);

Trait Implementations§

Source§

impl Clone for ColliderBuilder

Source§

fn clone(&self) -> ColliderBuilder

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ColliderBuilder

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ColliderBuilder

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl From<ColliderBuilder> for Collider

Source§

fn from(val: ColliderBuilder) -> Collider

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.