@12ui/design 0.2.70 → 0.2.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/SKILL.md +1 -1
- package/dist/cli-capabilities.d.ts +9 -0
- package/dist/cli-capabilities.d.ts.map +1 -1
- package/dist/cli-capabilities.js +10 -0
- package/dist/cli-capabilities.js.map +1 -1
- package/dist/cli-conversion-recovery-advice.d.ts +35 -0
- package/dist/cli-conversion-recovery-advice.d.ts.map +1 -0
- package/dist/cli-conversion-recovery-advice.js +72 -0
- package/dist/cli-conversion-recovery-advice.js.map +1 -0
- package/dist/cli-convert-command.d.ts.map +1 -1
- package/dist/cli-convert-command.js +153 -35
- package/dist/cli-convert-command.js.map +1 -1
- package/dist/cli-help/index.d.ts +93 -0
- package/dist/cli-help/index.d.ts.map +1 -1
- package/dist/cli-help/index.js +2 -0
- package/dist/cli-help/index.js.map +1 -1
- package/dist/cli-help/scene.d.ts +96 -0
- package/dist/cli-help/scene.d.ts.map +1 -0
- package/dist/cli-help/scene.js +162 -0
- package/dist/cli-help/scene.js.map +1 -0
- package/dist/cli-run.d.ts.map +1 -1
- package/dist/cli-run.js +6 -0
- package/dist/cli-run.js.map +1 -1
- package/dist/cli-scene-command.d.ts +3 -0
- package/dist/cli-scene-command.d.ts.map +1 -0
- package/dist/cli-scene-command.js +292 -0
- package/dist/cli-scene-command.js.map +1 -0
- package/dist/cli-usage.d.ts +8 -0
- package/dist/cli-usage.d.ts.map +1 -1
- package/dist/cli-usage.js +26 -1
- package/dist/cli-usage.js.map +1 -1
- package/dist/conversion-client.d.ts +11 -0
- package/dist/conversion-client.d.ts.map +1 -1
- package/dist/conversion-client.js +11 -1
- package/dist/conversion-client.js.map +1 -1
- package/dist/legacy-skill-catalog.d.ts.map +1 -1
- package/dist/legacy-skill-catalog.js +11 -0
- package/dist/legacy-skill-catalog.js.map +1 -1
- package/dist/prototype-browsers.d.ts +8 -2
- package/dist/prototype-browsers.d.ts.map +1 -1
- package/dist/prototype-browsers.js +8 -3
- package/dist/prototype-browsers.js.map +1 -1
- package/dist/prototype-process.js +1 -1
- package/dist/prototype-process.js.map +1 -1
- package/dist/run-journal-commands.d.ts.map +1 -1
- package/dist/run-journal-commands.js +6 -0
- package/dist/run-journal-commands.js.map +1 -1
- package/dist/scene/camera-model.d.ts +48 -0
- package/dist/scene/camera-model.d.ts.map +1 -0
- package/dist/scene/camera-model.js +89 -0
- package/dist/scene/camera-model.js.map +1 -0
- package/dist/scene/camera-solve.d.ts +58 -0
- package/dist/scene/camera-solve.d.ts.map +1 -0
- package/dist/scene/camera-solve.js +288 -0
- package/dist/scene/camera-solve.js.map +1 -0
- package/dist/scene/capture-plan.d.ts +28 -0
- package/dist/scene/capture-plan.d.ts.map +1 -0
- package/dist/scene/capture-plan.js +79 -0
- package/dist/scene/capture-plan.js.map +1 -0
- package/dist/scene/capture.d.ts +21 -0
- package/dist/scene/capture.d.ts.map +1 -0
- package/dist/scene/capture.js +118 -0
- package/dist/scene/capture.js.map +1 -0
- package/dist/scene/image-colors.d.ts +25 -0
- package/dist/scene/image-colors.d.ts.map +1 -0
- package/dist/scene/image-colors.js +110 -0
- package/dist/scene/image-colors.js.map +1 -0
- package/dist/scene/image-rectify.d.ts +25 -0
- package/dist/scene/image-rectify.d.ts.map +1 -0
- package/dist/scene/image-rectify.js +82 -0
- package/dist/scene/image-rectify.js.map +1 -0
- package/dist/scene/image-sheet.d.ts +19 -0
- package/dist/scene/image-sheet.d.ts.map +1 -0
- package/dist/scene/image-sheet.js +118 -0
- package/dist/scene/image-sheet.js.map +1 -0
- package/dist/scene/least-squares.d.ts +31 -0
- package/dist/scene/least-squares.d.ts.map +1 -0
- package/dist/scene/least-squares.js +173 -0
- package/dist/scene/least-squares.js.map +1 -0
- package/dist/scene/numbers.d.ts +17 -0
- package/dist/scene/numbers.d.ts.map +1 -0
- package/dist/scene/numbers.js +39 -0
- package/dist/scene/numbers.js.map +1 -0
- package/dist/scene/placement.d.ts +43 -0
- package/dist/scene/placement.d.ts.map +1 -0
- package/dist/scene/placement.js +107 -0
- package/dist/scene/placement.js.map +1 -0
- package/dist/scene/raster.d.ts +18 -0
- package/dist/scene/raster.d.ts.map +1 -0
- package/dist/scene/raster.js +31 -0
- package/dist/scene/raster.js.map +1 -0
- package/dist/scene/scene-kit.d.ts +20 -0
- package/dist/scene/scene-kit.d.ts.map +1 -0
- package/dist/scene/scene-kit.js +74 -0
- package/dist/scene/scene-kit.js.map +1 -0
- package/dist/scene/scene-verbs.d.ts +4 -0
- package/dist/scene/scene-verbs.d.ts.map +1 -0
- package/dist/scene/scene-verbs.js +5 -0
- package/dist/scene/scene-verbs.js.map +1 -0
- package/dist/scene/seeded-random.d.ts +20 -0
- package/dist/scene/seeded-random.d.ts.map +1 -0
- package/dist/scene/seeded-random.js +42 -0
- package/dist/scene/seeded-random.js.map +1 -0
- package/dist/scene/spec-expression.d.ts +25 -0
- package/dist/scene/spec-expression.d.ts.map +1 -0
- package/dist/scene/spec-expression.js +234 -0
- package/dist/scene/spec-expression.js.map +1 -0
- package/dist/scene/static-server.d.ts +13 -0
- package/dist/scene/static-server.d.ts.map +1 -0
- package/dist/scene/static-server.js +99 -0
- package/dist/scene/static-server.js.map +1 -0
- package/open-design.json +2 -2
- package/package.json +3 -1
- package/scene-kit/starter/camera.js +10 -0
- package/scene-kit/starter/gobo.js +60 -0
- package/scene-kit/starter/index.html +23 -0
- package/scene-kit/starter/lib.js +84 -0
- package/scene-kit/starter/main.js +78 -0
- package/scene-kit/starter/scene.js +33 -0
- package/scene-kit/vendor/LICENSE +21 -0
- package/scene-kit/vendor/addons/geometries/RoundedBoxGeometry.js +216 -0
- package/scene-kit/vendor/addons/renderers/CSS3DRenderer.js +454 -0
- package/scene-kit/vendor/three.core.js +60586 -0
- package/scene-kit/vendor/three.module.js +19719 -0
- package/skills/12ui-design/SKILL.md +7 -1
- package/skills/12ui-design/scene.md +172 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type ImageSize, type Vec3 } from './camera-model.js';
|
|
2
|
+
import { type CompiledExpression } from './spec-expression.js';
|
|
3
|
+
/**
|
|
4
|
+
* The least-squares camera (position, yaw, pitch, roll, vertical fov) that puts
|
|
5
|
+
* a spec's world landmarks on their source pixels. A port of the proven
|
|
6
|
+
* `solve_camera.py camera`: same parameterisation, bounds, penalty, multistart
|
|
7
|
+
* and diagnostics, and the same cam.json keys, so scene folders built with the
|
|
8
|
+
* Python helper keep working.
|
|
9
|
+
*/
|
|
10
|
+
export declare const CAMERA_KEYS: readonly ["cx", "cy", "cz", "yaw", "pitch", "roll", "fov"];
|
|
11
|
+
export declare class CameraSpecError extends Error {
|
|
12
|
+
constructor(message: string);
|
|
13
|
+
}
|
|
14
|
+
type Landmark = {
|
|
15
|
+
name: string;
|
|
16
|
+
px: [number, number];
|
|
17
|
+
world: [CompiledExpression, CompiledExpression, CompiledExpression];
|
|
18
|
+
};
|
|
19
|
+
export type CameraSpec = {
|
|
20
|
+
image: ImageSize;
|
|
21
|
+
free: ReadonlyArray<{
|
|
22
|
+
name: string;
|
|
23
|
+
low: number;
|
|
24
|
+
high: number;
|
|
25
|
+
}>;
|
|
26
|
+
fix: ReadonlyMap<string, number>;
|
|
27
|
+
landmarks: readonly Landmark[];
|
|
28
|
+
};
|
|
29
|
+
/** Validates and compiles a spec.json value; every refusal names the field. */
|
|
30
|
+
export declare const parseCameraSpec: (value: unknown, source?: string) => CameraSpec;
|
|
31
|
+
export type CameraSolveResult = {
|
|
32
|
+
image: ImageSize;
|
|
33
|
+
pos: Vec3;
|
|
34
|
+
yawDeg: number;
|
|
35
|
+
pitchDeg: number;
|
|
36
|
+
rollDeg: number;
|
|
37
|
+
vfovDeg: number;
|
|
38
|
+
free: Record<string, number>;
|
|
39
|
+
rmsPx: number;
|
|
40
|
+
residuals: Record<string, number>;
|
|
41
|
+
clip: {
|
|
42
|
+
near: number;
|
|
43
|
+
far: number;
|
|
44
|
+
};
|
|
45
|
+
'camera.js': string;
|
|
46
|
+
threejs: string;
|
|
47
|
+
fovSensitivity?: Array<{
|
|
48
|
+
fov: number;
|
|
49
|
+
rmsPx: number;
|
|
50
|
+
}>;
|
|
51
|
+
warnings?: string[];
|
|
52
|
+
};
|
|
53
|
+
export declare const solveCamera: (spec: CameraSpec, { starts, sensitivityStarts }?: {
|
|
54
|
+
starts?: number | undefined;
|
|
55
|
+
sensitivityStarts?: number | undefined;
|
|
56
|
+
}) => CameraSolveResult;
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=camera-solve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camera-solve.d.ts","sourceRoot":"","sources":["../../src/scene/camera-solve.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,SAAS,EACd,KAAK,IAAI,EACV,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEtF;;;;;;GAMG;AAEH,eAAO,MAAM,WAAW,4DAA6D,CAAC;AAGtF,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,KAAK,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;CAAE,CAAC;AAE5H,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,GAAG,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;CAChC,CAAC;AAIF,+EAA+E;AAC/E,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,EAAE,eAAe,KAAG,UAkDjE,CAAC;AA+CF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,EAAE,IAAI,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,MAAM,UAAU,EAAE;;;CAA8C,KAAG,iBAoK9F,CAAC"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { degrees, projectPoints, radians, rotationMatrix, } from './camera-model.js';
|
|
2
|
+
import { multistart } from './least-squares.js';
|
|
3
|
+
import { fixed, roundTo } from './numbers.js';
|
|
4
|
+
import { seededRandom } from './seeded-random.js';
|
|
5
|
+
import { compileSpecCoordinate } from './spec-expression.js';
|
|
6
|
+
/**
|
|
7
|
+
* The least-squares camera (position, yaw, pitch, roll, vertical fov) that puts
|
|
8
|
+
* a spec's world landmarks on their source pixels. A port of the proven
|
|
9
|
+
* `solve_camera.py camera`: same parameterisation, bounds, penalty, multistart
|
|
10
|
+
* and diagnostics, and the same cam.json keys, so scene folders built with the
|
|
11
|
+
* Python helper keep working.
|
|
12
|
+
*/
|
|
13
|
+
export const CAMERA_KEYS = ['cx', 'cy', 'cz', 'yaw', 'pitch', 'roll', 'fov'];
|
|
14
|
+
const ANGLE_KEYS = new Set(['yaw', 'pitch', 'roll']);
|
|
15
|
+
export class CameraSpecError extends Error {
|
|
16
|
+
constructor(message) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = 'CameraSpecError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const isFiniteNumber = (value) => typeof value === 'number' && Number.isFinite(value);
|
|
22
|
+
/** Validates and compiles a spec.json value; every refusal names the field. */
|
|
23
|
+
export const parseCameraSpec = (value, source = 'spec') => {
|
|
24
|
+
const fail = (message) => { throw new CameraSpecError(`${source}: ${message}`); };
|
|
25
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
26
|
+
fail('must be a JSON object');
|
|
27
|
+
const spec = value;
|
|
28
|
+
const image = spec.image;
|
|
29
|
+
if (!Array.isArray(image) || image.length !== 2 || !image.every((v) => isFiniteNumber(v) && v > 0)) {
|
|
30
|
+
fail('"image" must be [width, height] of the source image in pixels');
|
|
31
|
+
}
|
|
32
|
+
const freeValue = spec.free ?? {};
|
|
33
|
+
if (!freeValue || typeof freeValue !== 'object' || Array.isArray(freeValue))
|
|
34
|
+
fail('"free" must be an object of name: [low, high]');
|
|
35
|
+
const free = Object.entries(freeValue).map(([name, range]) => {
|
|
36
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/u.test(name))
|
|
37
|
+
fail(`free name "${name}" must be an identifier`);
|
|
38
|
+
if (CAMERA_KEYS.includes(name))
|
|
39
|
+
fail(`free name "${name}" collides with a camera key`);
|
|
40
|
+
if (!Array.isArray(range) || range.length !== 2 || !range.every(isFiniteNumber) || !(range[0] < range[1])) {
|
|
41
|
+
fail(`free "${name}" must be [low, high] with low < high`);
|
|
42
|
+
}
|
|
43
|
+
const [low, high] = range;
|
|
44
|
+
return { name, low, high };
|
|
45
|
+
});
|
|
46
|
+
const names = free.map((entry) => entry.name);
|
|
47
|
+
const fixValue = spec.fix ?? {};
|
|
48
|
+
if (!fixValue || typeof fixValue !== 'object' || Array.isArray(fixValue))
|
|
49
|
+
fail('"fix" must be an object of key: number');
|
|
50
|
+
const fix = new Map();
|
|
51
|
+
for (const [key, pinned] of Object.entries(fixValue)) {
|
|
52
|
+
if (!CAMERA_KEYS.includes(key) && !names.includes(key)) {
|
|
53
|
+
fail(`fix "${key}" is neither a camera key (${CAMERA_KEYS.join(' ')}) nor a free name`);
|
|
54
|
+
}
|
|
55
|
+
if (!isFiniteNumber(pinned))
|
|
56
|
+
fail(`fix "${key}" must be a number`);
|
|
57
|
+
fix.set(key, pinned);
|
|
58
|
+
}
|
|
59
|
+
// Almost every image is upright; a free roll trades against yaw near top-down and eats accuracy.
|
|
60
|
+
if (!fix.has('roll') && spec.solve_roll !== true)
|
|
61
|
+
fix.set('roll', 0);
|
|
62
|
+
const landmarksValue = spec.landmarks;
|
|
63
|
+
if (!Array.isArray(landmarksValue) || landmarksValue.length < 2)
|
|
64
|
+
fail('"landmarks" must list at least two landmarks');
|
|
65
|
+
const landmarks = landmarksValue.map((entry, index) => {
|
|
66
|
+
const record = entry;
|
|
67
|
+
const name = typeof record?.name === 'string' ? record.name : String(index);
|
|
68
|
+
const where = `${source} landmark "${name}"`;
|
|
69
|
+
const px = record?.px;
|
|
70
|
+
const world = record?.world;
|
|
71
|
+
if (!Array.isArray(px) || px.length !== 2 || !px.every(isFiniteNumber))
|
|
72
|
+
fail(`landmark "${name}": "px" must be [u, v]`);
|
|
73
|
+
if (!Array.isArray(world) || world.length !== 3)
|
|
74
|
+
fail(`landmark "${name}": "world" must be [x, y, z]`);
|
|
75
|
+
const coordinates = world.map((coordinate) => compileSpecCoordinate(coordinate, names, where));
|
|
76
|
+
return {
|
|
77
|
+
name,
|
|
78
|
+
px: [px[0], px[1]],
|
|
79
|
+
world: [coordinates[0], coordinates[1], coordinates[2]],
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
return { image: [image[0], image[1]], free, fix, landmarks };
|
|
83
|
+
};
|
|
84
|
+
const cameraOf = (p) => ({
|
|
85
|
+
pos: [p[0], p[1], p[2]],
|
|
86
|
+
yaw: p[3],
|
|
87
|
+
pitch: p[4],
|
|
88
|
+
roll: p[5],
|
|
89
|
+
fov: p[6],
|
|
90
|
+
});
|
|
91
|
+
/** Singular values of centred points: square roots of the covariance eigenvalues (Jacobi). */
|
|
92
|
+
const centredSingularValues = (points) => {
|
|
93
|
+
const mean = [0, 0, 0];
|
|
94
|
+
for (const point of points)
|
|
95
|
+
for (let axis = 0; axis < 3; axis += 1)
|
|
96
|
+
mean[axis] += point[axis] / points.length;
|
|
97
|
+
const a = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];
|
|
98
|
+
for (const point of points) {
|
|
99
|
+
const c = [point[0] - mean[0], point[1] - mean[1], point[2] - mean[2]];
|
|
100
|
+
for (let i = 0; i < 3; i += 1)
|
|
101
|
+
for (let j = 0; j < 3; j += 1)
|
|
102
|
+
a[i][j] += c[i] * c[j];
|
|
103
|
+
}
|
|
104
|
+
for (let sweep = 0; sweep < 64; sweep += 1) {
|
|
105
|
+
const off = a[0][1] ** 2 + a[0][2] ** 2 + a[1][2] ** 2;
|
|
106
|
+
if (off < 1e-30)
|
|
107
|
+
break;
|
|
108
|
+
for (let p = 0; p < 2; p += 1) {
|
|
109
|
+
for (let q = p + 1; q < 3; q += 1) {
|
|
110
|
+
if (Math.abs(a[p][q]) < 1e-300)
|
|
111
|
+
continue;
|
|
112
|
+
const theta = (a[q][q] - a[p][p]) / (2 * a[p][q]);
|
|
113
|
+
const t = Math.sign(theta || 1) / (Math.abs(theta) + Math.sqrt(theta * theta + 1));
|
|
114
|
+
const c = 1 / Math.sqrt(t * t + 1);
|
|
115
|
+
const s = t * c;
|
|
116
|
+
for (let k = 0; k < 3; k += 1) {
|
|
117
|
+
const akp = a[k][p], akq = a[k][q];
|
|
118
|
+
a[k][p] = c * akp - s * akq;
|
|
119
|
+
a[k][q] = s * akp + c * akq;
|
|
120
|
+
}
|
|
121
|
+
for (let k = 0; k < 3; k += 1) {
|
|
122
|
+
const apk = a[p][k], aqk = a[q][k];
|
|
123
|
+
a[p][k] = c * apk - s * aqk;
|
|
124
|
+
a[q][k] = s * apk + c * aqk;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return [a[0][0], a[1][1], a[2][2]].map((value) => Math.sqrt(Math.max(value, 0))).sort((x, y) => y - x);
|
|
130
|
+
};
|
|
131
|
+
export const solveCamera = (spec, { starts = 500, sensitivityStarts = 100 } = {}) => {
|
|
132
|
+
const [width, height] = spec.image;
|
|
133
|
+
const freeNames = spec.free.map((entry) => entry.name);
|
|
134
|
+
const names = [...CAMERA_KEYS, ...freeNames];
|
|
135
|
+
const low = [-1e4, -1e4, -1e4, -Math.PI, -1.5533, -0.5, 4, ...spec.free.map((entry) => entry.low)];
|
|
136
|
+
const high = [1e4, 1e4, 1e4, Math.PI, 1.5533, 0.5, 120, ...spec.free.map((entry) => entry.high)];
|
|
137
|
+
const pixels = spec.landmarks.map((landmark) => landmark.px);
|
|
138
|
+
const world = (freeValues) => spec.landmarks.map((landmark) => [
|
|
139
|
+
landmark.world[0](freeValues),
|
|
140
|
+
landmark.world[1](freeValues),
|
|
141
|
+
landmark.world[2](freeValues),
|
|
142
|
+
]);
|
|
143
|
+
const run = (fixMap, startCount) => {
|
|
144
|
+
const fixed = new Map();
|
|
145
|
+
for (const [key, value] of fixMap) {
|
|
146
|
+
fixed.set(names.indexOf(key), ANGLE_KEYS.has(key) ? radians(value) : value);
|
|
147
|
+
}
|
|
148
|
+
const variable = names.map((_, index) => index).filter((index) => !fixed.has(index));
|
|
149
|
+
const full = (v) => {
|
|
150
|
+
const p = new Float64Array(names.length);
|
|
151
|
+
for (const [index, value] of fixed)
|
|
152
|
+
p[index] = value;
|
|
153
|
+
variable.forEach((index, position) => { p[index] = v[position]; });
|
|
154
|
+
return p;
|
|
155
|
+
};
|
|
156
|
+
const residuals = (v) => {
|
|
157
|
+
const p = full(v);
|
|
158
|
+
const camera = cameraOf(p);
|
|
159
|
+
const projected = projectPoints(camera, world(p.subarray(7)), spec.image, rotationMatrix(p[3], p[4], p[5]));
|
|
160
|
+
const out = new Float64Array(projected.length * 2);
|
|
161
|
+
projected.forEach((projection, index) => {
|
|
162
|
+
// Penalty: a landmark behind the camera.
|
|
163
|
+
const penalty = Math.max(projection.depth + 0.01, 0) * 1e4;
|
|
164
|
+
out[2 * index] = projection.u - pixels[index][0] + penalty;
|
|
165
|
+
out[2 * index + 1] = projection.v - pixels[index][1] + penalty;
|
|
166
|
+
});
|
|
167
|
+
return out;
|
|
168
|
+
};
|
|
169
|
+
const random = seededRandom(1);
|
|
170
|
+
const mid = spec.free.map((entry) => (entry.low + entry.high) / 2);
|
|
171
|
+
const w0 = world(mid);
|
|
172
|
+
const centre = [0, 0, 0];
|
|
173
|
+
for (const point of w0)
|
|
174
|
+
for (let axis = 0; axis < 3; axis += 1)
|
|
175
|
+
centre[axis] += point[axis] / w0.length;
|
|
176
|
+
let spread = 0;
|
|
177
|
+
for (let axis = 0; axis < 3; axis += 1) {
|
|
178
|
+
const values = w0.map((point) => point[axis]);
|
|
179
|
+
spread = Math.max(spread, Math.max(...values) - Math.min(...values));
|
|
180
|
+
}
|
|
181
|
+
const radius = Math.max(spread, 1e-3);
|
|
182
|
+
const startsList = [];
|
|
183
|
+
for (let index = 0; index < startCount; index += 1) {
|
|
184
|
+
const distance = radius * random.uniform(1.2, 8);
|
|
185
|
+
const direction = [random.normal(), random.normal(), random.normal()];
|
|
186
|
+
direction[1] = Math.abs(direction[1]) * random.uniform(0.05, 1.0);
|
|
187
|
+
const length = Math.hypot(...direction);
|
|
188
|
+
const pos = [
|
|
189
|
+
centre[0] + (direction[0] / length) * distance,
|
|
190
|
+
centre[1] + (direction[1] / length) * distance,
|
|
191
|
+
centre[2] + (direction[2] / length) * distance,
|
|
192
|
+
];
|
|
193
|
+
const forward = [centre[0] - pos[0], centre[1] - pos[1], centre[2] - pos[2]];
|
|
194
|
+
const forwardLength = Math.hypot(...forward);
|
|
195
|
+
const fw = [forward[0] / forwardLength, forward[1] / forwardLength, forward[2] / forwardLength];
|
|
196
|
+
const p = new Float64Array(names.length);
|
|
197
|
+
p[0] = pos[0];
|
|
198
|
+
p[1] = pos[1];
|
|
199
|
+
p[2] = pos[2];
|
|
200
|
+
p[3] = Math.atan2(-fw[0], -fw[2]);
|
|
201
|
+
p[4] = Math.asin(Math.min(Math.max(fw[1], -1), 1));
|
|
202
|
+
p[6] = random.uniform(10, 70);
|
|
203
|
+
spec.free.forEach((entry, position) => { p[7 + position] = random.uniform(entry.low, entry.high); });
|
|
204
|
+
for (const [fixedIndex, value] of fixed)
|
|
205
|
+
p[fixedIndex] = value;
|
|
206
|
+
startsList.push(Float64Array.from(variable.map((variableIndex) => p[variableIndex])));
|
|
207
|
+
}
|
|
208
|
+
const best = multistart(residuals, startsList, variable.map((index) => low[index]), variable.map((index) => high[index]));
|
|
209
|
+
const p = full(best.parameters);
|
|
210
|
+
const camera = cameraOf(p);
|
|
211
|
+
const projected = projectPoints(camera, world(p.subarray(7)), spec.image);
|
|
212
|
+
const errors = projected.map((projection, index) => Math.hypot(projection.u - pixels[index][0], projection.v - pixels[index][1]));
|
|
213
|
+
const rms = Math.sqrt(errors.reduce((total, error) => total + error * error, 0) / errors.length);
|
|
214
|
+
return { parameters: p, camera, errors, rms };
|
|
215
|
+
};
|
|
216
|
+
const solved = run(spec.fix, starts);
|
|
217
|
+
const p = solved.parameters;
|
|
218
|
+
const warnings = [];
|
|
219
|
+
const worldPoints = world(p.subarray(7));
|
|
220
|
+
const singular = centredSingularValues(worldPoints);
|
|
221
|
+
const coplanar = singular[2] / Math.max(singular[0], 1e-9) < 0.03;
|
|
222
|
+
let sensitivity;
|
|
223
|
+
if (!spec.fix.has('fov')) {
|
|
224
|
+
sensitivity = [0.6, 0.8, 1.25, 1.6].map((factor) => {
|
|
225
|
+
const fov = Math.min(Math.max(p[6] * factor, 5), 110);
|
|
226
|
+
const pinned = new Map(spec.fix);
|
|
227
|
+
pinned.set('fov', fov);
|
|
228
|
+
return { fov: roundTo(fov, 1), rmsPx: roundTo(run(pinned, sensitivityStarts).rms, 2) };
|
|
229
|
+
});
|
|
230
|
+
const rmsValues = [...sensitivity.map((entry) => entry.rmsPx), solved.rms];
|
|
231
|
+
const spread = Math.max(...rmsValues) - Math.min(...rmsValues);
|
|
232
|
+
if (coplanar || spread < 2.0) {
|
|
233
|
+
warnings.push(`fov is weakly determined (rms only varies ${fixed(spread, 1)} px across fov`
|
|
234
|
+
+ ` ${fixed(sensitivity[0].fov, 1)}..${fixed(sensitivity.at(-1).fov, 1)} deg): `
|
|
235
|
+
+ (coplanar ? 'the landmarks are coplanar. ' : '')
|
|
236
|
+
+ 'Add a landmark off the plane (an object\'s top edge above its base), or pin it with "fix": {"fov": 35}.'
|
|
237
|
+
+ ' Pin a value from the source\'s look: 20-30 tele/product shot, 35-50 normal, 60+ wide/room.');
|
|
238
|
+
}
|
|
239
|
+
if (p[6] === 4 || p[6] === 120)
|
|
240
|
+
warnings.push('fov hit its bound.');
|
|
241
|
+
}
|
|
242
|
+
else if (coplanar) {
|
|
243
|
+
warnings.push('landmarks are coplanar: with fov pinned, distance and height trade against each other;'
|
|
244
|
+
+ ' the result is a consistent view but not unique.');
|
|
245
|
+
}
|
|
246
|
+
if (Math.abs(degrees(p[4])) > 75) {
|
|
247
|
+
warnings.push(`near top-down (pitch ${fixed(degrees(p[4]), 0)} deg): yaw and roll are coupled and pitch is near its bound.`
|
|
248
|
+
+ ' Roll is pinned to 0 (use "solve_roll": true to free it); if rms stays high, check the landmark readings'
|
|
249
|
+
+ ' before blaming the model.');
|
|
250
|
+
}
|
|
251
|
+
if (solved.rms > 4) {
|
|
252
|
+
warnings.push('rms > 4 px: a landmark is misread, the world model is wrong (a circle drawn as an ellipse, an object that is'
|
|
253
|
+
+ ' not flat), or the image is lens-distorted. Drop the worst landmark and re-solve rather than adding more.');
|
|
254
|
+
}
|
|
255
|
+
const centre = [0, 0, 0];
|
|
256
|
+
for (const point of worldPoints)
|
|
257
|
+
for (let axis = 0; axis < 3; axis += 1)
|
|
258
|
+
centre[axis] += point[axis] / worldPoints.length;
|
|
259
|
+
const distance = Math.hypot(p[0] - centre[0], p[1] - centre[1], p[2] - centre[2]);
|
|
260
|
+
const clip = { near: roundTo(distance / 10, 3), far: roundTo(distance * 4, 3) };
|
|
261
|
+
const residuals = {};
|
|
262
|
+
spec.landmarks.forEach((landmark, index) => { residuals[landmark.name] = roundTo(solved.errors[index], 1); });
|
|
263
|
+
const result = {
|
|
264
|
+
image: [width, height],
|
|
265
|
+
pos: [roundTo(p[0], 5), roundTo(p[1], 5), roundTo(p[2], 5)],
|
|
266
|
+
yawDeg: roundTo(degrees(p[3]), 4),
|
|
267
|
+
pitchDeg: roundTo(degrees(p[4]), 4),
|
|
268
|
+
rollDeg: roundTo(degrees(p[5]), 4),
|
|
269
|
+
vfovDeg: roundTo(p[6], 4),
|
|
270
|
+
free: Object.fromEntries(freeNames.map((name, index) => [name, roundTo(p[7 + index], 5)])),
|
|
271
|
+
rmsPx: roundTo(solved.rms, 2),
|
|
272
|
+
residuals,
|
|
273
|
+
clip,
|
|
274
|
+
'camera.js': `export const CAM = { pos: [${fixed(p[0], 5)}, ${fixed(p[1], 5)}, ${fixed(p[2], 5)}],`
|
|
275
|
+
+ ` yawDeg: ${fixed(degrees(p[3]), 4)}, pitchDeg: ${fixed(degrees(p[4]), 4)},`
|
|
276
|
+
+ ` rollDeg: ${fixed(degrees(p[5]), 4)}, vfov: ${fixed(p[6], 4)} };`
|
|
277
|
+
+ ` export const CLIP = { near: ${clip.near}, far: ${clip.far} };`,
|
|
278
|
+
threejs: `camera.position.set(${fixed(p[0], 5)},${fixed(p[1], 5)},${fixed(p[2], 5)});`
|
|
279
|
+
+ ` camera.rotation.order='YXZ'; camera.rotation.set(${fixed(p[4], 6)},${fixed(p[3], 6)},${fixed(p[5], 6)});`
|
|
280
|
+
+ ` camera.fov=${fixed(p[6], 4)};`,
|
|
281
|
+
};
|
|
282
|
+
if (sensitivity)
|
|
283
|
+
result.fovSensitivity = sensitivity;
|
|
284
|
+
if (warnings.length)
|
|
285
|
+
result.warnings = warnings;
|
|
286
|
+
return result;
|
|
287
|
+
};
|
|
288
|
+
//# sourceMappingURL=camera-solve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camera-solve.js","sourceRoot":"","sources":["../../src/scene/camera-solve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a request stays on this machine. Loopback http(s)/ws(s) and local
|
|
3
|
+
* schemes pass; every other host is a remote request, which capture blocks
|
|
4
|
+
* and counts.
|
|
5
|
+
*/
|
|
6
|
+
export declare const isLocalRequestUrl: (url: string) => boolean;
|
|
7
|
+
/** Only a page served on this machine can be captured (`12ui scene serve`). */
|
|
8
|
+
export declare const isLoopbackPageUrl: (url: string) => boolean;
|
|
9
|
+
export type CaptureView = {
|
|
10
|
+
name: string;
|
|
11
|
+
azimuth: number;
|
|
12
|
+
elevation: number;
|
|
13
|
+
actions: Array<{
|
|
14
|
+
name: string;
|
|
15
|
+
t: number;
|
|
16
|
+
}>;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* One view: `name=azimuth:elevation[:action=t,action=t]`, degrees about the
|
|
20
|
+
* scene pivot and each action's t in 0..1, e.g. `half=0:0:lid=0.5`.
|
|
21
|
+
*/
|
|
22
|
+
export declare const parseCaptureView: (text: string) => CaptureView;
|
|
23
|
+
/** The default set: landing, each orbit angle, and every action at t = 1. */
|
|
24
|
+
export declare const defaultCaptureViews: (orbits: readonly number[], actions: readonly string[]) => CaptureView[];
|
|
25
|
+
export declare const parseOrbits: (text: string) => number[];
|
|
26
|
+
/** Console noise from software GL that says nothing about the scene. */
|
|
27
|
+
export declare const isCaptureNoise: (line: string) => boolean;
|
|
28
|
+
//# sourceMappingURL=capture-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-plan.d.ts","sourceRoot":"","sources":["../../src/scene/capture-plan.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,KAAG,OAW/C,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,KAAG,OAO/C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,WAqB/C,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,GAAI,QAAQ,SAAS,MAAM,EAAE,EAAE,SAAS,SAAS,MAAM,EAAE,KAAG,WAAW,EAItG,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,MAAM,EAI/C,CAAC;AAEH,wEAAwE;AACxE,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,OAAmD,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { SceneArgumentError } from './numbers.js';
|
|
2
|
+
/**
|
|
3
|
+
* The pure half of `12ui scene capture`: which URLs a scene may load, and which
|
|
4
|
+
* views to shoot. Kept apart from the browser so both are testable without one.
|
|
5
|
+
*/
|
|
6
|
+
const LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost', '[::1]', '::1']);
|
|
7
|
+
/** Schemes that never leave the machine: the page's own bytes, not a request. */
|
|
8
|
+
const LOCAL_SCHEMES = new Set(['data:', 'blob:', 'about:', 'file:']);
|
|
9
|
+
/**
|
|
10
|
+
* Whether a request stays on this machine. Loopback http(s)/ws(s) and local
|
|
11
|
+
* schemes pass; every other host is a remote request, which capture blocks
|
|
12
|
+
* and counts.
|
|
13
|
+
*/
|
|
14
|
+
export const isLocalRequestUrl = (url) => {
|
|
15
|
+
let parsed;
|
|
16
|
+
try {
|
|
17
|
+
parsed = new URL(url);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
if (LOCAL_SCHEMES.has(parsed.protocol))
|
|
23
|
+
return true;
|
|
24
|
+
if (!['http:', 'https:', 'ws:', 'wss:'].includes(parsed.protocol))
|
|
25
|
+
return false;
|
|
26
|
+
const host = parsed.hostname.toLowerCase();
|
|
27
|
+
return LOOPBACK_HOSTS.has(host) || /^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/u.test(host) || host.endsWith('.localhost');
|
|
28
|
+
};
|
|
29
|
+
/** Only a page served on this machine can be captured (`12ui scene serve`). */
|
|
30
|
+
export const isLoopbackPageUrl = (url) => {
|
|
31
|
+
try {
|
|
32
|
+
const parsed = new URL(url);
|
|
33
|
+
return ['http:', 'https:'].includes(parsed.protocol) && isLocalRequestUrl(url);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* One view: `name=azimuth:elevation[:action=t,action=t]`, degrees about the
|
|
41
|
+
* scene pivot and each action's t in 0..1, e.g. `half=0:0:lid=0.5`.
|
|
42
|
+
*/
|
|
43
|
+
export const parseCaptureView = (text) => {
|
|
44
|
+
const equals = text.indexOf('=');
|
|
45
|
+
const name = equals > 0 ? text.slice(0, equals) : '';
|
|
46
|
+
if (!/^[A-Za-z0-9._+-]+$/u.test(name)) {
|
|
47
|
+
throw new SceneArgumentError(`view "${text}" must be name=azimuth:elevation[:action=t,...] with a file-safe name`);
|
|
48
|
+
}
|
|
49
|
+
const [az = '0', el = '0', ...rest] = text.slice(equals + 1).split(':');
|
|
50
|
+
const azimuth = Number(az || '0');
|
|
51
|
+
const elevation = Number(el || '0');
|
|
52
|
+
if (!Number.isFinite(azimuth) || !Number.isFinite(elevation)) {
|
|
53
|
+
throw new SceneArgumentError(`view "${text}": azimuth and elevation must be numbers of degrees`);
|
|
54
|
+
}
|
|
55
|
+
const actions = rest.join(':').split(',').filter(Boolean).map((pair) => {
|
|
56
|
+
const [action, t] = pair.split('=');
|
|
57
|
+
const value = Number(t);
|
|
58
|
+
if (!action || t === undefined || !Number.isFinite(value)) {
|
|
59
|
+
throw new SceneArgumentError(`view "${text}": each action must be name=t with t in 0..1`);
|
|
60
|
+
}
|
|
61
|
+
return { name: action, t: value };
|
|
62
|
+
});
|
|
63
|
+
return { name, azimuth, elevation, actions };
|
|
64
|
+
};
|
|
65
|
+
/** The default set: landing, each orbit angle, and every action at t = 1. */
|
|
66
|
+
export const defaultCaptureViews = (orbits, actions) => [
|
|
67
|
+
{ name: 'landing', azimuth: 0, elevation: 0, actions: [] },
|
|
68
|
+
...orbits.map((azimuth) => ({ name: `az${azimuth > 0 ? '+' : ''}${azimuth}`, azimuth, elevation: 0, actions: [] })),
|
|
69
|
+
...actions.map((action) => ({ name: `act-${action}`, azimuth: 0, elevation: 0, actions: [{ name: action, t: 1 }] })),
|
|
70
|
+
];
|
|
71
|
+
export const parseOrbits = (text) => text.split(',').filter(Boolean).map((value) => {
|
|
72
|
+
const angle = Number(value);
|
|
73
|
+
if (!Number.isFinite(angle))
|
|
74
|
+
throw new SceneArgumentError(`--orbit must be comma-separated degrees, got "${text}"`);
|
|
75
|
+
return angle;
|
|
76
|
+
});
|
|
77
|
+
/** Console noise from software GL that says nothing about the scene. */
|
|
78
|
+
export const isCaptureNoise = (line) => /GPU stall|Clock|ReadPixels/u.test(line);
|
|
79
|
+
//# sourceMappingURL=capture-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-plan.js","sourceRoot":"","sources":["../../src/scene/capture-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type CaptureView } from './capture-plan.js';
|
|
2
|
+
export type CaptureOptions = {
|
|
3
|
+
url: string;
|
|
4
|
+
outDir: string;
|
|
5
|
+
size: [number, number];
|
|
6
|
+
orbits: readonly number[];
|
|
7
|
+
hide: readonly string[];
|
|
8
|
+
evalScript?: string;
|
|
9
|
+
views: readonly CaptureView[];
|
|
10
|
+
};
|
|
11
|
+
export type CaptureReport = {
|
|
12
|
+
written: string[];
|
|
13
|
+
blocked: string[];
|
|
14
|
+
fonts: {
|
|
15
|
+
loaded: number;
|
|
16
|
+
failed: string[];
|
|
17
|
+
};
|
|
18
|
+
console: string[];
|
|
19
|
+
};
|
|
20
|
+
export declare const captureScene: (options: CaptureOptions, log: (line: string) => void) => Promise<CaptureReport>;
|
|
21
|
+
//# sourceMappingURL=capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/scene/capture.ts"],"names":[],"mappings":"AAQA,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAsB3B,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5C,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAcF,eAAO,MAAM,YAAY,GACvB,SAAS,cAAc,EACvB,KAAK,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAC1B,OAAO,CAAC,aAAa,CAwFvB,CAAC"}
|