code wiki / _hdl_build / nx_recon3d_gate.nx
nx_recon3d_gate.nx source
↩ module page · 181 lines · 9184 B
1// nx_recon3d_gate.nx -- benchmark the classical multi-view triangulation (cadtwin P1). KAT the fixed-point
2// (projection<->ray consistency, 2-view midpoint recovers a known point), then the CHAMFER benchmark the DTU
3// SOTA uses: synthesize 4 camera views of a KNOWN 9-point cloud (a ~160-unit part), triangulate each point,
4// Chamfer vs ground truth -- CLEAN (near-exact) + NOISY (+/-3px, graceful) + NEG-CONTROL (wrong correspondences
5// => large Chamfer, so the metric discriminates). Reports Chamfer in units + permille of the object diagonal.
6// expect_exit: 0 license_tier: ORIGINAL
7import "nx_recon3d.nx"
8
9func rg_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
10func rg_putn(v: i64) -> i64 {
11 let bb: *u8 = sys_mmap(28)
12 var m: i64 = v
13 if m < 0 { rg_puts("-" as *u8); m = 0 - m }
14 let t: *u8 = sys_mmap(28)
15 var k: i64 = 0
16 if m == 0 { t[0] = 48 as u8; k = 1 }
17 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
18 var i: i64 = 0
19 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 }
20 sys_write(1, bb, k)
21 return 0
22}
23func rg_tooth(name: *u8, pass: i64, fails: *i64) -> i64 {
24 rg_puts(" " as *u8); rg_puts(name); rg_puts(" -> " as *u8)
25 if pass == 1 { rg_puts("PASS\n" as *u8); return 0 }
26 rg_puts("FAIL\n" as *u8)
27 fails[0] = fails[0] + 1
28 return 0
29}
30// distance from point P to ray (C, d Q14 unit)
31func rg_raydist(px: i64, py: i64, pz: i64, cx: i64, cy: i64, cz: i64, dx: i64, dy: i64, dz: i64) -> i64 {
32 let vx: i64 = px - cx
33 let vy: i64 = py - cy
34 let vz: i64 = pz - cz
35 let proj: i64 = (dx * vx + dy * vy + dz * vz) / R3_Q // coord
36 let qx: i64 = cx + (proj * dx) / R3_Q
37 let qy: i64 = cy + (proj * dy) / R3_Q
38 let qz: i64 = cz + (proj * dz) / R3_Q
39 return r3_dist(px, py, pz, qx, qy, qz)
40}
41
42func main() -> i64 {
43 rg_puts("=== nx_recon3d_gate -- classical multi-view triangulation, Chamfer benchmark (photo->3D core) ===\n" as *u8)
44 let fails: *i64 = sys_mmap(8) as *i64
45 fails[0] = 0
46
47 // ground-truth cloud: 8 box corners (+-800) + center = 9 points. object diagonal ~ 2771 units.
48 let gt: *i64 = sys_mmap(512) as *i64
49 let np: i64 = 9
50 let H: i64 = 800
51 gt[0] = 0 - H; gt[1] = 0 - H; gt[2] = 0 - H
52 gt[3] = H; gt[4] = 0 - H; gt[5] = 0 - H
53 gt[6] = H; gt[7] = H; gt[8] = 0 - H
54 gt[9] = 0 - H; gt[10] = H; gt[11] = 0 - H
55 gt[12] = 0 - H; gt[13] = 0 - H; gt[14] = H
56 gt[15] = H; gt[16] = 0 - H; gt[17] = H
57 gt[18] = H; gt[19] = H; gt[20] = H
58 gt[21] = 0 - H; gt[22] = H; gt[23] = H
59 gt[24] = 0; gt[25] = 0; gt[26] = 0
60
61 // 4 cameras looking at the origin
62 let ncam: i64 = 4
63 let ccx: *i64 = sys_mmap(64) as *i64
64 let ccy: *i64 = sys_mmap(64) as *i64
65 let ccz: *i64 = sys_mmap(64) as *i64
66 ccx[0] = 5000; ccy[0] = 1500; ccz[0] = 3000
67 ccx[1] = 0 - 5000; ccy[1] = 1500; ccz[1] = 3000
68 ccx[2] = 3000; ccy[2] = 1800; ccz[2] = 0 - 5000
69 ccx[3] = 0 - 3000; ccy[3] = 1200; ccz[3] = 0 - 5000
70 let f: i64 = 1200
71 let basis: *i64 = sys_mmap(64 * 4) as *i64
72 var c: i64 = 0
73 while c < ncam {
74 r3_lookat(ccx[c], ccy[c], ccz[c], 0, 0, 0, (basis as i64 + c * 72) as *i64)
75 c = c + 1
76 }
77
78 // KAT1: project gt[6] (a corner) to cam0, back-project the pixel, ray must pass through the corner
79 let uv: *i64 = sys_mmap(16) as *i64
80 let ray: *i64 = sys_mmap(32) as *i64
81 let zc0: i64 = r3_project(ccx[0], ccy[0], ccz[0], (basis as i64 + 0) as *i64, f, gt[6], gt[7], gt[8], uv)
82 r3_ray((basis as i64 + 0) as *i64, f, uv[0], uv[1], ray)
83 let rd: i64 = rg_raydist(gt[6], gt[7], gt[8], ccx[0], ccy[0], ccz[0], ray[0], ray[1], ray[2])
84 rg_puts(" KAT1 project(corner)->pixel(" as *u8); rg_putn(uv[0]); rg_puts("," as *u8); rg_putn(uv[1])
85 rg_puts(")->ray ; ray-to-corner dist=" as *u8); rg_putn(rd); rg_puts(" (expect ~0)\n" as *u8)
86 var t1: i64 = 0
87 if zc0 > 0 { if rd < 12 { t1 = 1 } }
88 let ig1: i64 = rg_tooth("KAT1 project<->backproject consistent (ray hits the point)" as *u8, t1, fails)
89
90 // KAT2: two rays (cam0, cam2) toward gt[6] -> midpoint recovers gt[6]
91 let uv2: *i64 = sys_mmap(16) as *i64
92 let ray2: *i64 = sys_mmap(32) as *i64
93 r3_project(ccx[2], ccy[2], ccz[2], (basis as i64 + 2 * 72) as *i64, f, gt[6], gt[7], gt[8], uv2)
94 r3_ray((basis as i64 + 2 * 72) as *i64, f, uv2[0], uv2[1], ray2)
95 let mp: *i64 = sys_mmap(32) as *i64
96 r3_midpoint(ccx[0], ccy[0], ccz[0], ray[0], ray[1], ray[2], ccx[2], ccy[2], ccz[2], ray2[0], ray2[1], ray2[2], mp)
97 let mperr: i64 = r3_dist(mp[0], mp[1], mp[2], gt[6], gt[7], gt[8])
98 rg_puts(" KAT2 2-view midpoint = (" as *u8); rg_putn(mp[0]); rg_puts("," as *u8); rg_putn(mp[1]); rg_puts("," as *u8); rg_putn(mp[2])
99 rg_puts(") err=" as *u8); rg_putn(mperr); rg_puts(" (corner=800,800,-800)\n" as *u8)
100 var t2: i64 = 0
101 if mperr < 20 { t2 = 1 }
102 let ig2: i64 = rg_tooth("KAT2 2-view midpoint recovers the known point" as *u8, t2, fails)
103
104 // full N-view triangulation of the whole cloud, CLEAN
105 let recon: *i64 = sys_mmap(512) as *i64
106 let rx: *i64 = sys_mmap(64) as *i64
107 let ry: *i64 = sys_mmap(64) as *i64
108 let rz: *i64 = sys_mmap(64) as *i64
109 let dxa: *i64 = sys_mmap(64) as *i64
110 let dya: *i64 = sys_mmap(64) as *i64
111 let dza: *i64 = sys_mmap(64) as *i64
112 let out3: *i64 = sys_mmap(32) as *i64
113 var noise: i64 = 0
114 var pass: i64 = 0
115 while pass < 3 {
116 // pass0 clean, pass1 +-3px noise, pass2 WRONG correspondences (neg-control)
117 var pi: i64 = 0
118 while pi < np {
119 var cc: i64 = 0
120 while cc < ncam {
121 let bb: i64 = (basis as i64 + cc * 72)
122 let uvp: *i64 = sys_mmap(16) as *i64
123 r3_project(ccx[cc], ccy[cc], ccz[cc], bb as *i64, f, gt[pi * 3], gt[pi * 3 + 1], gt[pi * 3 + 2], uvp)
124 var uu: i64 = uvp[0]
125 var vv: i64 = uvp[1]
126 if pass == 1 {
127 // deterministic +-3px pseudo-noise
128 uu = uu + ((pi * 7 + cc * 13) % 7) - 3
129 vv = vv + ((pi * 5 + cc * 11) % 7) - 3
130 }
131 if pass == 2 {
132 // NEG-CONTROL: use a DIFFERENT point's projection for some cams = wrong correspondence
133 if cc >= 2 {
134 let wrong: i64 = (pi + 3) % np
135 r3_project(ccx[cc], ccy[cc], ccz[cc], bb as *i64, f, gt[wrong * 3], gt[wrong * 3 + 1], gt[wrong * 3 + 2], uvp)
136 uu = uvp[0]; vv = uvp[1]
137 }
138 }
139 let rr: *i64 = sys_mmap(32) as *i64
140 r3_ray(bb as *i64, f, uu, vv, rr)
141 rx[cc] = ccx[cc]; ry[cc] = ccy[cc]; rz[cc] = ccz[cc]
142 dxa[cc] = rr[0]; dya[cc] = rr[1]; dza[cc] = rr[2]
143 cc = cc + 1
144 }
145 r3_triangulate_n(rx, ry, rz, dxa, dya, dza, ncam, out3)
146 recon[pi * 3] = out3[0]; recon[pi * 3 + 1] = out3[1]; recon[pi * 3 + 2] = out3[2]
147 pi = pi + 1
148 }
149 let cham: i64 = r3_chamfer(recon, np, gt, np)
150 // object diagonal ~ 2771; report permille of diagonal
151 let permille: i64 = (cham * 1000) / 2771
152 if pass == 0 {
153 rg_puts(" CLEAN Chamfer=" as *u8); rg_putn(cham); rg_puts(" units = " as *u8); rg_putn(permille); rg_puts(" permille of object diagonal\n" as *u8)
154 var t3: i64 = 0
155 if cham < 20 { t3 = 1 }
156 let ig3: i64 = rg_tooth("T3 CLEAN reconstruction near-EXACT (Chamfer < 20 units)" as *u8, t3, fails)
157 }
158 if pass == 1 {
159 rg_puts(" NOISY Chamfer=" as *u8); rg_putn(cham); rg_puts(" units = " as *u8); rg_putn(permille); rg_puts(" permille (+/-3px)\n" as *u8)
160 var t4: i64 = 0
161 if cham < 120 { t4 = 1 } // graceful: noise degrades but no blowup
162 let ig4: i64 = rg_tooth("T4 NOISY graceful (Chamfer < 120 units, no blowup)" as *u8, t4, fails)
163 noise = cham
164 }
165 if pass == 2 {
166 rg_puts(" WRONG Chamfer=" as *u8); rg_putn(cham); rg_puts(" units (neg-control: bad correspondences)\n" as *u8)
167 var t5: i64 = 0
168 if cham > 150 { t5 = 1 } // metric discriminates wrong data
169 let ig5: i64 = rg_tooth("T5 NEG-CONTROL wrong correspondences -> large Chamfer (metric works)" as *u8, t5, fails)
170 }
171 pass = pass + 1
172 }
173
174 rg_puts("\nSOTA CONTEXT: Chamfer is the DTU reconstruction metric (QGS ~0.54mm). Our CLASSICAL triangulation is\n" as *u8)
175 rg_puts("near-EXACT on clean correspondences; the 2025-26 feed-forward SOTA (DUSt3R/MASt3R/VGGT) is NEURAL =\n" as *u8)
176 rg_puts("trained-model-bound (our named gap). REMAINING sovereign rungs: feature match (nx_features) + pose est.\n" as *u8)
177 rg_puts("\nfails=" as *u8); rg_putn(fails[0]); rg_puts("\n" as *u8)
178 if fails[0] == 0 { rg_puts("verdict=GREEN -- multi-view triangulation 5/5, Chamfer-benchmarked (photo->3D classical core)\n" as *u8); return 0 }
179 rg_puts("RED\n" as *u8)
180 return 1
181}