~/projects/ascii-render
[01 / 04] ● live javascript · 3d · ascii

ascii-render

a javascript renderer that turns any .obj mesh into an interactive ascii drawing. no canvas, no pixels, no build step.

year
2026
role
renderer + converter
stack
javascript
licence
AGPL-3.0
dependencies
none
[ specimen ]
the stanford bunny, 2,503 vertices and 4,968 faces, rasterised by the renderer itself. move the cursor over it.

[01] what it is

two files. the first drops the stanford bunny into any page as a <pre> you can turn with the cursor. the second is a node script that bakes your own mesh into the same kind of self-contained renderer.

  • one <pre> and one script tag for the bunny demo
  • node obj-to-ascii-render.js model.obj writes a plain .js file
  • no npm packages, no bundler, no runtime imports

[02] how it works

positions, normals and triangle indices are loaded once as typed arrays. every frame the mesh is rotated, projected orthographically onto the character grid, and shaded by one key light with two weak fills. luminance picks a glyph from a density ramp. the glyph is the pixel.

on export the mesh is normalised into the unit cube, so scale and origin in blender do not matter.

[03] the limits

  • face indices live in a Uint16Array: 65,535 vertices after processing
  • uv maps and .mtl materials are ignored
  • models without normals get smooth normals averaged from adjacent faces
  • anything larger needs decimating before export
a framebuffer is not the only way to make a model legible. at the right resolution, characters carry the silhouette.