@markuslerner/particular v0.8.0
Particular
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
- Include classes from this package:
import {
SimplePhysics,
Particle,
Collision,
Seek,
} from '@markuslerner/particular';
- Create physics:
const physics = new GPUPhysics();
- Create particle(s) and add to physics:
const particle = new Particle(x, y, z);
physics.addParticle(particle);
- Add behavior(s):
particle.addBehavior(new Collision());
particle.addBehavior(new Seek());
- 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