Initial Comming

This commit is contained in:
2026-06-26 13:58:39 +10:00
parent 8b064bbd39
commit 0d1d66a85d
28 changed files with 4328 additions and 2 deletions
+51
View File
@@ -0,0 +1,51 @@
# Building a Newbury Crest (marker ID 0)
A "Newbury Crest" is the physical anchor marker. It has two parts:
1. **Detector core** — a 6×6 grid of flat black & white tiles. This is the part the camera reads.
It is an ArUco 4×4 marker (1-cell black border + 4×4 data), so it must be **exact**.
2. **Colour-wheel ring** — a decorative 1-tile-wide border of Red / Yellow / Blue around the core.
Purely cosmetic (Hidden Side theme); the detector ignores it.
See `crest-01_buildplan.svg` for the full picture and `crest-01_buildmap.json` for the raw grid.
## The detector core (6×6) — ID 0
`#` = **black** tile, `.` = **white** tile. Build it in this exact orientation; the single
yellow corner dot in the app shows which corner is the reference (top-left here).
```
# # # # # #
# . # . . #
# # . # . #
# # # . . #
# # # . # #
# # # # # #
```
- Outer ring is **all black** (the ArUco quiet border) — do not substitute colours here.
- Use **flat tiles**, not plates with exposed studs — studs cast shadows that hurt detection.
- Suggested scale: one **2×2 tile per cell** = 16 mm cells → **96 × 96 mm** core.
(For a crisper read at distance, go 2×2 *studs* per cell using four 1×1 tiles — finer edges.)
## The colour-wheel ring
Wrap one tile-row of Red/Yellow/Blue around the 96 mm core, cycling R→Y→B. Keep it **outside**
the black border (it can touch the black border directly — black separates it from the data).
- Red `#F65151` · Yellow `#FFF35D` · Blue `#529EFF`
- These are the exact Hidden Side ghost-lure gradient tops, so it reads as the colour wheel.
## Mounting
- Mount flat on a black baseplate, flush and rigid (no warping — a curved marker breaks pose).
- Matte tiles beat glossy if you have the choice; glare is the main real-world enemy.
- Place at "street level" where a phone naturally frames it as part of the scene.
## Test before you commit
1. Print `crest-01_aruco0.svg` at ~100 mm and tape it down.
2. Open `ar-test.html` on your phone (over HTTPS), point at it.
3. HUD should show **id: 0** and a blue wisp should hover above it.
4. Try angles, distance, and your real exhibition lighting. If it holds lock well, build the
LEGO version with confidence; if glare is an issue, matte it down.
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><rect width="100" height="100" fill="#ffffff"/><rect x="20" y="20" width="10" height="10" fill="#000000"/><rect x="30" y="20" width="10" height="10" fill="#000000"/><rect x="40" y="20" width="10" height="10" fill="#000000"/><rect x="50" y="20" width="10" height="10" fill="#000000"/><rect x="60" y="20" width="10" height="10" fill="#000000"/><rect x="70" y="20" width="10" height="10" fill="#000000"/><rect x="20" y="30" width="10" height="10" fill="#000000"/><rect x="30" y="30" width="10" height="10" fill="#ffffff"/><rect x="40" y="30" width="10" height="10" fill="#000000"/><rect x="50" y="30" width="10" height="10" fill="#ffffff"/><rect x="60" y="30" width="10" height="10" fill="#ffffff"/><rect x="70" y="30" width="10" height="10" fill="#000000"/><rect x="20" y="40" width="10" height="10" fill="#000000"/><rect x="30" y="40" width="10" height="10" fill="#000000"/><rect x="40" y="40" width="10" height="10" fill="#ffffff"/><rect x="50" y="40" width="10" height="10" fill="#000000"/><rect x="60" y="40" width="10" height="10" fill="#ffffff"/><rect x="70" y="40" width="10" height="10" fill="#000000"/><rect x="20" y="50" width="10" height="10" fill="#000000"/><rect x="30" y="50" width="10" height="10" fill="#000000"/><rect x="40" y="50" width="10" height="10" fill="#000000"/><rect x="50" y="50" width="10" height="10" fill="#ffffff"/><rect x="60" y="50" width="10" height="10" fill="#ffffff"/><rect x="70" y="50" width="10" height="10" fill="#000000"/><rect x="20" y="60" width="10" height="10" fill="#000000"/><rect x="30" y="60" width="10" height="10" fill="#000000"/><rect x="40" y="60" width="10" height="10" fill="#000000"/><rect x="50" y="60" width="10" height="10" fill="#ffffff"/><rect x="60" y="60" width="10" height="10" fill="#000000"/><rect x="70" y="60" width="10" height="10" fill="#000000"/><rect x="20" y="70" width="10" height="10" fill="#000000"/><rect x="30" y="70" width="10" height="10" fill="#000000"/><rect x="40" y="70" width="10" height="10" fill="#000000"/><rect x="50" y="70" width="10" height="10" fill="#000000"/><rect x="60" y="70" width="10" height="10" fill="#000000"/><rect x="70" y="70" width="10" height="10" fill="#000000"/><text x="50" y="96" font-family="monospace" font-size="7" text-anchor="middle" fill="#000">ArUco4x4 id 0</text></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+79
View File
@@ -0,0 +1,79 @@
{
"anchorName": "crest-01",
"ward": "North-West Ward",
"arucoId": 0,
"dictionary": "ARUCO_4X4_1000",
"detectorCore": {
"gridSize": 6,
"note": "1-cell black quiet border + 4x4 data. Use FLAT TILES. 0=Black, 1=White.",
"cells": [
[
0,
0,
0,
0,
0,
0
],
[
0,
1,
0,
1,
1,
0
],
[
0,
0,
1,
0,
1,
0
],
[
0,
0,
0,
1,
1,
0
],
[
0,
0,
0,
1,
0,
0
],
[
0,
0,
0,
0,
0,
0
]
]
},
"colourWheelFrame": {
"note": "Decorative Hidden Side border, 1 tile-row wide around the 6x6 core. Cycle R/Y/B. Detector ignores this zone but it must sit OUTSIDE the white quiet margin OR be separated by a black/white gap so it does not bleed into detection.",
"palette": {
"Red": "#F65151",
"Yellow": "#FFF35D",
"Blue": "#529EFF"
},
"cycle": [
"Red",
"Yellow",
"Blue"
]
},
"physical": {
"cellMm": 16,
"coreMm": 96,
"recommendedPart": "2x2 tile per cell (or 1x1 tiles 4-up for finer)",
"mountNote": "Flat on a black baseplate. Keep flush, no studs proud of tile surface."
}
}
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.2 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><rect width="100" height="100" fill="#ffffff"/><rect x="20" y="20" width="10" height="10" fill="#000000"/><rect x="30" y="20" width="10" height="10" fill="#000000"/><rect x="40" y="20" width="10" height="10" fill="#000000"/><rect x="50" y="20" width="10" height="10" fill="#000000"/><rect x="60" y="20" width="10" height="10" fill="#000000"/><rect x="70" y="20" width="10" height="10" fill="#000000"/><rect x="20" y="30" width="10" height="10" fill="#000000"/><rect x="30" y="30" width="10" height="10" fill="#000000"/><rect x="40" y="30" width="10" height="10" fill="#000000"/><rect x="50" y="30" width="10" height="10" fill="#000000"/><rect x="60" y="30" width="10" height="10" fill="#000000"/><rect x="70" y="30" width="10" height="10" fill="#000000"/><rect x="20" y="40" width="10" height="10" fill="#000000"/><rect x="30" y="40" width="10" height="10" fill="#ffffff"/><rect x="40" y="40" width="10" height="10" fill="#ffffff"/><rect x="50" y="40" width="10" height="10" fill="#ffffff"/><rect x="60" y="40" width="10" height="10" fill="#ffffff"/><rect x="70" y="40" width="10" height="10" fill="#000000"/><rect x="20" y="50" width="10" height="10" fill="#000000"/><rect x="30" y="50" width="10" height="10" fill="#ffffff"/><rect x="40" y="50" width="10" height="10" fill="#000000"/><rect x="50" y="50" width="10" height="10" fill="#000000"/><rect x="60" y="50" width="10" height="10" fill="#ffffff"/><rect x="70" y="50" width="10" height="10" fill="#000000"/><rect x="20" y="60" width="10" height="10" fill="#000000"/><rect x="30" y="60" width="10" height="10" fill="#ffffff"/><rect x="40" y="60" width="10" height="10" fill="#000000"/><rect x="50" y="60" width="10" height="10" fill="#ffffff"/><rect x="60" y="60" width="10" height="10" fill="#000000"/><rect x="70" y="60" width="10" height="10" fill="#000000"/><rect x="20" y="70" width="10" height="10" fill="#000000"/><rect x="30" y="70" width="10" height="10" fill="#000000"/><rect x="40" y="70" width="10" height="10" fill="#000000"/><rect x="50" y="70" width="10" height="10" fill="#000000"/><rect x="60" y="70" width="10" height="10" fill="#000000"/><rect x="70" y="70" width="10" height="10" fill="#000000"/><text x="50" y="96" font-family="monospace" font-size="7" text-anchor="middle" fill="#000">ArUco4x4 id 1</text></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+79
View File
@@ -0,0 +1,79 @@
{
"anchorName": "crest-02",
"ward": "North-East Ward",
"arucoId": 1,
"dictionary": "ARUCO_4X4_1000",
"detectorCore": {
"gridSize": 6,
"note": "1-cell black quiet border + 4x4 data. Use FLAT TILES. 0=Black, 1=White.",
"cells": [
[
0,
0,
0,
0,
0,
0
],
[
0,
0,
0,
0,
0,
0
],
[
0,
1,
1,
1,
1,
0
],
[
0,
1,
0,
0,
1,
0
],
[
0,
1,
0,
1,
0,
0
],
[
0,
0,
0,
0,
0,
0
]
]
},
"colourWheelFrame": {
"note": "Decorative Hidden Side border, 1 tile-row wide around the 6x6 core. Cycle R/Y/B. Detector ignores this zone but it must sit OUTSIDE the white quiet margin OR be separated by a black/white gap so it does not bleed into detection.",
"palette": {
"Red": "#F65151",
"Yellow": "#FFF35D",
"Blue": "#529EFF"
},
"cycle": [
"Red",
"Yellow",
"Blue"
]
},
"physical": {
"cellMm": 16,
"coreMm": 96,
"recommendedPart": "2x2 tile per cell (or 1x1 tiles 4-up for finer)",
"mountNote": "Flat on a black baseplate. Keep flush, no studs proud of tile surface."
}
}
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><rect width="100" height="100" fill="#ffffff"/><rect x="20" y="20" width="10" height="10" fill="#000000"/><rect x="30" y="20" width="10" height="10" fill="#000000"/><rect x="40" y="20" width="10" height="10" fill="#000000"/><rect x="50" y="20" width="10" height="10" fill="#000000"/><rect x="60" y="20" width="10" height="10" fill="#000000"/><rect x="70" y="20" width="10" height="10" fill="#000000"/><rect x="20" y="30" width="10" height="10" fill="#000000"/><rect x="30" y="30" width="10" height="10" fill="#000000"/><rect x="40" y="30" width="10" height="10" fill="#000000"/><rect x="50" y="30" width="10" height="10" fill="#ffffff"/><rect x="60" y="30" width="10" height="10" fill="#ffffff"/><rect x="70" y="30" width="10" height="10" fill="#000000"/><rect x="20" y="40" width="10" height="10" fill="#000000"/><rect x="30" y="40" width="10" height="10" fill="#000000"/><rect x="40" y="40" width="10" height="10" fill="#000000"/><rect x="50" y="40" width="10" height="10" fill="#ffffff"/><rect x="60" y="40" width="10" height="10" fill="#ffffff"/><rect x="70" y="40" width="10" height="10" fill="#000000"/><rect x="20" y="50" width="10" height="10" fill="#000000"/><rect x="30" y="50" width="10" height="10" fill="#000000"/><rect x="40" y="50" width="10" height="10" fill="#000000"/><rect x="50" y="50" width="10" height="10" fill="#ffffff"/><rect x="60" y="50" width="10" height="10" fill="#000000"/><rect x="70" y="50" width="10" height="10" fill="#000000"/><rect x="20" y="60" width="10" height="10" fill="#000000"/><rect x="30" y="60" width="10" height="10" fill="#ffffff"/><rect x="40" y="60" width="10" height="10" fill="#ffffff"/><rect x="50" y="60" width="10" height="10" fill="#000000"/><rect x="60" y="60" width="10" height="10" fill="#ffffff"/><rect x="70" y="60" width="10" height="10" fill="#000000"/><rect x="20" y="70" width="10" height="10" fill="#000000"/><rect x="30" y="70" width="10" height="10" fill="#000000"/><rect x="40" y="70" width="10" height="10" fill="#000000"/><rect x="50" y="70" width="10" height="10" fill="#000000"/><rect x="60" y="70" width="10" height="10" fill="#000000"/><rect x="70" y="70" width="10" height="10" fill="#000000"/><text x="50" y="96" font-family="monospace" font-size="7" text-anchor="middle" fill="#000">ArUco4x4 id 2</text></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+79
View File
@@ -0,0 +1,79 @@
{
"anchorName": "crest-03",
"ward": "Town Square Ward",
"arucoId": 2,
"dictionary": "ARUCO_4X4_1000",
"detectorCore": {
"gridSize": 6,
"note": "1-cell black quiet border + 4x4 data. Use FLAT TILES. 0=Black, 1=White.",
"cells": [
[
0,
0,
0,
0,
0,
0
],
[
0,
0,
0,
1,
1,
0
],
[
0,
0,
0,
1,
1,
0
],
[
0,
0,
0,
1,
0,
0
],
[
0,
1,
1,
0,
1,
0
],
[
0,
0,
0,
0,
0,
0
]
]
},
"colourWheelFrame": {
"note": "Decorative Hidden Side border, 1 tile-row wide around the 6x6 core. Cycle R/Y/B. Detector ignores this zone but it must sit OUTSIDE the white quiet margin OR be separated by a black/white gap so it does not bleed into detection.",
"palette": {
"Red": "#F65151",
"Yellow": "#FFF35D",
"Blue": "#529EFF"
},
"cycle": [
"Red",
"Yellow",
"Blue"
]
},
"physical": {
"cellMm": 16,
"coreMm": 96,
"recommendedPart": "2x2 tile per cell (or 1x1 tiles 4-up for finer)",
"mountNote": "Flat on a black baseplate. Keep flush, no studs proud of tile surface."
}
}
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><rect width="100" height="100" fill="#ffffff"/><rect x="20" y="20" width="10" height="10" fill="#000000"/><rect x="30" y="20" width="10" height="10" fill="#000000"/><rect x="40" y="20" width="10" height="10" fill="#000000"/><rect x="50" y="20" width="10" height="10" fill="#000000"/><rect x="60" y="20" width="10" height="10" fill="#000000"/><rect x="70" y="20" width="10" height="10" fill="#000000"/><rect x="20" y="30" width="10" height="10" fill="#000000"/><rect x="30" y="30" width="10" height="10" fill="#ffffff"/><rect x="40" y="30" width="10" height="10" fill="#000000"/><rect x="50" y="30" width="10" height="10" fill="#000000"/><rect x="60" y="30" width="10" height="10" fill="#ffffff"/><rect x="70" y="30" width="10" height="10" fill="#000000"/><rect x="20" y="40" width="10" height="10" fill="#000000"/><rect x="30" y="40" width="10" height="10" fill="#ffffff"/><rect x="40" y="40" width="10" height="10" fill="#000000"/><rect x="50" y="40" width="10" height="10" fill="#000000"/><rect x="60" y="40" width="10" height="10" fill="#ffffff"/><rect x="70" y="40" width="10" height="10" fill="#000000"/><rect x="20" y="50" width="10" height="10" fill="#000000"/><rect x="30" y="50" width="10" height="10" fill="#000000"/><rect x="40" y="50" width="10" height="10" fill="#ffffff"/><rect x="50" y="50" width="10" height="10" fill="#000000"/><rect x="60" y="50" width="10" height="10" fill="#000000"/><rect x="70" y="50" width="10" height="10" fill="#000000"/><rect x="20" y="60" width="10" height="10" fill="#000000"/><rect x="30" y="60" width="10" height="10" fill="#000000"/><rect x="40" y="60" width="10" height="10" fill="#ffffff"/><rect x="50" y="60" width="10" height="10" fill="#ffffff"/><rect x="60" y="60" width="10" height="10" fill="#000000"/><rect x="70" y="60" width="10" height="10" fill="#000000"/><rect x="20" y="70" width="10" height="10" fill="#000000"/><rect x="30" y="70" width="10" height="10" fill="#000000"/><rect x="40" y="70" width="10" height="10" fill="#000000"/><rect x="50" y="70" width="10" height="10" fill="#000000"/><rect x="60" y="70" width="10" height="10" fill="#000000"/><rect x="70" y="70" width="10" height="10" fill="#000000"/><text x="50" y="96" font-family="monospace" font-size="7" text-anchor="middle" fill="#000">ArUco4x4 id 3</text></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+79
View File
@@ -0,0 +1,79 @@
{
"anchorName": "crest-04",
"ward": "South-West Ward",
"arucoId": 3,
"dictionary": "ARUCO_4X4_1000",
"detectorCore": {
"gridSize": 6,
"note": "1-cell black quiet border + 4x4 data. Use FLAT TILES. 0=Black, 1=White.",
"cells": [
[
0,
0,
0,
0,
0,
0
],
[
0,
1,
0,
0,
1,
0
],
[
0,
1,
0,
0,
1,
0
],
[
0,
0,
1,
0,
0,
0
],
[
0,
0,
1,
1,
0,
0
],
[
0,
0,
0,
0,
0,
0
]
]
},
"colourWheelFrame": {
"note": "Decorative Hidden Side border, 1 tile-row wide around the 6x6 core. Cycle R/Y/B. Detector ignores this zone but it must sit OUTSIDE the white quiet margin OR be separated by a black/white gap so it does not bleed into detection.",
"palette": {
"Red": "#F65151",
"Yellow": "#FFF35D",
"Blue": "#529EFF"
},
"cycle": [
"Red",
"Yellow",
"Blue"
]
},
"physical": {
"cellMm": 16,
"coreMm": 96,
"recommendedPart": "2x2 tile per cell (or 1x1 tiles 4-up for finer)",
"mountNote": "Flat on a black baseplate. Keep flush, no studs proud of tile surface."
}
}
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><rect width="100" height="100" fill="#ffffff"/><rect x="20" y="20" width="10" height="10" fill="#000000"/><rect x="30" y="20" width="10" height="10" fill="#000000"/><rect x="40" y="20" width="10" height="10" fill="#000000"/><rect x="50" y="20" width="10" height="10" fill="#000000"/><rect x="60" y="20" width="10" height="10" fill="#000000"/><rect x="70" y="20" width="10" height="10" fill="#000000"/><rect x="20" y="30" width="10" height="10" fill="#000000"/><rect x="30" y="30" width="10" height="10" fill="#000000"/><rect x="40" y="30" width="10" height="10" fill="#ffffff"/><rect x="50" y="30" width="10" height="10" fill="#000000"/><rect x="60" y="30" width="10" height="10" fill="#ffffff"/><rect x="70" y="30" width="10" height="10" fill="#000000"/><rect x="20" y="40" width="10" height="10" fill="#000000"/><rect x="30" y="40" width="10" height="10" fill="#000000"/><rect x="40" y="40" width="10" height="10" fill="#ffffff"/><rect x="50" y="40" width="10" height="10" fill="#000000"/><rect x="60" y="40" width="10" height="10" fill="#000000"/><rect x="70" y="40" width="10" height="10" fill="#000000"/><rect x="20" y="50" width="10" height="10" fill="#000000"/><rect x="30" y="50" width="10" height="10" fill="#ffffff"/><rect x="40" y="50" width="10" height="10" fill="#000000"/><rect x="50" y="50" width="10" height="10" fill="#000000"/><rect x="60" y="50" width="10" height="10" fill="#ffffff"/><rect x="70" y="50" width="10" height="10" fill="#000000"/><rect x="20" y="60" width="10" height="10" fill="#000000"/><rect x="30" y="60" width="10" height="10" fill="#ffffff"/><rect x="40" y="60" width="10" height="10" fill="#ffffff"/><rect x="50" y="60" width="10" height="10" fill="#ffffff"/><rect x="60" y="60" width="10" height="10" fill="#000000"/><rect x="70" y="60" width="10" height="10" fill="#000000"/><rect x="20" y="70" width="10" height="10" fill="#000000"/><rect x="30" y="70" width="10" height="10" fill="#000000"/><rect x="40" y="70" width="10" height="10" fill="#000000"/><rect x="50" y="70" width="10" height="10" fill="#000000"/><rect x="60" y="70" width="10" height="10" fill="#000000"/><rect x="70" y="70" width="10" height="10" fill="#000000"/><text x="50" y="96" font-family="monospace" font-size="7" text-anchor="middle" fill="#000">ArUco4x4 id 4</text></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+79
View File
@@ -0,0 +1,79 @@
{
"anchorName": "crest-05",
"ward": "South-East Ward",
"arucoId": 4,
"dictionary": "ARUCO_4X4_1000",
"detectorCore": {
"gridSize": 6,
"note": "1-cell black quiet border + 4x4 data. Use FLAT TILES. 0=Black, 1=White.",
"cells": [
[
0,
0,
0,
0,
0,
0
],
[
0,
0,
1,
0,
1,
0
],
[
0,
0,
1,
0,
0,
0
],
[
0,
1,
0,
0,
1,
0
],
[
0,
1,
1,
1,
0,
0
],
[
0,
0,
0,
0,
0,
0
]
]
},
"colourWheelFrame": {
"note": "Decorative Hidden Side border, 1 tile-row wide around the 6x6 core. Cycle R/Y/B. Detector ignores this zone but it must sit OUTSIDE the white quiet margin OR be separated by a black/white gap so it does not bleed into detection.",
"palette": {
"Red": "#F65151",
"Yellow": "#FFF35D",
"Blue": "#529EFF"
},
"cycle": [
"Red",
"Yellow",
"Blue"
]
},
"physical": {
"cellMm": 16,
"coreMm": 96,
"recommendedPart": "2x2 tile per cell (or 1x1 tiles 4-up for finer)",
"mountNote": "Flat on a black baseplate. Keep flush, no studs proud of tile surface."
}
}
+31
View File
@@ -0,0 +1,31 @@
{
"dictionary": "ARUCO_4X4_1000",
"note": "Maps physical ArUco marker IDs to scene.json anchors. fiducialId in scene.json must match arucoId here.",
"markers": [
{
"id": 0,
"name": "crest-01",
"ward": "North-West Ward"
},
{
"id": 1,
"name": "crest-02",
"ward": "North-East Ward"
},
{
"id": 2,
"name": "crest-03",
"ward": "Town Square Ward"
},
{
"id": 3,
"name": "crest-04",
"ward": "South-West Ward"
},
{
"id": 4,
"name": "crest-05",
"ward": "South-East Ward"
}
]
}