Javascript/WASM bindings for Nvidia PhysX 5.4.1.
Looking for pre-built binaries / build instructions? See below
The bindings include most major parts of the PhysX SDK (excluding CUDA stuff, which is not possible with WASM):
- Basics
- Static and dynamic actors
- All geometry types (box, capsule, sphere, plane, convex mesh, triangle mesh and height field)
- All joint types (revolute, spherical, prismatic, fixed, distance and D6)
- Articulations
- Vehicles
- Character controllers
- Scene serialization
There is a basic hello world example: 10 boxes falling on the ground (drawn as wireframe on a plain canvas).
The API is very close to the original PhysX C++ API, so you can simply use the official PhysX API documentation
However, in order to make the bindings work with emscripten a few additional wrappers are needed here and there. So it might make sense to also take a look into the PhysXJs.idl interface definiton file.
Update as of v2.2.0
: Thanks to Shannon Poole, PhysX enums can now be accessed by their qualified names (e.g. PhysX.PxIDENTITYEnum.PxIdentity
,
see also the hello world demo mentioned above).
I use this library in my engine kool and have a few demos in place:
- Vehicle: Basic vehicle demo with a few obstacles.
- Character: 3rd person character demo on an island.
- Ragdolls: A simple ragdoll demo.
- Joints: A chain running over two gears.
- Collision: The obligatory box (and other shapes) collision physics demo.
However, the demos are written in kotlin, not javascript.
This library is published as a npm package:
npm i physx-js-webidl
Alternatively you can grab the pre-built binaries (.wasm + support .js) from the latest Release.
In order to build the library you need a recent version of the emscripten SDK - I'm
using version 3.1.51
. Alternatively, you can use docker as described below.
After successful build, the binaries (.wasm + support .js) will appear in the dist
directory.
# Clone this repo
git clone https://github.com/fabmax/physx-js-webidl
# Enter that directory
cd physx-js-webidl
# Download submodule containing the PhysX code
git submodule update --init
# Generate build-scripts
./generate.sh
# Build
./make.sh
To add bindings to additional PhysX interfaces you only have to edit the
PhysXJs.idl
file located in PhysX/physx/source/webidlbindings/src/wasm/
and recompile the library.
# Build the image
docker compose up
# Build Release
docker compose run --rm builder ./make.sh
# Build Profile
docker compose run --rm builder ./make-profile.sh
# Build Debug
docker compose run --rm builder ./make-debug.sh
It is also possible to generate Typescript bindings out of the idl file (apparently broken on recent node version):
npx @milkshakeio/webidl2ts -e -d -n PhysX -i PhysX/physx/source/webidlbindings/src/wasm/PhysXWasm.idl -o dist/physx-js-webidl.wasm.d.ts