ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Interactive 3D atlas of human oral anatomy — 28 individually selectable permanent teeth, jaws, gingiva, pulp, periodontal ligament and nerve supply, all segmented from one cone-beam CT. Takes a simula
EducationPython · JavaScriptGitHub @NateSaindonOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Interactive 3D atlas of human oral anatomy in the browser — 28 selectable permanent teeth, jaws, gingiva, pulp, PDL and nerve supply, all segmented from one cone-beam CT. Takes a simulated periapical radiograph of any tooth, with that patient's own trabecular bone on the film. Linux, macOS, Windows, iPad.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Interactive 3D atlas of human oral anatomy, in the browser — segmented from a
real cone-beam CT, and it takes its own radiograph. One codebase runs on
Linux, macOS, Windows and iPad — install it to the home screen and it works
offline.
Live: https://natesaindon.github.io/3Dentes/ · What changed:
CHANGELOG.md (currently v0.9.2)
The anatomy is segmented from one cone-beam CT at 0.16 mm isotropic — hard
tissue, pulp, periodontal ligament, gingiva and the nerve supply, all of one
person. Fading the teeth back is what the layer opacity is for.Read the full README ↗Interactive 3D atlas of human oral anatomy, in the browser — segmented from a real cone-beam CT, and it takes its own radiograph. One codebase runs on Linux, macOS, Windows and iPad — install it to the home screen and it works offline.
Live: https://natesaindon.github.io/3Dentes/ · What changed: CHANGELOG.md (currently v0.9.2)
The anatomy is segmented from one cone-beam CT at 0.16 mm isotropic — hard tissue, pulp, periodontal ligament, gingiva and the nerve supply, all of one person. Fading the teeth back is what the layer opacity is for.
The sensor and the beam are placed in the mouth in the 3D view, and the film beside them is computed from the same geometry. Selecting any part of a tooth — including its enamel or its crown — aims the tube at it.
Nothing about the following is drawn on. The projection is built from a source point and the receptor rectangle, so the errors of the technique are consequences of where the tube and the film were put — the film even reports what the tooth measures on it against its true length.
Different parts of this model stand on very different evidence, and the atlas is built to keep them apart rather than render them alike:
| Measured | Teeth, mandible, maxilla, the mandibular canal, and the pulp — the pulp traced by hand on the slices, because no threshold separates it from dentin at this resolution. |
| Derived | Gingiva, lofted from the measured cementoenamel junction and refitted to the published cervical-line curvature. Enamel, a depth-limited shell whose extent is measured and whose thickness is literature. The periodontal ligament and the lamina dura, both measured in position but drawn thicker than the truth — the ligament is barely one voxel, and the socket wall is drawn continuous rather than only where cortex was resolved. |
| Schematic | The two zirconia crowns: their outline is measured, but this scan saturates and cannot measure their density, which is the material's from the literature. The nerve inside the mandibular canal — CBCT resolves the canal, not its contents. The mental and incisive branches. Every maxillary nerve: the superior alveolar canals are thin, often dehiscent, and not reliably visible at 0.16 mm. |
The app says this per structure, not just here. Select anything and the detail panel states its tier — measured, derived or schematic — the method that produced it, and a source where the shape came from the literature rather than the scan. That is a build-enforced field on every structure rather than a note in a README, because the question "how do you know?" gets asked about the thing you just clicked, not about the project.
This is a study and visualisation aid, not a complete clinical reference. The app states this on screen; please keep it that way in any fork.
Still on the list — including a caries slider, an age-calcification slider, and arteries and veins — is in docs/wishlist.md. The pathology feature has its own tracker in docs/pathology-wishlist.md: none of it is built, and everything in it would be authored disease on a healthy dentition, labelled as such.
npm install
npm run build:assets # -> public/dentition.glb + teeth.json
npm run dev # http://localhost:5173/3Dentes/
The STLs are vendored in assets/cbct/stl/, so the build works offline. Earlier
versions had a second, BodyParts3D-derived asset tree selected by a
TOOTH_SOURCE environment variable; that tree has been removed and there is one
source now.
The CBCT pipeline itself is not part of npm — it is the Python in
tools/cbct/, and it needs the imaging data, which is not in this repo.
To reach the dev server from an iPad on the same network, npm run dev -- --host.
tools/manifest.mjs which structures to use, their layer, anatomical side,
and the notation derivation (single source of truth)
tools/build-assets.mjs STL -> welded, smooth-shaded, y-up, centred .glb
tools/cbct/ the Python that produced assets/cbct/ from the scan:
segmentation, arch split, pulp tracing, gingiva, nerves
src/scene.js renderer, lighting, camera, camera flights
src/picking.js raycast selection, drag-vs-click, see-through handling
src/odontogram.js the tooth chart
src/ui.js layer, notation and detail panels
src/main.js wiring and selection state
CLAUDE.md carries the long-form record of this pipeline — every rule that cost
something to learn, and the things already ruled out. Read it before changing
anything under tools/cbct/.
FMA identifiers are the join key throughout: a structure is FMA55697
everywhere — the source filename, the glTF node name, and the key in
teeth.json.
The build refuses to produce a mislabelled model. Two assertions run on every
build. The first is laterality: anatomical right is negative x, and a structure
labelled left that sits on the right fails the build. The second checks the tooth
numbering against the tooth shapes — Universal, FDI and Palmer are all derived
from one arch/side/position triple, so they always agree with each other, and
agreeing with each other is not the same as being right. So the teeth are ordered
around each arch geometrically and that order must match the numbering, and
molars and canines are identified from volume, root count and length and must
land on the positions claiming them. node tools/tooth-morphology.test.mjs
corrupts the mapping in six plausible ways and confirms each is caught.
A few things that were not obvious and are easy to regress:
@gltf-transform's normals() generates flat normals, not smooth ones,
hence the hand-rolled area-weighted computeSmoothNormals.checkLaterality asserts every structure labelled left or right
sits on the expected side. An atlas that confidently mislabels a side is worse
than no atlas.Two things with two different standings:
src/, tools/) — MIT. See LICENSE.assets/cbct/, and the dentition.glb built from it) — Nate
Saindon's own scan, published with his explicit consent, and licensed
CC BY-NC 4.0. Use,
adapt and redistribute it non-commercially, including in teaching, with
attribution: "Anatomy from 3Dentes by Nate Saindon, CC BY-NC 4.0."
Commercial use is not granted here — ask.The atlas previously vendored BodyParts3D meshes under CC BY-SA 2.1 Japan. All of them have been replaced by measured CBCT anatomy and removed from the repository, so no ShareAlike obligation reaches any part of this project. Full detail, including what that inheritance used to cover, is in ATTRIBUTION.md.
This repo contains one individual's medical imaging derivatives, with consent. It contains no DICOM, no raw volumes, and no third-party patient data — and it never should.