OxiHuman

Height, weight, muscle, age, gender. Move the five parameters and the parametric human mesh is rebuilt in your browser. Enter body measurements and the engine searches for a body shape that comes close.

Neither the numbers you enter nor the generated mesh is sent to a server. The computation runs in your browser.

Exports are always the bodysuit shape only — no detailed face or hands, and no clothing. The age slider cannot go below this pack's floor. The engine itself enforces both limits; this page cannot switch them off.

The generated human mesh is drawn here with WebGL. The current parameter values are shown by the sliders below.

Starting load…

0.50
0.50
0.50
25 yr
0.50

Measurement fit

Export

oxihumanv— (Pure Rust, Apache-2.0)
targetwasm32-unknown-unknown
wasm size344 KB (gzip 143 KB)
vertices
morph time
measurement fit
pack
external requests
server round-trips0
C / C++ / Fortran0 bytes

External requests since the page finished loading:

External request counting starts once the wasm module and the asset pack (its byte count is in the pack row above) have finished loading. Changing parameters, running a fit, and exporting do not move this number. Export generates the file in your browser; it does not use the network.

The shape data derives from MakeHuman assets released under CC0-1.0 (public-domain equivalent). Provenance record: /human/PROVENANCE-EXCERPT.txt

Honest limits

LimitWhat actually happensWhy
There are only five parameter axesNothing outside height, weight, muscle, age, and gender can be changed. Hairstyles and facial detail are not available.The bundled pack contains only the macro targets and measurement targets for these five axes (no clothing, poses, expressions, or textures are bundled).
Only the bodysuit shape can be exportedOutput with clothing, accessories, or facial expressions is not possible.The restriction is enforced on the engine side, at the export entry point; the page has no way to remove it.
The age slider cannot select under 18The slider's left end stops at the floor this pack declares (18 years).The limit exists so that minor body shapes are not generated; the engine itself enforces the floor.
Measurement fit is an iterative searchAt the default iteration limit the search does not reach 'converged' and ends at the cutoff. Δ never reaches exactly zero either.Fit is a non-linear numerical search over four parameter axes against four measurement targets — there is no closed-form inversion. 'Converged' reports whether the search reached its own tolerance, not whether the fit is good. Raising the iteration limit does reach convergence, but in our measurement the fit took about 3.6 times as long and the maximum error actually grew from 0.66 cm to 1.26 cm. Judge fit quality by the Δ column above.
Height, weight, muscle, and gender are not real cm/kg valuesThese sliders display normalized weights from 0 to 1.The four axes are shape-contribution weights. Unless the engine actually measures the body, there is no honest cm or kg value to attach to them. Age is the exception: the model's published conversion to years makes a year display honest.

Implementation code

// crates/human-wasm/src/engine.rs:134-142 — verbatim, the code running above
pub fn from_pack_inner(bytes: &[u8], expected_sha256_hex: &str) -> Result<Self, String> {
    crate::hash::verify_sha256(bytes, expected_sha256_hex)?;
    let inner = oxihuman_wasm::WasmEngine::new_from_core_pack_bytes(bytes)
        .map_err(|e| e.to_string())?;
    Ok(Self {
        inner,
        macro_params: [None; 5],
    })
}

This is the code running above, right now.