COOLJAPAN
← All posts

OxiHuman 0.2.1 Released — BodyLab Ships: A CC0 Asset Pack, In-Browser Export, and a Measurement-Fit Solver for the Client-Side Human Generator

OxiHuman 0.2.1 is the BodyLab production release: the first real CC0 asset pack (OHPK v1, 38 targets), in-memory browser GLB/VRM/STL/OBJ export, a live three.js demo, and a measurement-fit solver accurate to within 0.66 cm — plus three P0 bugs fixed and 33,569 passing tests.

release oxihuman 3d-human parametric-modeling wasm cc0 three-js gltf measurement-fit pure-rust

Ready Player Me shut down its avatar service on 2026-01-31. OxiHuman 0.2.1 ships the answer: a human body generator with no server left to shut down — and, for the first time, a body asset pack you are actually allowed to redistribute.

Today we released OxiHuman 0.2.1 — the BodyLab production release: a fully client-side, browser-ready human body generator that ships its first real CC0 asset pack (OHPK v1), in-memory browser exports, a live three.js demo, a measurement-fit solver, and the legal / safety cleanroom that makes the whole thing shippable.

No cloud. No Python. No avatar account. No server ever receives your body measurements. No C, no C++, no Fortran — OxiHuman compiles to WebAssembly and the whole pipeline runs inside the browser sandbox. No upload step, no rate limit that isn’t yours to set, no vendor that can quietly go dark on you. Just a WASM module, a CC0-licensed asset pack you can actually redistribute, and a three.js viewer carrying parameter sliders through to a validated GLB / VRM / STL / OBJ export — entirely on the device in front of you, with 0 bytes uploaded and the whole footprint measured at runtime, not asserted.

Why OxiHuman 0.2.1 is a game changer

Hosted avatar generators keep proving the same point the hard way:

0.2.1 answers all three:

Technical Deep Dive

OxiHuman’s ten-crate workspace keeps its shape in 0.2.1, but this release is where four of those layers had to agree on the same facts simultaneously — pack format, parser, measurer, and browser bindings all touch the same 21,833 vertices, and a single ordering mismatch anywhere in that chain silently corrupts every morph target downstream.

  1. Parsing (oxihuman-core, parser/obj.rs / units.rs) The OBJ loader packs vertices in face-first-occurrence order after splitting UV seams — 21,833 vertices for the base mesh, versus 19,158 raw v lines in the source MakeHuman OBJ. The gap itself isn’t a bug: every duplicated seam vertex is needed so one vertex position can carry two different UV coordinates across a texture seam. The bug was everywhere else still treating the two orderings as interchangeable.

  2. Measurement & calibration (oxihuman-morph, measurements/cross_section.rs, body_measurement.rs, calibration.rs) The new cross-section measurer reads real tape circumferences — the convex hull of the isolated torso’s cross-section at a given height band, not a bounding-box or landmark-distance approximation — and feeds them back as the results[] in a fit report. That’s what makes fit_to_measurements’s output an honest re-measurement instead of an echoed target.

  3. Export & pack format (oxihuman-export’s core_pack.rs, oxihuman-cli’s pack-core command) pack-core builds oxihuman-core-v1.ohpk from the upstream CC0 MakeHuman data: 38 targets, sparse i16 max-abs-quantised deltas against the 21,833-vertex packed mesh. 0.2.1 is also where pack-core starts re-indexing every target delta through the parser’s raw→packed mapping before quantising it — duplicating each delta across its seam copies — which is what actually fixed the index-remap P0 above. With the fix in place, the lever-gated girth refinement engages end-to-end and every girth residual comes in sub-1.5 cm.

  4. Browser bindings & the BodyLab demo (oxihuman-wasm, demo/) WasmEngine gained from_core_pack_bytes(bytes) to load an OHPK pack directly, four in-memory exporters (export_glb / export_vrm / export_stl / export_obj) that never touch a filesystem, and fit_to_measurements (engine_fit.rs) for the solver above. Zero-copy geometry hand-off (wasm_memory(), refresh_geometry(), positions_ptr() / positions_len()) lets the BodyLab three.js viewer read the vertex buffer as a Float32Array view with no JS-side copy — measured at p50 ≈ 0.52 ms/frame for the full 21,833-vertex morph. The demo itself (demo/src/viewer.js, controls.js, badges.js) vendors three.js r160 directly under demo/vendor/ and is verified end-to-end in headless Chrome by scripts/demo_serve_check.sh.

Getting Started

Build the browser package:

wasm-pack build --release --target web crates/oxihuman-wasm --no-default-features --features bindgen

Then, entirely in the browser:

import init, { OxiHumanEngine } from "oxihuman-wasm";

await init();
const bytes  = new Uint8Array(await (await fetch("./pack/oxihuman-core-v1.ohpk")).arrayBuffer());
const engine = OxiHumanEngine.from_core_pack_bytes(bytes);
engine.set_param("height", 0.7);

// in-memory export — no filesystem, safe to call repeatedly on wasm32
const glb = engine.export_glb();

// solve sliders from real centimetres; every delta is re-measured, not echoed
const report = JSON.parse(engine.fit_to_measurements(JSON.stringify({
  height_cm: 172.0,
  chest_cm: 96.0,
  waist_cm: 82.0,
  hip_cm: 98.0,
})));
console.log(report.results); // [{ name, target_cm, measured_cm, delta_cm }, ...]

What’s New in 0.2.1

Tips

This is the foundation

OxiHuman is the privacy-first, client-side human modeling layer for the COOLJAPAN ecosystem, sitting alongside SciRS2 and NumRS2 for scientific and numerical computing, ToRSh and TenfloweRS for deep learning, OxiMedia for media and video pipelines, OxiPhysics for general physics, OxiBLAS and Oxicode for the low-level building blocks, and OxiGAF for Gaussian-avatar reconstruction. 0.2.1 is the release where the client-side principle stops being an architectural claim and becomes a shipped, downloadable pack: engine, assets, and viewer all now run to completion inside the browser sandbox, C-, C++-, and Fortran-free, with no body data ever leaving the machine it runs on.

Repository: https://github.com/cool-japan/oxihuman

Star the repo if you want proof that a hosted avatar service was never actually the only option.

The era of hoping your avatar vendor stays funded is over. Pure Rust client-side human modeling is here — fast, private, and sovereign.

KitaSan at COOLJAPAN OÜ July 13, 2026

↑ Back to all posts