# Quiet Lantern

A 90 × 120 mm lithophane made from [Quiet Face I](../../assets/quiet-face-i.jpg). In Lantern mode, the thin passages glow through the panel. In Daylight mode, light grazes the same relief and brings out ridges and texture.

- [Open the interactive study](./index.html)
- [Download the binary STL](./quiet-lantern.stl)
- [Warm backlight render](./cover.png) · [Raking daylight render](./daylight.png)

## How the panel was made

The existing photograph is cropped around the painted oval. A hand-traced mask follows the inside of its edge and feathers into the surrounding field. This isolates the painting from the wood and fabric in the photograph. The crop is resampled at 0.5 mm intervals. Rec. 709 weights combine the encoded RGB channels into luma. A linear grade maps luma from 0.235 to 0.798 onto thickness from 3.05 to 0.80 mm, with clamping at both ends. The oval feathers into a 3.25 mm field. The 3.60 mm rim runs 2.50 mm in from the edge before a 1.50 mm transition, and the outer edge has a shallow bevel.

The baked field contains 181 × 241 samples stored as little-endian unsigned 16-bit micrometres in `heightfield.json`. The browser interpolates over the same triangle split as the mesh. The STL closes the raised surface with vertical perimeter walls and a flat base at Z = 0. Looking down the +Z face with +Y up matches the orientation of the source portrait.

## What the lighting shows

In Lantern mode, each display channel uses Beer–Lambert-style attenuation, with transmitted intensity proportional to `lamp strength × exp(−μ × thickness)`. The illustrative red, green and blue coefficients are 1.33, 1.55 and 1.94 mm⁻¹. A warm fill and a broad lamp falloff model the surrounding light. At 0%, only the room reflection remains.

Daylight mode uses surface normals and short shadow rays across the same height field. Both views are staged with a slight tilt and a lit backdrop. The lamp spectrum, coefficients and room lighting are artistic choices, and neither view is calibrated to a filament sample.

## Printing the panel

Import the STL in millimetres at 100% scale. Set its flat base on the build plate, with the relief facing up. The model is a single solid with no undercuts. For a first sample, use a translucent white or natural PLA and try 0.10 mm layers with 100% infill to keep the internal structure uniform. View with a diffuse warm LED behind the flat face. The finished brightness and contrast depend on the filament, the slice and the light. The supplied STL was checked as a mesh. It has yet to be sliced or physically printed.

Prusa explains the flat lithophane orientation and fine layer settings in [From 2D to 3D](https://blog.prusa3d.com/from-2d-to-3d-how-to-turn-a-picture-or-a-photo-into-a-3d-model_8882/). Its [filament transparency study](https://blog.prusa3d.com/lets-play-with-filament-transparency-how-to-make-amazing-lifelike-color-photos-with-just-a-simple-color-change_104338/) discusses how filament choice and print settings affect transmitted detail.

## Reproduce the checks

From this directory in the repository, with Python and Pillow available, run the following.

```sh
python3 build-lantern.py
python3 verify-mesh.py
```

The verifier checks the binary triangle count, signed winding, edge pairing, Euler characteristic, extents and agreement with every browser height sample. The exported mesh has 88,920 triangles and 44,462 welded vertices.

With the workspace Playwright install available and `python3 ../../serve.py` running in a separate terminal, run the following.

```sh
node capture-lantern.mjs
node capture-lantern.mjs --write # Refresh both art-only proofs from Chromium
```

The browser check covers the default view, lamp intensity and off state, keyboard and touch lighting controls, retained lamp strength, mobile overflow and STL download. Both 1,200 × 900 proofs come directly from the live Canvas 2D renderer.
