It’s not obvious what a plane is in a 2D physics engine.

Versions used below

  "p2": "0.6.1"

Circles, rectangles and lines make sense in 2D but a plane feels more relevant in 3D worlds. Sure, a 2D world exists on one plane but that’s not what a plane is in p2.

Thinking about planes in p2

A plane is a shape that extends infinitely in three directions (e.g. left, down, right). There is a flat edge on the other, non-infinite side.

Planes as edges of the world

Planes have one flat edge and nothing can get around or behind them. This makes planes a good candidate for edges of the game world.


The default plane orientation acts as a floor. It stretches down, left and right forever.

var floor = new p2.Body();

floor.addShape(new p2.Plane());


Flipping it by 180 degrees makes a ceiling.

var ceiling = new p2.Body({
  // radians
  angle: Math.PI

ceiling.addShape(new p2.Plane());

Right wall

Increasing a body’s angle rotates it in the counterclockwise direction.

Right wall is rotated 90 degrees from the floor.

var right = new p2.Body({
  angle: Math.PI / 2

right.addShape(new p2.Plane());

Left wall

Left wall is rotated 270 degrees from the floor.

var left = new p2.Body({
  angle: (3 * Math.PI) / 2

left.addShape(new p2.Plane());


You can use any angle to get slopes.

var ramp = new p2.Body({
  // ramp from bottom/left to top/right
  angle: Math.PI / 4

ramp.addShape(new p2.Plane());

Prefer planes over lines and rectangles

Lines and rectangles could be used for edges of the world but planes have a few advantages.

  1. You don’t have to worry about planes being wide or tall enough. Nothing can get around or behind a plane.

  2. Planes collide with more shapes than Lines and Rectangles do.

Positioning planes

Position of a plane is a little weird to think about. I’ve found that a plane’s edge will intersect its position coordinate.

p2 is “y up”, y values increase as you go up. To put a floor 10 units above the origin I would use

var floor = new p2.Body({
  // the x value is irrelevant here, the plane spans the entire x axis
  position: [0, 10]

floor.addShape(new p2.Plane());

To put a left wall 100 units to the right of the origin

var leftWall = new p2.Body({
  angle: (3 * Math.PI) / 2,
  // now the y value is irrelevant
  position: [100, 0]

leftWall.addShape(new p2.Plane());