Skip to content

caracal7/newton.js

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

130 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

newton.js

Lightweight 2D rigid body physics engine based on physicsRus by Lee Ju Hyung

Features


  • Iterative impulse based solver
  • Constraints/Joints
  • SAT collision detection
  • Supported shapes are circle, segment(thick rounded line segment), convex polygons
  • Build-in WebGL/SVG/Canvas renderer based on Two.js
  • Touch-friendly interactions manager
  • ES-modules / CommonJS / IIFE

Why?


For educational purposes 🎓

Todo


  • Broad phase collision detection
  • CCD (Continuous Collision Detection)
  • World editor

Browser (IIFE)

<!DOCTYPE html>
<html>
<head>
    <script src="newton.js"></script>
</head>
<body>
    <main style="width:800px;height:600px;"></main>

    <script>
        const { Body, ShapeBox, ShapeCircle, vec2 } = Newton;

        const myInitWorld = world => {
    		const staticBody = new Body(Body.STATIC);
    		staticBody.addShape(new ShapeBox(0, 0.2, 20.48, 0.4));
    		staticBody.addShape(new ShapeBox(0, 15.16, 20.48, 0.4));
    		staticBody.addShape(new ShapeBox(-10.04, 7.68, 0.4, 14.56));
    		staticBody.addShape(new ShapeBox(10.04, 7.68, 0.4, 14.56));
    		staticBody.resetMassData();
    		world.addBody(staticBody);

    		for (var i = 0; i <= 10; i++)  {
    			const body = new Body(Body.DYNAMIC, new vec2(-6 + i * 1.2, 8));
    			const shape = new ShapeCircle(0, 0, 0.4);
    			shape.e = i / 10;
    			shape.u = 1.0;
    			shape.density = 1;
    			body.addShape(shape);
    			body.resetMassData();
    			world.addBody(body);
    		}
    	};

        const { TwoRenderer, Runner, Interaction } = Newton;
        const renderer      = new TwoRenderer(Newton, document.querySelector('main'));
        const runner        = new Runner(renderer, {
            init: myInitWorld
        });
        const interaction   = new Interaction(runner);

        runner.renderer.camera.moveCameraTo(0, 7);
    </script>
</body>
</html>

Browser (ES modules)

import Newton from './newton.esm.js';

//...

Node.js

Installation

npm i newton.js

License


(The MIT License)

Copyright (c) 2024 Dmitrii Vasilev

About

Javascript lightweight 2D rigid body physics engine

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published