2D rigid body physics engine written in JavaScript. Includes collision detection, contacts, friction, restitution, motors, springs, advanced constraints and various shape types.
Demos | Examples | Documentation | Download | CDN
- Car
- Circle container
- Collision tests
- Compound objects
- Concave objects
- Constraints
- DistanceConstraint
- Fixed rotation
- Friction
- Gear constraint
- Heightfield
- Island solver
- Kinematic body
- Lock constraint
- Piston
- Prismatic constraint
- Ragdoll
- Sensor
- Restitution
- Sleep
- Springs
- Surface velocity
- Suspension
- Tearable constraints
Examples showing how to use p2.js with your favorite renderer.
- Canvas: Asteroids game
- Canvas: Box on plane
- Canvas: Character demo
- Canvas: Circle on plane
- Canvas: Interpolation
- Canvas: Mousejoint
- Canvas: Sensors
- Canvas: Sensors 2
- Pixi.js: Box on plane
The following example uses the World, Circle, Body and Plane classes to set up a simple physics scene with a ball on a plane.
// Create a physics world, where bodies and constraints live
var world = new p2.World({
gravity:[0, -9.82]
});
// Create an empty dynamic body
var circleBody = new p2.Body({
mass: 5,
position: [0, 10]
});
// Add a circle shape to the body.
var radius = 1;
var circleShape = new p2.Circle(radius);
circleBody.addShape(circleShape);
// ...and add the body to the world.
// If we don't add it to the world, it won't be simulated.
world.addBody(circleBody);
// Create an infinite ground plane.
var groundBody = new p2.Body({
mass: 0 // Setting mass to 0 makes the body static
});
var groundShape = new p2.Plane();
groundBody.addShape(groundShape);
world.addBody(groundBody);
// To get the trajectories of the bodies,
// we must step the world forward in time.
// This is done using a fixed time step size.
var timeStep = 1 / 60; // seconds
// The "Game loop". Could be replaced by, for example, requestAnimationFrame.
setInterval(function(){
// The step method moves the bodies forward in time.
world.step(timeStep);
// Print the circle position to console.
// Could be replaced by a render call.
console.log("Circle y position: " + circleBody.position[1]);
}, 1000 * timeStep);
Download either p2.js or the minified p2.min.js and include the script in your HTML:
<script src="p2.js" type="text/javascript"></script>
If you would like to use ordinary Array
instead of Float32Array
, define GLMAT_ARRAY_TYPE
globally before loading the library.
<script type="text/javascript">GLMAT_ARRAY_TYPE = Array;</script>
<script src="p2.js" type="text/javascript"></script>
npm install p2
Then require it like so:
var p2 = require('p2');
Circle | Plane | Rectangle | Convex | Particle | Line | Capsule | Heightfield | |
---|---|---|---|---|---|---|---|---|
Circle | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
Plane | - | - | Yes | Yes | Yes | Yes | Yes | - |
Rectangle | - | - | Yes | Yes | Yes | (todo) | Yes | Yes |
Convex | - | - | - | Yes | Yes | (todo) | Yes | Yes |
Particle | - | - | - | - | - | - | Yes | (todo) |
Line | - | - | - | - | - | (todo) | (todo) | (todo) |
Capsule | - | - | - | - | - | - | Yes | (todo) |
Heightfield | - | - | - | - | - | - | - | - |
Note that concave polygon shapes can be created using Body.fromPolygon.
Tests are written for Nodeunit. Run the tests with the command grunt test
.
Make sure you have git, Node.js, NPM and grunt installed.
git clone https://github.com/schteppe/p2.js.git; # Clone the repo
cd p2.js;
npm install; # Install dependencies
# (make changes to source)
grunt; # Builds build/p2.js and build/p2.min.js
The most recent commits are currently pushed to the master
branch. Thanks for contributing!