0.8.0 • Published 6 months ago

@markuslerner/particular v0.8.0

Weekly downloads
-
License
MIT
Repository
github
Last release
6 months ago

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:

MemberType Default Description
behaviorsSetnew Set()Behaviors for all particles
constraintsSetnew Set() Constraints for all particles
groupsSetnew Set()Groups of particles (not implemented yet)
particlesSetnew Set()All particles
springsSetnew Set()All springs (not implemented yet)
frictionnumber0.95;
springIterationsCountnumber50;

Public Methods:

MethodReturn valueDescription
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)SpringAttempts to find the spring element between the 2 particles supplied
getnumConnected(spring: Spring)numberGet the count of how many springs are connected to A
hasBehavior(behavior: Behavior)BehaviorCheck, if physics has this behavior
hasGroup(group: Group)GroupCheck, if physics has this group
hasParticle(particle: Particle)ParticleCheck, if physics has this particle
hasSpring(spring: Spring)SpringCheck, if physics has this spring
removeBehavior(behavior: Behavior)booleanRemove behavior
removeParticle(particle: Particle)booleanRemove particle
removeSpring(spring: Spring)booleanRemove spring
removeSpringElements(spring: Spring)booleanRemoves a spring connector and its both end point particles
removeGroup(group: Group)booleanRemove 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:

MemberType Default Description
xnumber0.0
ynumber0.0
znumber0.0
lockedbooleanfalseParticle lock status
behaviorsSetnullParticle behaviors
neighborsSetnullParticle neighbors
mass number 1.0
radius number 1.0
friction number 0.0
maxSpeed number 3.0
force Vector3 new Vector3()
velocityVector3new Vector3()
velocitySmoothVector3new Vector3()
followersSetnew Set()Follower which will copy this particle’s position

Public Methods:

MethodReturn valueDescription
addBehavior(behavior: Object, addEvenIfExists: boolean = false)thisAdd behavior to this particle only
getBehavior(behaviorClass: Class)Instance of BehaviorGet behavior by behavior class
addFollower(vector: Vector3)Will copy this particle’s position
addForce(force: Vector3)thisAdd force to this particle, used by behaviors
clearForce()thisClear force
clearVelocity()thisClear velocity
getVelocity()Vector3Get velocity
lock()thisLock 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()thisUnlock 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

0.8.0

6 months ago

0.7.1

2 years ago

0.5.0

2 years ago

0.4.0

2 years ago

0.7.0

2 years ago

0.6.1

2 years ago

0.6.0

2 years ago

0.3.0

2 years ago

0.2.1

2 years ago

0.2.2

2 years ago

0.1.0

2 years ago