Java Collision Detection and Physics Engine
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
.gitignore Moved the JUnit test, Sandbox application and samples to their own repos Nov 18, 2017
.project Moved the JUnit test, Sandbox application and samples to their own repos Nov 18, 2017 Updated readme after moving tests back into the main project Mar 31, 2018
overview.html Updated license dates Aug 22, 2015
release-notes.txt Added enabled flag enhancement info to the release notes Mar 31, 2018

alt tag

Java Collision Detection and Physics Engine

A 100% Java 2D collision detection and physics engine. Designed to be fast, stable, extensible, and easy to use. dyn4j is free for use in commercial and non-commercial applications.

The project is comprised of the main project and tests managed here and two others:

  • dyn4j-samples A collection of samples to help get started
  • dyn4j-sandbox A non-trivial desktop application that allows users to build scenes, run, save, and load them - all built with dyn4j as the simulation engine.


  • Java 1.6+

Getting Started

dyn4j comes with a lot of features and extensibility, but getting started is easy.

Step 1 Add dyn4j to Your Project

Add dyn4j to your classpath by downloading a release from Releases or Maven Central

Or by adding a Maven dependency:


Step 2 Create a World

World world = new World();

This create a new simulation environment with default settings. The default settings use the meter-kilogram-seconds system and include the default pipeline classes.

Step 3 Add Some Bodies

Body body = new Body();
body.translate(1.0, 0.0);

A body is the primary unit of simulation and completely rigid. A body is comprised of many fixtures or shapes. While the shapes of dyn4j are all convex (and must be), a collection of these shapes can be used to create a body that is not. A body can be initially placed in a scene by translating or rotating it. Once the shape(s) of a body is defined, it must be given a mass. The mass is typically MassType.NORMAL or MassType.INFINITE. When set to NORMAL, the mass will be calculated based on the shapes. An INFINITE mass body might represent a floor, ground, or something unmovable.

Step 4 Add Some Joints

PinJoint joint = new PinJoint(body, new Vector2(0, 0), 4, 0.7, 1000);

A joint is a constraint on the motion of one or more bodies. There are many joint types that serve different purposes. Generally, joints are used to link bodies together in a specified way. Bodies can have multiple joints attached to them making for some interesting combinations.

Step 5 Run the Simulation

for (int i = 0; i < 100; i++) {

In a GUI based application you would call the World.update(elapsedTime) method. Either way, each time the world is advanced forward in time (which may or may not occur when using the World.update(elapsedTime) methods) the bodies added to it will be moved based on the world gravity (if any) and will interact with other bodies placed in the world.

Next Steps

From here you should take a look at the dyn4j-samples sub project to get a jump start with a simple Java2D framework. You can also check out the documentation here.



  • Maven build goals: clean package
  • Check artifact class version: ** javap -verbose -classpath /path/to/jar/dyn4j.jar org.dyn4j.Version 50 ** javap -verbose -classpath /path/to/jar/dyn4j.jar module-info 53+