npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@markuslerner/particular

v0.8.0

Published

Particle system for JavaScript

Downloads

43

Readme

Particular

NPM Package

Particle system written in JavaScript. Heavily inspired by Punktiert Java library.

Why yet another physics/particle system libary? I simply didn't find a JavaScript physics/particle system libary that is GPU-accelerated, behavior-based (eg. flocking/swarm, seek/arrive) and works they way I was used to from earlier days in Java/Processing.

Collaborations and improvements welcome.

Highlights

  • GPU-accelerated (currently only Collision behavior) using gpu.js
  • Simple API
  • Behavior-based
  • Vector3 API fully compatible with THREE.js Vector3

Usage

yarn add @markuslerner/particular

or

npm install @markuslerner/particular
  1. Include classes from this package:
import {
  SimplePhysics,
  Particle,
  Collision,
  Seek,
} from '@markuslerner/particular';
  1. Create physics:
const physics = new GPUPhysics();
  1. Create particle(s) and add to physics:
const particle = new Particle(x, y, z);
physics.addParticle(particle);
  1. Add behavior(s):
particle.addBehavior(new Collision());
particle.addBehavior(new Seek());
  1. Update physics every frame:
physics.update();

Done.

Collaborations and improvements are welcome.

Examples

Editing source code and examples

To edit the source code and the examples, run:

yarn start

or

npm start

A development server will be launched under http://localhost:8000/

The files from the src folder will we re-built automatically into a virtual build/particular.js upon reloading the page.

API Docs

SimplePhysics class

Constructor

new SimplePhysics({ friction = 0.95, springIterationsCount = 50 } = {});

Members:

Member | Type | Default | Description :----- | :--- | :------ | :---------- behaviors | Set | new Set() | Behaviors for all particles constraints | Set | new Set() | Constraints for all particles groups | Set | new Set() | Groups of particles (not implemented yet) particles | Set | new Set() | All particles springs | Set | new Set() | All springs (not implemented yet) friction | number | 0.95; springIterationsCount | number | 50;

Public Methods:

Method | Return value | Description :----- | :----------- | :---------- addBehavior(behavior: Object) | | Add behavior to all particles addParticle(particle: Particle) | | Add particle addSpring(spring: Spring) | | Not implmemented yet addGroup(group: Group) | | Not implmemented yet clear() | | Clear particles, groups and springs getSpring(a: Particle, b: Particle) | Spring | Attempts to find the spring element between the 2 particles supplied getnumConnected(spring: Spring) | number | Get the count of how many springs are connected to A hasBehavior(behavior: Behavior) | Behavior | Check, if physics has this behavior hasGroup(group: Group) | Group | Check, if physics has this group hasParticle(particle: Particle) | Particle | Check, if physics has this particle hasSpring(spring: Spring) | Spring | Check, if physics has this spring removeBehavior(behavior: Behavior) | boolean | Remove behavior removeParticle(particle: Particle) | boolean | Remove particle removeSpring(spring: Spring) | boolean | Remove spring removeSpringElements(spring: Spring) | boolean | Removes a spring connector and its both end point particles removeGroup(group: Group) | boolean | Remove group update(deltaTime: number = 1) | | Update simulation

Particle class

Extends Vector3 class

Vector3 API is fully compatible with THREE.js Vector3.

Constructor

new Particle(x: number = 0.0, y: number = 0.0, z: number = 0.0, mass: number = 1.0, radius: number = 1.0);

Members:

Member | Type | Default | Description :----- | :--- | :------ | :---------- x | number | 0.0 y | number | 0.0 z | number | 0.0 locked | boolean | false | Particle lock status behaviors | Set | null | Particle behaviors neighbors | Set | null | Particle neighbors mass | number | 1.0 radius | number | 1.0 friction | number | 0.0 maxSpeed | number | 3.0 force | Vector3 | new Vector3() velocity | Vector3 | new Vector3() velocitySmooth | Vector3 | new Vector3() followers | Set | new Set() | Follower which will copy this particle’s position

Public Methods:

Method | Return value | Description :----- | :----------- | :---------- addBehavior(behavior: Object, addEvenIfExists: boolean = false) | this | Add behavior to this particle only getBehavior(behaviorClass: Class) | Instance of Behavior | Get behavior by behavior class addFollower(vector: Vector3) | | Will copy this particle’s position addForce(force: Vector3) | this | Add force to this particle, used by behaviors clearForce() | this | Clear force clearVelocity() | this | Clear velocity getVelocity() | Vector3 | Get velocity lock() | this | Lock this particle’s position removeBehavior(behavior: Object) | boolean | Remove behavior, returns true, if behavior was found removeFollower(follower: Object) | boolean | Remove follower, returns true, if follower was found unlock() | this | Unlock this particle’s position constrainX(min: number, max: number) | | Constrain x constrainY(min: number, max: number) | | Constrain y constrainZ(min: number, max: number) | | Constrain z

Available Behaviors:

  • Align: align movement with neighbors
  • Avoid: avoid single target
  • Bounce: bounce off world box
  • Cohesion: keep close to neighbors
  • Collision: avoid collision with neighbors
  • Constrain: keep within world box
  • Seek: seek single target
  • SeekRandom: seek single random target
  • Separate: separate from neighbors
  • Wander: random wander movment
  • Wrap: wrap around word box

Editing source

In order to edit the source code, run:

yarn start

And open http://127.0.0.1:8000/ in your browers.

The files in the build folder will automatically be rebuilt when modified.

To Do

  • Add gpu acceleration for Align, Cohesion and Separate behaviors as well
  • Create 3D flocking example
  • Add missing behaviors and params to all behaviors example
  • Consider writing behaviors as a plugin for matter.js
  • Create other shapes (box, polygon)

License

MIT licensed

Created by Markus Lerner