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
Features:
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 implementationswasm
- produces WebAssembly module and WebAssembly component (WIP)Sample usage to build a perspective camera view-projection matrix below:
import { lookAt, perspective, Mat4, Vec3 } from 'munum'; // Or load from CDN, e.g. 'https://unpkg.com/munum@latest'
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.
Import from munum/js
for pure JavaScript implementation.
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.
Generated using TypeDoc