Update exhibit

This commit is contained in:
2026-07-06 19:25:57 +10:00
parent 5ffd1346d6
commit e92ad04b7e
8 changed files with 3757 additions and 195 deletions
+36 -3
View File
@@ -78,6 +78,32 @@ a procedural blue "Sad" wisp.
---
## Scene workshop (admin GUI): `admin.html`
A 3D authoring tool over `data/scene.json` — no more hand-editing JSON. Orbit the build, click to
select, drag on the table to position. Four tabs:
- **World** — table dimensions (mm). X = length, Z = depth, Y = max ghost height.
- **Anchors** — the AR crests: marker type/id, size, position, yaw. (Note: existing scene used
`apriltag`; the detector is ArUco — the editor lets you set `aruco` and the matching id.)
- **Ghosts** — spawns with `hover` (position + radius + bob + yaw) or `patrol` (editable path of
points, loop period, face-travel) motion, plus lure colour. Drag the ghost to move it; drag
individual patrol points to reshape the path.
- **Buildings** — simple stackable box blockers for occlusion. Drag to place, set W×H×D, and
"Duplicate (stack +Y)" to pile boxes into a structure. (Occlusion rendering comes next; this
authors the geometry.)
Tools: select (V), add ghost (G), add building (B), add anchor (A). Delete/Esc work on selection.
**Save** POSTs to the server, which **backs up the old `scene.json`** to `data/backups/` first,
validates, writes, and **hot-reloads** — so connected viewers/phones get the new anchors and
ghosts immediately. **Export** downloads the JSON; **Reload** discards changes and re-fetches.
Server endpoints: `GET /api/scene` (full scene), `POST /api/scene` (validated save + backup).
> The scene schema gained a `blockers` array: `{ id, label, position:{x,y,z}, size:{x,y,z} }`,
> where `position` is the footprint corner (origin-relative) and `size` is the box extent in mm.
## Forgiving scanning (`js/detect-tuned.js`)
Raw js-aruco can feel finicky — slow to acquire, quick to drop on blur, jittery once locked.
@@ -142,12 +168,17 @@ key numbers — they'll tell us how much multi-marker fusion is worth before we
```bash
npm install
npm start # PORT defaults to 34034
# open http://localhost:34034/ar-test.html (camera needs HTTPS on phones)
# open http://localhost:34034/ god-view viewer (viewer.js)
# open http://localhost:34034/admin.html scene workshop (authoring GUI)
# open http://localhost:34034/ar-head.html 3D ghost AR (camera needs HTTPS on phones)
# open http://localhost:34034/ god-view viewer (viewer.js)
```
Env: `PORT` (default 34034), `TICK_HZ` (default 20).
### Deploy box (blackpearl)
`./run.sh {start|stop|restart|status|logs|update}` — background runner for testing.
`./run.sh update` syncs to origin/dev and restarts. `./deploy.sh` is the pull-only one-shot.
---
## Status / roadmap
@@ -159,8 +190,10 @@ Env: `PORT` (default 34034), `TICK_HZ` (default 20).
- [x] AR PoC: camera + detection + ghost locked to marker (flat sprite)
- [x] 3D LEGO-head ghost holding world orientation (`ar-head.html`)
- [x] Pose jitter meter (`jitter.html`) with session logging + JSON export
- [x] Forgiving detection: tuned params, multi-scale, coast + smooth (`detect-tuned.js`)
- [x] Scene workshop admin GUI (`admin.html`) — author anchors, ghosts, motion, buildings; save+backup+hot-reload
- [ ] Multi-marker pose fusion (one combined camera pose from all visible crests)
- [ ] Occluder geometry: ghosts vanish behind premapped buildings (depth-only boxes)
- [ ] Occluder geometry: ghosts vanish behind the building blockers (depth-only boxes)
- [ ] Phone AR client: render anchored ghosts through the camera using marker pose
- [ ] Calibration page: scan each crest, record its measured world position
- [ ] Per-ghost colour/sprite wiring from the enriched roster