Nightly Pocket Measurement

    TypeScript icon, indicating that this package has built-in type declarations

    0.5.0 • Public • Published

    npm version

    A babylon.js dice roller

    This repository is home to 3d dice roller functionality for the babylon.js framework using ammo.js as physics simulation.


    For a rough example check the examples folder.


    npm i @planarally/dice

    This package uses Ammo.js for the physics, it's however not a direct dependency because ammojs does not provide clean npm version packages.

    Make sure you install Ammo.js on your own and pass the Ammo instance to the load function.

    To install Ammo.js straight from github you can do:

    npm i github:kripken/ammo.js


    1. Instantiate a DiceThrower class with either a canvas element or your own babylonjs scene.
    2. Call the async load method on the instance to load ammojs and the dice meshes*.

    *At this moment you need to manually specify your meshes e.g. await diceThrower.load("http://localhost:9998/some_meshes.babylon");

    A default set of dice meshes and uvs can be found in the examples folder, in the future the aim is to include them in the core code as a default set without having to manually serve/load them.

    Throwing dice

    Call .throwDice on your DiceThrower instance and provide it an array of dice to throw. This is a simple interface that has 1 mandatory field 'die' which can be any of the available dice. Some other optional fields are available to instantiate things like position, velocity etc.

    The method returns an array of numbers with the results of the dice in the order as they were initially provided to the method. The method will only return if all dice have stabilized, which currently is determined based on a treshold on what the linear and angular velocities are!


    const results = await diceThrower.throwDice([{ die: Dice.D20 }, { die: Dice.D6, position: new Vector3(2, 2, 2) }]);

    String format

    An alternative and more advanced way is to parse a string representation. This is done by instantiating a parser specifically for your system. Currently only a DndParser is available.

    const parser = new DndParser(diceThrower);
    const results = await parser.fromString("3d6 + 1d4 - 3 1d20+2-3d4");
    results.length; // 2
    results[0].total; // 7
    results[0].details; // [{ input: '3d6', output: [1,5,3], type: 'dice' }, {input: '+', type: 'operator'}, ...]

    What happens here is that a single string is taken as input, split into separate groups and then parsed, thrown and interpreted. For each group a total and a detailled breakdown is available.

    The same die options can be provided in this format by optionally specifying a list after your string that follows order of your dice. E.g. ("2d6 1d4", [{position: new Vector3(1, 1, 2)}, undefined, {position: new Vector3(0, 1, 2)}]) sets the position for the first d6 and for the d4.

    Available dice

    Currently a base set of classic dX dice is available. (d4,d6,d8,d10,d12,d20,d100)

    I intend to open this up for other systems, either by simply providing a way to change the uv map of existing models or by providing custom models.


    npm i @planarally/dice

    DownloadsWeekly Downloads






    Unpacked Size

    30.8 kB

    Total Files


    Last publish


    • kruptein