Natively multithreaded physics for threejs with PhysX and an easy interface.
Credit to Milkshake inc, physx-js, three-ammo, three-to-cannon, engine-3-zjt
DISCLAIMER: this is a work in progress and API & implementation is set to change This will eventually be superseeded by https://github.com/HexaField/web-physx
Progress:
- Load WASM in webworker
- Set up message queue & function calls over events
- three-to-physx shape converter
- return transforms
- kinematic
- collision events
- update bodies
- new build with more bindings
- put body ids on arraybuffers for more efficient data transfer
- capsule
- character controller
- collision filtering
- trimesh and convex
- raycasts
- get rid of transform, make internal and rely entirely on Vector3 & Quaternion
- fix up updating body and shape data
- obstacles
- fix root object scaling bug
- raycasts ignore backface option
- vehicle controller
- heightfield colliders
- geometry per instance scaling
- add subscribe for event listeners on worker to reduce redundant transfer overhead
- advanced & customisable collision filtering
- full api support (eventually)
- move most stuff to WASM for improved performance
https://three-physx.netlify.app/
-work in progress-
This multithreaded PhysX API uses a singleton approach. This way the PhysX interface is accessible globally once instantiated.
import { PhysXInstance, Transform } from 'three-physx';
// create the interface
await PhysXInstance.instance.initPhysX(new Worker('./worker.js'), { tps: 60, start: true });
// add an object
const body = PhysXInstance.instance.addBody(new Body({
shapes: [
{
shape: SHAPES.Box,
config: {
collisionLayer: COLLISIONS.FLOOR,
collisionMask: COLLISIONS.ALL
}
}
],
type: BodyType.DYNAMIC
}));
// In scene loop
PhysXInstance.instance.update();
worker.js
import { receiveWorker } from "three-physx";
import PHYSX from './physx.release.js';
PHYSX().then(receiveWorker);
cd physx-js
npm install
npm run generate
npm run dev
This will copy files to /lib