ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证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.
翻译准备中
取自仓库 README
正在加载完整 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.查看完整 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.