# Downloaded optical frames, completed for the 3D mirror

Original frames and preview images: **3D Assets**, released under
[CC0 1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/).
Source: [Optician and Optical Lens Workshop](https://3dassets.dev/packs/optician-and-optical-lens-workshop).
The provider describes these as AI-generated optical retail props (GPT-6),
authored in metres, +Y up, +Z forward. They are actual downloadable geometry,
**not scans or exact models of named retail products**. See the retained
[source metadata](source-metadata.json).

| Asset | Original download | Original SHA-256 |
|---|---|---|
| Wire frame | [31687/v1](https://cdn.3dassets.dev/assets/31687/v1/model.glb) | `0a158352451747807f8b2f26a6ef6e807a1e5f17c70a0b8d0138a2d88d3ee5a0` |
| Acetate frame | [31688/v1](https://cdn.3dassets.dev/assets/31688/v1/model.glb) | `8b28fcd4e8d06b47a8e2b3dba17d3c3200ecc2f131f438a0e6193297805d92e8` |

## Adaptation

The source downloads contain frames and temples but no lenses. Reflektit adds two
closed oval demo lenses to each, fitted to the mesh's existing openings. The lens
perimeter overlaps beneath the rim by about 0.3 mm. These are 1.2 mm extrusions
with runtime transmission, volume attenuation and IOR 1.523; they are not a
prescription simulation. They add 760 triangles per asset. Preview images are
the provider's original frame renders; use **Inspect this model in 3D** to view
the actual adapted GLB with its lenses.

Preparation retains every original frame triangle and material. World transforms
are baked and metres convert to renderer millimetres by exactly 1000. Connected
components are grouped into front/left temple/right temple without cutting
triangles. The lens groups and mesh-derived fit anchors complete the required
five-part contract. Frames are never resized to a face.

| Prepared file | Triangles | Bytes | Front width |
|---|---:|---:|---:|
| `wire.glb` | 6,312 | 241,672 | 126.997 mm |
| `acetate.glb` | 8,496 | 545,584 | 127.000 mm |

These are authored sample dimensions. Front width comes from the prepared front
group, lens values from the added geometry, and rim/temple length/anchors are
mesh estimates. **There is no independent caliper measurement**, so passing
dimensional QA confirms conversion and completeness only. `totalHeightMm` remains
undeclared. Source frame heights are about 43.1 and 46.0 mm. Authored narrow arms
may intersect the canonical head; their dimensions must not be changed to hide a
poor fit. Depth occlusion stays active.

Reproduce with the original downloads saved locally:

```sh
node tools/prepare-optical-samples.mjs wire /path/to/wire-original.glb public/frames/optical/wire.glb
node tools/prepare-optical-samples.mjs acetate /path/to/acetate-original.glb public/frames/optical/acetate.glb
npm run assets:validate -- src/widget/landing/optical-catalogue.json
```

The high-LOD assets pass existing byte/triangle limits. There are no textures,
external geometry resources or new dependencies. Compression and low LOD are
not authored for these tests. Physical fit, reference-device performance and
recorded-fixture realism remain unverified. `/test/e2e/khronos/` loads all three
website GLBs without fallback and tests visible lens geometry with depth
occlusion at −60°, 0° and +60°. `/test/e2e/mirror/` checks direct selection, the
camera-free inspector and live switching using a synthetic stream.
