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

0.2.1 • Public • Published


μNum - Micro 3D Math Library

license: MIT npm codecov build


munum is a minimalistic numerical library for high-performance 3D math with Rust, WebAssembly and JavaScript bindings.



[JavaScript] Install via npm:

npm install --save munum

[Rust] Install as Cargo dependency:

cargo add munum


  • std - enables std support. enabled by default.
  • libm - enables trigonometry related functions in no_std environment using libm.
  • jsmath - enables trigonometry related functions in no_std WebAssembly environment using JS Math binding.
  • serde - enables serde serialize/deserialize implementations
  • wasm - produces WebAssembly module and WebAssembly component (WIP)

Usage (JavaScript WebAssembly binding)

Sample usage to build a perspective camera view-projection matrix below:

(Try it yourself here)

import { lookAt, perspective, Mat4, Vec3 } from 'munum'; // Or load from CDN, e.g. ''

using eye = new Vec3(1, 1, 1);
using target = new Vec3(0, 0, 0);
using up = new Vec3(0, 1, 0);
const view = lookAt(eye, target, up);

const aspectRatio = width / height;
const yfov = Math.PI / 4;
const znear = 1;
const zfar = 100;

using viewProj = perspective(aspectRatio, yfov, znear, zfar).mul(view);

Note the use of using (which automatically calls .free() when out of scope). When using JavaScript binding, munum resources are allocated on WebAssembly memory which need to be deallocated later. munum uses FinalizationRegistry for automatic memory management, so explicit memory management with using or .free() is not required through recommended.

Usage (Pure JavaScript)

Import from munum/js for pure JavaScript implementation.

Usage (Rust)

Sample usage to build a perspective camera view-projection matrix:

use core::f32::{consts::PI, INFINITY};
use munum::{transform, vec3};

let eye = vec3(0_f32, 2., 0.);
let target = vec3(0., 0.6, 0.);
let up = vec3(0., 0., -1.);
let view = transform::look_at(eye, target, up);

let proj = transform::perspective(2., PI/2., 1., INFINITY);

let view_proj = proj * view;


This repository and the code inside it is licensed under the MIT License. Read LICENSE for more information.

Package Sidebar


npm i munum

Weekly Downloads






Unpacked Size

329 kB

Total Files


Last publish


  • andykswong