# ConvexObjectBreaker

This class can be used to subdivide a convex Geometry object into pieces.

Use the function prepareBreakableObject to prepare a Mesh object to be broken. Then, call the various functions to subdivide the object (subdivideByImpact, cutByPlane). Sub-objects that are product of subdivision don't need prepareBreakableObject to be called on them.

Requisites for the object:

- Mesh object must have a buffer geometry and a material.
- Vertex normals must be planar (not smoothed).
- The geometry must be convex (this is not checked in the library). You can create convex geometries with ConvexGeometry. The BoxGeometry, SphereGeometry and other convex primitives can also be used.

Note: This lib adds member variables to object's userData member (see prepareBreakableObject function) Use with caution and read the code when using with other libs.

## Import

ConvexObjectBreaker is an addon, and must be imported explicitly, see Installation#Addons.

    import { ConvexObjectBreaker } from 'three/addons/misc/ConvexObjectBreaker.js';

## Constructor

### new ConvexObjectBreaker ( minSizeForBreak : number, smallDelta : number )

Constructs a new convex object breaker.

minSizeForBreak | Min size a debris can have to break. Default is `1.4`.
smallDelta | Max distance to consider that a point belongs to a plane. Default is `0.0001`.

## Methods

### .cutByPlane ( object : Object3D, plane : Plane, output : Object ) : number

Subdivides the given 3D object into pieces by a plane.

object | The 3D object to subdivide.
plane | The plane to cut the 3D object.
output | An object that stores the pieces.

Returns: The number of pieces.

### .prepareBreakableObject ( object : Object3D, mass : number, velocity : Vector3, angularVelocity : Vector3, breakable : boolean )

Must be called for all 3D objects that should be breakable.

object | The 3D object. It must have a convex geometry.
mass | The 3D object's mass in kg. Must be greater than `0`.
velocity | The 3D object's velocity.
angularVelocity | The 3D object's angular velocity.
breakable | Whether the 3D object is breakable or not.

### .subdivideByImpact ( object : Object3D, pointOfImpact : Vector3, normal : Vector3, maxRadialIterations : number, maxRandomIterations : number ) : Array.<Object3D>

Subdivides the given 3D object into pieces by an impact (meaning another object hits the given 3D object at a certain surface point).

object | The 3D object to subdivide.
pointOfImpact | The point of impact.
normal | The impact normal.
maxRadialIterations | Iterations for radial cuts.
maxRandomIterations | Max random iterations for not-radial cuts.

Returns: The array of pieces.

## Source

examples/jsm/misc/ConvexObjectBreaker.js