Lightweight 3d physics engine for javascript
JavaScript HTML
Latest commit ea13881 Feb 11, 2017 @lo-th correct Compound demo
shape local position is now  posShape:
shapes local rotation is now rotShape
Failed to load latest commit information.
build correct Compound demo Feb 11, 2017
examples correct Compound demo Feb 11, 2017
src correct Compound demo Feb 11, 2017
utils up Jan 28, 2017
.gitignore new version Jan 23, 2017
.npmignore new version Jan 23, 2017
LICENSE new version Jan 23, 2017 up Feb 8, 2017
docs.html start docs Jan 30, 2017
index.html add contact feedback Feb 8, 2017
package.json correct Compound demo Feb 11, 2017
rollup.config.js Sorry xprogram Jan 28, 2017

Oimo.js is a lightweight 3d physics engine for JavaScript.
It's a full javascript conversion of OimoPhysics
Originally created by Saharan for actionscript 3.0.



  • docs (in progress)



Download the minified library and include it in your HTML.
Alternatively, use Node and install the package: npm install oimo

<script src="js/oimo.min.js"></script>

Create physics world:

world = new OIMO.World({ 
    timestep: 1/60, 
    iterations: 8, 
    broadphase: 2, // 1 brute force, 2 sweep and prune, 3 volume tree
    worldscale: 1, // scale full world 
    random: true,  // randomize sample
    info: false,   // calculate statistic or not
    gravity: [0,-9.8,0] 

Add physics object or joint

var body = world.add({ 
    type:'sphere', // type of shape : sphere, box, cylinder 
    size:[1,1,1], // size of shape
    pos:[0,0,0], // start position in degree
    rot:[0,0,90], // start rotation in degree
    move:true, // dynamic or statique
    density: 1,
    friction: 0.2,
    restitution: 0.2,
    belongsTo: 1, // The bits of the collision groups to which the shape belongs.
    collidesWith: 0xffffffff; // The bits of the collision groups with which the shape collides.

var body = world.add({ 
    type:'jointHinge', // type of joint : jointDistance, jointHinge, jointPrisme, jointSlide, jointWheel
    body1: "b1", // name or id of attach rigidbody
    body2: "b1", // name or id of attach rigidbody

// update world

// and copy position and rotation to three mesh
myMesh.position.copy( body.getPosition() );
myMesh.quaternion.copy( body.getQuaternion() );


Oimo Physics uses international system units: 0.1 to 10 meters max for dynamic body.
In basic demo with THREE, I scaled all by 100 so objects are between 10 to 1000 in THREE units.

/!\ Shape name change in last version
SphereShape to Sphere, BoxShape to Box, CylinderShape to Cylinder