@aura3d/cli 4.2.0 → 4.3.1
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/dist/cli-help.d.ts.map +1 -1
- package/dist/cli-help.js +4 -2
- package/dist/cli-help.js.map +1 -1
- package/dist/cli.js +85 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/assets/index.js +2 -2
- package/dist/commands/assets/index.js.map +1 -1
- package/dist/commands/meshyLedger.d.ts +125 -14
- package/dist/commands/meshyLedger.d.ts.map +1 -1
- package/dist/commands/meshyLedger.js +262 -35
- package/dist/commands/meshyLedger.js.map +1 -1
- package/dist/commands/prd13/run.js +19 -16
- package/dist/commands/prd13/run.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/skin/analysis.d.ts +137 -0
- package/dist/skin/analysis.d.ts.map +1 -0
- package/dist/skin/analysis.js +382 -0
- package/dist/skin/analysis.js.map +1 -0
- package/dist/skin/command.d.ts +75 -0
- package/dist/skin/command.d.ts.map +1 -0
- package/dist/skin/command.js +208 -0
- package/dist/skin/command.js.map +1 -0
- package/dist/skin/glbEdit.d.ts +14 -0
- package/dist/skin/glbEdit.d.ts.map +1 -0
- package/dist/skin/glbEdit.js +152 -0
- package/dist/skin/glbEdit.js.map +1 -0
- package/dist/skin/gltf.d.ts +159 -0
- package/dist/skin/gltf.d.ts.map +1 -0
- package/dist/skin/gltf.js +379 -0
- package/dist/skin/gltf.js.map +1 -0
- package/dist/skin/rebuildLimbs.d.ts +31 -0
- package/dist/skin/rebuildLimbs.d.ts.map +1 -0
- package/dist/skin/rebuildLimbs.js +326 -0
- package/dist/skin/rebuildLimbs.js.map +1 -0
- package/dist/skin/refitSkeleton.d.ts +23 -0
- package/dist/skin/refitSkeleton.d.ts.map +1 -0
- package/dist/skin/refitSkeleton.js +288 -0
- package/dist/skin/refitSkeleton.js.map +1 -0
- package/dist/skin/repair.d.ts +45 -0
- package/dist/skin/repair.d.ts.map +1 -0
- package/dist/skin/repair.js +192 -0
- package/dist/skin/repair.js.map +1 -0
- package/package.json +5 -5
- package/skills/aura3d-art-direction/SKILL.md +1 -1
- package/skills/aura3d-assets/SKILL.md +3 -2
- package/skills/aura3d-browser-game/SKILL.md +1 -0
- package/skills/aura3d-character-animation/SKILL.md +3 -1
- package/skills/aura3d-materials-environments/references/custom-shader-chunks.md +8 -2
- package/skills/llms.txt +2 -2
- package/skills/meshy-cli/SKILL.md +11 -10
- package/skills/meshy-cli/references/asset-tooling.md +16 -5
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `assets repair-skin --refit-skeleton`: moves the skeleton onto the mesh instead of the mesh onto the skeleton.
|
|
3
|
+
*
|
|
4
|
+
* An auto-rigged character whose mesh was modelled in one pose (a guard holding a rifle, a hound mid-stride) but bound to a template
|
|
5
|
+
* skeleton rotates every limb about a joint that is 10 to 30 cm off the limb, and the bridging triangles stretch into sails. This finds
|
|
6
|
+
* each joint where the mesh actually bends (the seam between the two segments the joint separates), re-orients the bones along the
|
|
7
|
+
* mesh's limbs, recomputes the inverse bind matrices so the mesh does not move at rest, and re-targets every clip by world-space
|
|
8
|
+
* delta so the shipped animations keep their motion about the corrected joints. The authored pose of the mesh becomes the rest pose.
|
|
9
|
+
*/
|
|
10
|
+
import { findHumanoidLegs } from "./analysis.js";
|
|
11
|
+
import { GlbEditor } from "./glbEdit.js";
|
|
12
|
+
import { buildHierarchy, clipDuration, forward, loadSkins, localPose, mat4Mul, qalign, qconj, qmul, qnorm, qrot, readAccessor, restTrs } from "./gltf.js";
|
|
13
|
+
export class RefitUnsupported extends Error {
|
|
14
|
+
}
|
|
15
|
+
const sub = (a, b) => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
|
|
16
|
+
const add = (a, b) => [a[0] + b[0], a[1] + b[1], a[2] + b[2]];
|
|
17
|
+
const len = (a) => Math.hypot(a[0], a[1], a[2]);
|
|
18
|
+
const ID = [0, 0, 0, 1];
|
|
19
|
+
function worldRotations(trs, parent) {
|
|
20
|
+
const out = new Array(trs.length).fill(undefined);
|
|
21
|
+
const visit = (i) => {
|
|
22
|
+
const known = out[i];
|
|
23
|
+
if (known)
|
|
24
|
+
return known;
|
|
25
|
+
const p = parent[i] ?? -1;
|
|
26
|
+
const local = qnorm((trs[i]?.r ?? ID));
|
|
27
|
+
const q = p < 0 ? local : qnorm(qmul(visit(p), local));
|
|
28
|
+
out[i] = q;
|
|
29
|
+
return q;
|
|
30
|
+
};
|
|
31
|
+
for (let i = 0; i < trs.length; i += 1)
|
|
32
|
+
visit(i);
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
/** Inverse of a rigid (rotation + translation) column-major matrix. */
|
|
36
|
+
function rigidInverse(q, t) {
|
|
37
|
+
const rt = qconj(q);
|
|
38
|
+
const x = qrot(rt, [1, 0, 0]), y = qrot(rt, [0, 1, 0]), z = qrot(rt, [0, 0, 1]);
|
|
39
|
+
const o = qrot(rt, [-t[0], -t[1], -t[2]]);
|
|
40
|
+
return [x[0], x[1], x[2], 0, y[0], y[1], y[2], 0, z[0], z[1], z[2], 0, o[0], o[1], o[2], 1];
|
|
41
|
+
}
|
|
42
|
+
export function refitSkeleton(glb, options = {}) {
|
|
43
|
+
const hierarchy = buildHierarchy(glb);
|
|
44
|
+
const skins = loadSkins(glb, hierarchy);
|
|
45
|
+
const skin = skins[0];
|
|
46
|
+
if (!skin)
|
|
47
|
+
throw new RefitUnsupported("No skinned mesh to refit.");
|
|
48
|
+
const skinJson = glb.json.skins?.[skin.index];
|
|
49
|
+
if (!skinJson)
|
|
50
|
+
throw new RefitUnsupported("Skin definition missing.");
|
|
51
|
+
const nodes = hierarchy.nodes;
|
|
52
|
+
for (const node of nodes) {
|
|
53
|
+
const s = restTrs(node).s;
|
|
54
|
+
if (Math.abs((s[0] ?? 1) - 1) > 1e-3 || Math.abs((s[1] ?? 1) - 1) > 1e-3 || Math.abs((s[2] ?? 1) - 1) > 1e-3)
|
|
55
|
+
throw new RefitUnsupported("Scaled nodes are not supported by --refit-skeleton: apply the scale to the skeleton first.");
|
|
56
|
+
}
|
|
57
|
+
const jointNodes = skin.joints;
|
|
58
|
+
const jointOf = new Map(jointNodes.map((n, k) => [n, k]));
|
|
59
|
+
const restLocal = nodes.map(restTrs);
|
|
60
|
+
const restWorld = forward(restLocal, hierarchy);
|
|
61
|
+
const restRot = worldRotations(restLocal, hierarchy.parent);
|
|
62
|
+
const P = (n) => restWorld.pos[n];
|
|
63
|
+
const minSeam = options.minSeamEdges ?? 6;
|
|
64
|
+
const fps = options.fps ?? 30;
|
|
65
|
+
// dominant joint per vertex, seams between a joint and its skeleton parent
|
|
66
|
+
const seamSum = new Map();
|
|
67
|
+
const seamCount = new Map();
|
|
68
|
+
let height = 0;
|
|
69
|
+
{
|
|
70
|
+
let lo = Infinity, hi = -Infinity;
|
|
71
|
+
for (const prim of skin.primitives)
|
|
72
|
+
for (const p of prim.pos) {
|
|
73
|
+
lo = Math.min(lo, p[1]);
|
|
74
|
+
hi = Math.max(hi, p[1]);
|
|
75
|
+
}
|
|
76
|
+
height = hi > lo ? hi - lo : 1;
|
|
77
|
+
}
|
|
78
|
+
for (const prim of skin.primitives) {
|
|
79
|
+
const dom = prim.pos.map((_, v) => {
|
|
80
|
+
let best = -1, bw = -1;
|
|
81
|
+
const w = prim.weights[v] ?? [], j = prim.joints[v] ?? [];
|
|
82
|
+
for (let k = 0; k < 4; k += 1)
|
|
83
|
+
if ((w[k] ?? 0) > bw) {
|
|
84
|
+
bw = w[k] ?? 0;
|
|
85
|
+
best = j[k] ?? 0;
|
|
86
|
+
}
|
|
87
|
+
return jointNodes[best] ?? -1;
|
|
88
|
+
});
|
|
89
|
+
for (let t = 0; t + 2 < prim.indices.length; t += 3) {
|
|
90
|
+
for (let e = 0; e < 3; e += 1) {
|
|
91
|
+
const a = prim.indices[t + e], b = prim.indices[t + ((e + 1) % 3)];
|
|
92
|
+
const da = dom[a], db = dom[b];
|
|
93
|
+
if (da === db || da < 0 || db < 0)
|
|
94
|
+
continue;
|
|
95
|
+
const child = hierarchy.parent[db] === da ? db : hierarchy.parent[da] === db ? da : -1;
|
|
96
|
+
if (child < 0)
|
|
97
|
+
continue;
|
|
98
|
+
const pa = prim.pos[a], pb = prim.pos[b];
|
|
99
|
+
const mid = [(pa[0] + pb[0]) / 2, (pa[1] + pb[1]) / 2, (pa[2] + pb[2]) / 2];
|
|
100
|
+
seamSum.set(child, add(seamSum.get(child) ?? [0, 0, 0], mid));
|
|
101
|
+
seamCount.set(child, (seamCount.get(child) ?? 0) + 1);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// new joint positions, parents first
|
|
106
|
+
const N = new Map();
|
|
107
|
+
const moved = [];
|
|
108
|
+
const fallback = [];
|
|
109
|
+
const order = [...jointNodes].sort((a, b) => depth(a) - depth(b));
|
|
110
|
+
function depth(n) { let d = 0; let p = hierarchy.parent[n] ?? -1; while (p >= 0) {
|
|
111
|
+
d += 1;
|
|
112
|
+
p = hierarchy.parent[p] ?? -1;
|
|
113
|
+
} return d; }
|
|
114
|
+
for (const n of order) {
|
|
115
|
+
const count = seamCount.get(n) ?? 0;
|
|
116
|
+
const parentNode = hierarchy.parent[n] ?? -1;
|
|
117
|
+
const parentShift = parentNode >= 0 && N.has(parentNode) ? sub(N.get(parentNode), P(parentNode)) : [0, 0, 0];
|
|
118
|
+
let at = null;
|
|
119
|
+
if (count >= minSeam) {
|
|
120
|
+
const s = seamSum.get(n);
|
|
121
|
+
const c = [s[0] / count, s[1] / count, s[2] / count];
|
|
122
|
+
if (len(sub(c, P(n))) <= 0.4 * height)
|
|
123
|
+
at = c;
|
|
124
|
+
}
|
|
125
|
+
if (at)
|
|
126
|
+
moved.push({ joint: hierarchy.names[n] ?? `node${n}`, offset: Number(len(sub(at, P(n))).toFixed(3)), seamEdges: count });
|
|
127
|
+
else {
|
|
128
|
+
at = add(P(n), parentShift);
|
|
129
|
+
fallback.push(hierarchy.names[n] ?? `node${n}`);
|
|
130
|
+
}
|
|
131
|
+
N.set(n, at);
|
|
132
|
+
}
|
|
133
|
+
// pelvis pivots between the two hip joints
|
|
134
|
+
const hipsNode = jointNodes.find((n) => /^(mixamorig:?)?hips$/i.test(hierarchy.names[n] ?? ""));
|
|
135
|
+
const legUps = jointNodes.filter((n) => /upper(leg)|upleg|thigh/i.test(hierarchy.names[n] ?? ""));
|
|
136
|
+
if (hipsNode !== undefined && legUps.length === 2) {
|
|
137
|
+
const a = N.get(legUps[0]), b = N.get(legUps[1]);
|
|
138
|
+
const mid = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2, (a[2] + b[2]) / 2];
|
|
139
|
+
if (len(sub(mid, P(hipsNode))) <= 0.4 * height)
|
|
140
|
+
N.set(hipsNode, mid);
|
|
141
|
+
}
|
|
142
|
+
// a knee never bends forward: keep it a little in front of the hip-ankle line (model forward is +Z)
|
|
143
|
+
for (const leg of findHumanoidLegs(hierarchy) ?? []) {
|
|
144
|
+
const hip = N.get(leg.up), kn = N.get(leg.knee), an = N.get(leg.foot);
|
|
145
|
+
if (!hip || !kn || !an)
|
|
146
|
+
continue;
|
|
147
|
+
const line = sub(an, hip);
|
|
148
|
+
const l2 = line[0] * line[0] + line[1] * line[1] + line[2] * line[2];
|
|
149
|
+
if (l2 < 1e-9)
|
|
150
|
+
continue;
|
|
151
|
+
const t = Math.max(0, Math.min(1, ((kn[0] - hip[0]) * line[0] + (kn[1] - hip[1]) * line[1] + (kn[2] - hip[2]) * line[2]) / l2));
|
|
152
|
+
const proj = [hip[0] + line[0] * t, hip[1] + line[1] * t, hip[2] + line[2] * t];
|
|
153
|
+
const minForward = 0.03 * Math.sqrt(l2);
|
|
154
|
+
if (kn[2] - proj[2] < minForward)
|
|
155
|
+
N.set(leg.knee, [kn[0], kn[1], proj[2] + minForward]);
|
|
156
|
+
}
|
|
157
|
+
// new world rotations: align each bone with the direction to its main child
|
|
158
|
+
const childrenOf = (n) => (nodes[n]?.children ?? []).filter((c) => jointOf.has(c));
|
|
159
|
+
const mainChild = (n) => {
|
|
160
|
+
const kids = childrenOf(n);
|
|
161
|
+
if (kids.length === 0)
|
|
162
|
+
return undefined;
|
|
163
|
+
if (kids.length === 1)
|
|
164
|
+
return kids[0];
|
|
165
|
+
const torso = kids.find((c) => /spine|chest|head|neck/i.test(hierarchy.names[c] ?? ""));
|
|
166
|
+
if (torso !== undefined)
|
|
167
|
+
return torso;
|
|
168
|
+
return [...kids].sort((a, b) => len(sub(P(b), P(n))) - len(sub(P(a), P(n))))[0];
|
|
169
|
+
};
|
|
170
|
+
const delta = new Map();
|
|
171
|
+
for (const n of order) {
|
|
172
|
+
const c = mainChild(n);
|
|
173
|
+
const parentNode = hierarchy.parent[n] ?? -1;
|
|
174
|
+
if (c === undefined) {
|
|
175
|
+
delta.set(n, delta.get(parentNode) ?? ID);
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const d0 = sub(P(c), P(n)), d1 = sub(N.get(c), N.get(n));
|
|
179
|
+
delta.set(n, len(d0) > 1e-6 && len(d1) > 1e-6 ? qalign([d0[0] / len(d0), d0[1] / len(d0), d0[2] / len(d0)], [d1[0] / len(d1), d1[1] / len(d1), d1[2] / len(d1)]) : ID);
|
|
180
|
+
}
|
|
181
|
+
const newRot = new Map();
|
|
182
|
+
for (const n of order)
|
|
183
|
+
newRot.set(n, qnorm(qmul(delta.get(n), restRot[n])));
|
|
184
|
+
// rewrite node TRS (parents first)
|
|
185
|
+
const editor = new GlbEditor(glb);
|
|
186
|
+
const worldPosNew = new Map();
|
|
187
|
+
const worldRotNew = new Map();
|
|
188
|
+
const nodePosNew = (n) => (N.get(n) ?? worldPosNew.get(n) ?? P(n));
|
|
189
|
+
const nodeRotNew = (n) => (newRot.get(n) ?? worldRotNew.get(n) ?? restRot[n]);
|
|
190
|
+
for (const n of order) {
|
|
191
|
+
const parentNode = hierarchy.parent[n] ?? -1;
|
|
192
|
+
const pRot = parentNode >= 0 ? nodeRotNew(parentNode) : ID;
|
|
193
|
+
const pPos = parentNode >= 0 ? nodePosNew(parentNode) : [0, 0, 0];
|
|
194
|
+
const local = editor.json.nodes[n];
|
|
195
|
+
delete local.matrix;
|
|
196
|
+
local.rotation = qnorm(qmul(qconj(pRot), newRot.get(n)));
|
|
197
|
+
local.translation = qrot(qconj(pRot), sub(N.get(n), pPos));
|
|
198
|
+
if (!local.scale)
|
|
199
|
+
local.scale = [1, 1, 1];
|
|
200
|
+
}
|
|
201
|
+
// inverse bind matrices: the rest joint matrix must stay what it was
|
|
202
|
+
const ibmOld = skin.ibm;
|
|
203
|
+
const ibm = [];
|
|
204
|
+
jointNodes.forEach((n, k) => {
|
|
205
|
+
const oldWorld = restWorld.world[n];
|
|
206
|
+
const inv = rigidInverse(newRot.get(n), N.get(n));
|
|
207
|
+
const m = mat4Mul(inv, mat4Mul(oldWorld, ibmOld[k]));
|
|
208
|
+
ibm.push(...m);
|
|
209
|
+
});
|
|
210
|
+
const ibmAccessor = editor.addAccessor(ibm, 5126, "MAT4", undefined);
|
|
211
|
+
(editor.json.skins?.[skin.index]).inverseBindMatrices = ibmAccessor;
|
|
212
|
+
void skinJson;
|
|
213
|
+
// re-target every clip by world-space delta, baked at a fixed rate
|
|
214
|
+
const animations = glb.json.animations ?? [];
|
|
215
|
+
const outAnims = [];
|
|
216
|
+
for (const anim of animations) {
|
|
217
|
+
const dur = Math.max(clipDuration(glb, anim), 1 / fps);
|
|
218
|
+
const frames = Math.max(2, Math.round(dur * fps) + 1);
|
|
219
|
+
const times = [];
|
|
220
|
+
for (let f = 0; f < frames; f += 1)
|
|
221
|
+
times.push(Math.min(dur, f / fps));
|
|
222
|
+
const translated = new Set();
|
|
223
|
+
for (const ch of anim.channels)
|
|
224
|
+
if (ch.target.path === "translation" && ch.target.node !== undefined && jointOf.has(ch.target.node))
|
|
225
|
+
translated.add(ch.target.node);
|
|
226
|
+
const rot = new Map(), pos = new Map();
|
|
227
|
+
for (const n of jointNodes) {
|
|
228
|
+
rot.set(n, []);
|
|
229
|
+
if (translated.has(n))
|
|
230
|
+
pos.set(n, []);
|
|
231
|
+
}
|
|
232
|
+
for (const t of times) {
|
|
233
|
+
const trs = localPose(glb, anim, t, hierarchy);
|
|
234
|
+
const world = forward(trs, hierarchy);
|
|
235
|
+
const oldRot = worldRotations(trs, hierarchy.parent);
|
|
236
|
+
const newW = new Map();
|
|
237
|
+
const newP = new Map();
|
|
238
|
+
for (const n of order) {
|
|
239
|
+
const d = qmul(oldRot[n], qconj(restRot[n]));
|
|
240
|
+
const wq = qnorm(qmul(d, newRot.get(n)));
|
|
241
|
+
newW.set(n, wq);
|
|
242
|
+
const parentNode = hierarchy.parent[n] ?? -1;
|
|
243
|
+
const parentW = parentNode >= 0 ? (newW.get(parentNode) ?? oldRot[parentNode]) : ID;
|
|
244
|
+
const lq = qnorm(qmul(qconj(parentW), wq));
|
|
245
|
+
rot.get(n).push(lq[0], lq[1], lq[2], lq[3]);
|
|
246
|
+
const delta = sub(world.pos[n], P(n));
|
|
247
|
+
const wp = add(N.get(n), delta);
|
|
248
|
+
newP.set(n, wp);
|
|
249
|
+
if (translated.has(n)) {
|
|
250
|
+
const parentPos = parentNode >= 0 ? (newP.get(parentNode) ?? world.pos[parentNode]) : [0, 0, 0];
|
|
251
|
+
const lt = qrot(qconj(parentW), sub(wp, parentPos));
|
|
252
|
+
pos.get(n).push(lt[0], lt[1], lt[2]);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
const samplers = [];
|
|
257
|
+
const channels = [];
|
|
258
|
+
// keep channels that do not drive a joint
|
|
259
|
+
for (const ch of anim.channels) {
|
|
260
|
+
if (ch.target.node !== undefined && jointOf.has(ch.target.node) && (ch.target.path === "rotation" || ch.target.path === "translation"))
|
|
261
|
+
continue;
|
|
262
|
+
const old = anim.samplers[ch.sampler];
|
|
263
|
+
if (!old)
|
|
264
|
+
continue;
|
|
265
|
+
samplers.push({ input: old.input, output: old.output, ...(old.interpolation ? { interpolation: old.interpolation } : {}) });
|
|
266
|
+
channels.push({ sampler: samplers.length - 1, target: { ...ch.target } });
|
|
267
|
+
}
|
|
268
|
+
const timeAccessor = editor.addAccessor(times, 5126, "SCALAR", undefined);
|
|
269
|
+
const acc = editor.json.accessors[timeAccessor];
|
|
270
|
+
acc.min = [times[0]];
|
|
271
|
+
acc.max = [times[times.length - 1]];
|
|
272
|
+
for (const n of jointNodes) {
|
|
273
|
+
const r = editor.addAccessor(rot.get(n), 5126, "VEC4", undefined);
|
|
274
|
+
samplers.push({ input: timeAccessor, output: r, interpolation: "LINEAR" });
|
|
275
|
+
channels.push({ sampler: samplers.length - 1, target: { node: n, path: "rotation" } });
|
|
276
|
+
if (translated.has(n)) {
|
|
277
|
+
const p = editor.addAccessor(pos.get(n), 5126, "VEC3", undefined);
|
|
278
|
+
samplers.push({ input: timeAccessor, output: p, interpolation: "LINEAR" });
|
|
279
|
+
channels.push({ sampler: samplers.length - 1, target: { node: n, path: "translation" } });
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
outAnims.push({ ...(anim.name ? { name: anim.name } : {}), samplers, channels });
|
|
283
|
+
}
|
|
284
|
+
editor.json.animations = outAnims;
|
|
285
|
+
void readAccessor;
|
|
286
|
+
return { glb: editor.finish(), report: { moved, fallback, clips: outAnims.length } };
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=refitSkeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refitSkeleton.js","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/skin/refitSkeleton.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `assets repair-skin`: the generic, safe repairs for a skinned GLB. Every step is opt-in so a re-run changes only what you asked for:
|
|
3
|
+
* `normalize` (renormalise weights, drop non-finite and out-of-range influences, keep the strongest K), `pruneDistant` (drop influences
|
|
4
|
+
* from bones far from the vertex), `smoothBridges` (soften the weights around stretched bridging triangles so the patch deforms as one
|
|
5
|
+
* surface) and `cutStretch` (remove triangles that still stretch past a limit; leaves holes, so it is the last resort).
|
|
6
|
+
*/
|
|
7
|
+
import { type SkinReport } from "./analysis.js";
|
|
8
|
+
import { type GlbData, type SkinInfo } from "./gltf.js";
|
|
9
|
+
export interface RepairSkinOptions {
|
|
10
|
+
readonly normalize?: boolean;
|
|
11
|
+
/** Strongest influences kept per vertex (1 to 4; default 4). */
|
|
12
|
+
readonly maxInfluences?: number;
|
|
13
|
+
readonly pruneDistant?: boolean;
|
|
14
|
+
readonly smoothBridges?: boolean;
|
|
15
|
+
/** Triangles stretched past this multiple are the smoothing region (default 1.5). */
|
|
16
|
+
readonly smoothThreshold?: number;
|
|
17
|
+
/** Smoothing rounds: each re-measures the stretch with the new weights and smooths what is still stretched (default 1). */
|
|
18
|
+
readonly smoothRounds?: number;
|
|
19
|
+
/** How many rings of neighbouring vertices around a stretched triangle are smoothed (default 4). */
|
|
20
|
+
readonly smoothRings?: number;
|
|
21
|
+
/** Remove triangles stretched past this limit after the other steps (off by default). */
|
|
22
|
+
readonly cutStretch?: number;
|
|
23
|
+
readonly clips?: readonly string[];
|
|
24
|
+
readonly samples?: number;
|
|
25
|
+
readonly ignoreMaterials?: RegExp;
|
|
26
|
+
}
|
|
27
|
+
export interface RepairSkinReport {
|
|
28
|
+
readonly steps: readonly string[];
|
|
29
|
+
readonly primitives: readonly {
|
|
30
|
+
readonly material: string;
|
|
31
|
+
readonly normalizedVertices: number;
|
|
32
|
+
readonly prunedInfluences: number;
|
|
33
|
+
readonly smoothedVertices: number;
|
|
34
|
+
readonly removedTriangles: number;
|
|
35
|
+
}[];
|
|
36
|
+
readonly before: SkinReport;
|
|
37
|
+
readonly after: SkinReport;
|
|
38
|
+
readonly guidance: readonly string[];
|
|
39
|
+
}
|
|
40
|
+
export declare function repairSkin(glb: GlbData, options?: RepairSkinOptions): {
|
|
41
|
+
glb: GlbData;
|
|
42
|
+
report: RepairSkinReport;
|
|
43
|
+
};
|
|
44
|
+
export type { SkinInfo };
|
|
45
|
+
//# sourceMappingURL=repair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/skin/repair.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAgG,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAE9I,OAAO,EAAwD,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAoC,MAAM,WAAW,CAAC;AAEhJ,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,gEAAgE;IAChE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,qFAAqF;IACrF,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,2HAA2H;IAC3H,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,oGAAoG;IACpG,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,yFAAyF;IACzF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,SAAS;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5M,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAwBD,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,iBAAsB,GAAG;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAiHpH;AAaD,YAAY,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `assets repair-skin`: the generic, safe repairs for a skinned GLB. Every step is opt-in so a re-run changes only what you asked for:
|
|
3
|
+
* `normalize` (renormalise weights, drop non-finite and out-of-range influences, keep the strongest K), `pruneDistant` (drop influences
|
|
4
|
+
* from bones far from the vertex), `smoothBridges` (soften the weights around stretched bridging triangles so the patch deforms as one
|
|
5
|
+
* surface) and `cutStretch` (remove triangles that still stretch past a limit; leaves holes, so it is the last resort).
|
|
6
|
+
*/
|
|
7
|
+
import { analyzeSkin, DEFAULT_SKIN_THRESHOLDS, samplePoses, triangleStretch } from "./analysis.js";
|
|
8
|
+
import { GlbEditor } from "./glbEdit.js";
|
|
9
|
+
import { buildHierarchy, jointBindPositions, loadSkins, vdist } from "./gltf.js";
|
|
10
|
+
function dense(prim, v, jointCount) {
|
|
11
|
+
const m = new Map();
|
|
12
|
+
const w = prim.weights[v] ?? [], j = prim.joints[v] ?? [];
|
|
13
|
+
for (let k = 0; k < 4; k += 1) {
|
|
14
|
+
const wk = w[k] ?? 0, jk = j[k] ?? 0;
|
|
15
|
+
if (!(wk > 0) || !Number.isFinite(wk) || jk >= jointCount)
|
|
16
|
+
continue;
|
|
17
|
+
m.set(jk, (m.get(jk) ?? 0) + wk);
|
|
18
|
+
}
|
|
19
|
+
return m;
|
|
20
|
+
}
|
|
21
|
+
function adjacency(prim) {
|
|
22
|
+
const adj = Array.from({ length: prim.pos.length }, () => new Set());
|
|
23
|
+
for (let i = 0; i + 2 < prim.indices.length; i += 3) {
|
|
24
|
+
const a = prim.indices[i], b = prim.indices[i + 1], c = prim.indices[i + 2];
|
|
25
|
+
adj[a]?.add(b).add(c);
|
|
26
|
+
adj[b]?.add(a).add(c);
|
|
27
|
+
adj[c]?.add(a).add(b);
|
|
28
|
+
}
|
|
29
|
+
return adj;
|
|
30
|
+
}
|
|
31
|
+
export function repairSkin(glb, options = {}) {
|
|
32
|
+
const hierarchy = buildHierarchy(glb);
|
|
33
|
+
const skins = loadSkins(glb, hierarchy);
|
|
34
|
+
const editor = new GlbEditor(glb);
|
|
35
|
+
const steps = [];
|
|
36
|
+
const guidance = [];
|
|
37
|
+
const reports = [];
|
|
38
|
+
const analysisOptions = { clips: options.clips, samples: options.samples, ignoreMaterials: options.ignoreMaterials };
|
|
39
|
+
const before = analyzeSkin(glb, analysisOptions);
|
|
40
|
+
const K = Math.max(1, Math.min(4, Math.floor(options.maxInfluences ?? 4)));
|
|
41
|
+
if (options.normalize)
|
|
42
|
+
steps.push(`normalize (keep the strongest ${K} influences)`);
|
|
43
|
+
if (options.pruneDistant)
|
|
44
|
+
steps.push("prune-distant");
|
|
45
|
+
if (options.smoothBridges)
|
|
46
|
+
steps.push("smooth-bridges");
|
|
47
|
+
if (options.cutStretch !== undefined)
|
|
48
|
+
steps.push(`cut-stretch ${options.cutStretch}`);
|
|
49
|
+
const animations = glb.json.animations ?? [];
|
|
50
|
+
const clips = options.clips ? animations.filter((a) => options.clips?.includes(a.name ?? "")) : animations;
|
|
51
|
+
const needPoses = options.smoothBridges || options.cutStretch !== undefined;
|
|
52
|
+
const poses = needPoses ? samplePoses(glb, hierarchy, clips, Math.max(2, options.samples ?? 10)).poses : [];
|
|
53
|
+
for (const skin of skins) {
|
|
54
|
+
const bind = jointBindPositions(skin);
|
|
55
|
+
for (const prim of skin.primitives) {
|
|
56
|
+
if (options.ignoreMaterials?.test(prim.materialName))
|
|
57
|
+
continue;
|
|
58
|
+
const nV = prim.pos.length;
|
|
59
|
+
let weights = Array.from({ length: nV }, (_, v) => dense(prim, v, skin.joints.length));
|
|
60
|
+
let normalizedVertices = 0, prunedInfluences = 0, smoothedVertices = 0, removedTriangles = 0;
|
|
61
|
+
const height = (() => { let lo = Infinity, hi = -Infinity; for (const p of prim.pos) {
|
|
62
|
+
lo = Math.min(lo, p[1]);
|
|
63
|
+
hi = Math.max(hi, p[1]);
|
|
64
|
+
} return hi > lo ? hi - lo : 1; })();
|
|
65
|
+
if (options.pruneDistant) {
|
|
66
|
+
const limit = DEFAULT_SKIN_THRESHOLDS.distantFraction * height;
|
|
67
|
+
weights = weights.map((m, v) => {
|
|
68
|
+
const next = new Map();
|
|
69
|
+
for (const [j, w] of m) {
|
|
70
|
+
const at = bind[j];
|
|
71
|
+
if (at && w >= DEFAULT_SKIN_THRESHOLDS.distantMinWeight && vdist(prim.pos[v], at) > limit) {
|
|
72
|
+
prunedInfluences += 1;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
next.set(j, w);
|
|
76
|
+
}
|
|
77
|
+
return next.size > 0 ? next : m;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
let stretch = null;
|
|
81
|
+
if (needPoses)
|
|
82
|
+
stretch = triangleStretch(skin, prim, poses, Infinity, 0).worst;
|
|
83
|
+
if (options.smoothBridges && stretch) {
|
|
84
|
+
const adj = adjacency(prim);
|
|
85
|
+
const threshold = options.smoothThreshold ?? 1.5;
|
|
86
|
+
const rounds = Math.max(1, Math.floor(options.smoothRounds ?? 1));
|
|
87
|
+
for (let round = 0; round < rounds; round += 1) {
|
|
88
|
+
if (round > 0) {
|
|
89
|
+
stretch = triangleStretch(skin, withWeights(prim, weights, K), poses, Infinity, 0).worst;
|
|
90
|
+
let over = 0;
|
|
91
|
+
for (let t = 0; t < stretch.length; t += 1)
|
|
92
|
+
if (stretch[t] > DEFAULT_SKIN_THRESHOLDS.stretchLimit)
|
|
93
|
+
over += 1;
|
|
94
|
+
if (over <= Math.max(DEFAULT_SKIN_THRESHOLDS.stretchAllowTriangles, Math.floor(stretch.length * 0.001)))
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
let region = new Set();
|
|
98
|
+
for (let t = 0; t < stretch.length; t += 1)
|
|
99
|
+
if (stretch[t] > threshold)
|
|
100
|
+
for (let k = 0; k < 3; k += 1)
|
|
101
|
+
region.add(prim.indices[t * 3 + k]);
|
|
102
|
+
for (let r = 0; r < Math.max(1, Math.floor(options.smoothRings ?? 4)); r += 1) {
|
|
103
|
+
const next = new Set(region);
|
|
104
|
+
for (const v of region)
|
|
105
|
+
for (const n of adj[v] ?? [])
|
|
106
|
+
next.add(n);
|
|
107
|
+
region = next;
|
|
108
|
+
}
|
|
109
|
+
for (let it = 0; it < 30; it += 1) {
|
|
110
|
+
const next = weights.map((m) => new Map(m));
|
|
111
|
+
for (const v of region) {
|
|
112
|
+
const nb = [...(adj[v] ?? [])];
|
|
113
|
+
if (nb.length === 0)
|
|
114
|
+
continue;
|
|
115
|
+
const avg = new Map();
|
|
116
|
+
for (const n of nb)
|
|
117
|
+
for (const [j, w] of weights[n])
|
|
118
|
+
avg.set(j, (avg.get(j) ?? 0) + w / nb.length);
|
|
119
|
+
const m = new Map();
|
|
120
|
+
for (const [j, w] of weights[v])
|
|
121
|
+
m.set(j, 0.2 * w);
|
|
122
|
+
for (const [j, w] of avg)
|
|
123
|
+
m.set(j, (m.get(j) ?? 0) + 0.8 * w);
|
|
124
|
+
next[v] = m;
|
|
125
|
+
}
|
|
126
|
+
weights = next;
|
|
127
|
+
}
|
|
128
|
+
smoothedVertices = Math.max(smoothedVertices, region.size);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const changedWeights = Boolean(options.normalize || options.pruneDistant || options.smoothBridges);
|
|
132
|
+
let indices = prim.indices;
|
|
133
|
+
if (options.cutStretch !== undefined && stretch) {
|
|
134
|
+
// re-measure after the weight edits so the cut only removes what is still stretched
|
|
135
|
+
const keep = [];
|
|
136
|
+
const edited = changedWeights ? withWeights(prim, weights, K) : prim;
|
|
137
|
+
const again = triangleStretch(skin, edited, poses, Infinity, 0).worst;
|
|
138
|
+
for (let t = 0; t < again.length; t += 1) {
|
|
139
|
+
if (again[t] <= options.cutStretch)
|
|
140
|
+
keep.push(prim.indices[t * 3], prim.indices[t * 3 + 1], prim.indices[t * 3 + 2]);
|
|
141
|
+
else
|
|
142
|
+
removedTriangles += 1;
|
|
143
|
+
}
|
|
144
|
+
indices = keep;
|
|
145
|
+
}
|
|
146
|
+
if (changedWeights) {
|
|
147
|
+
const J = [], W = [];
|
|
148
|
+
for (let v = 0; v < nV; v += 1) {
|
|
149
|
+
const top = [...weights[v].entries()].sort((a, b) => b[1] - a[1]).slice(0, K);
|
|
150
|
+
const sum = top.reduce((a, [, w]) => a + w, 0) || 1;
|
|
151
|
+
if (top.length === 0)
|
|
152
|
+
normalizedVertices += 1;
|
|
153
|
+
if (Math.abs(((prim.weights[v] ?? []).reduce((a, b) => a + b, 0)) - 1) > DEFAULT_SKIN_THRESHOLDS.weightSumTolerance)
|
|
154
|
+
normalizedVertices += 1;
|
|
155
|
+
for (let k = 0; k < 4; k += 1) {
|
|
156
|
+
J.push(top[k]?.[0] ?? 0);
|
|
157
|
+
W.push(top[k] ? top[k][1] / sum : 0);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const primitive = editor.primitive(prim.meshIndex, prim.primitiveIndex);
|
|
161
|
+
primitive.attributes.JOINTS_0 = editor.addAccessor(J, 5123, "VEC4", 34962);
|
|
162
|
+
primitive.attributes.WEIGHTS_0 = editor.addAccessor(W, 5126, "VEC4", 34962);
|
|
163
|
+
}
|
|
164
|
+
if (removedTriangles > 0) {
|
|
165
|
+
const primitive = editor.primitive(prim.meshIndex, prim.primitiveIndex);
|
|
166
|
+
primitive.indices = editor.addAccessor(indices, nV > 65535 ? 5125 : 5123, "SCALAR", 34963);
|
|
167
|
+
}
|
|
168
|
+
reports.push({ material: prim.materialName, normalizedVertices, prunedInfluences, smoothedVertices, removedTriangles });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const repaired = editor.finish();
|
|
172
|
+
const after = analyzeSkin(repaired, analysisOptions);
|
|
173
|
+
if (before.bindMismatch.length > 0) {
|
|
174
|
+
guidance.push(`Bind-pose mismatch on ${before.bindMismatch.map((b) => b.bone).join(", ")}: the mesh was modelled in a different pose than the skeleton assumes. Weight smoothing and triangle cuts only mask it. For a recognised humanoid run repair-skin --rebuild-limbs (rebuilds the legs in the skeleton's pose); otherwise rebuild the limbs in your DCC tool or regenerate and re-rig the model in the pose the skeleton assumes.`);
|
|
175
|
+
}
|
|
176
|
+
if (!after.ok && steps.length > 0)
|
|
177
|
+
guidance.push(`Still failing after ${steps.join(", ")}: ${after.reasonCodes.join(", ")}. Cutting stretched triangles opens holes; prefer --rebuild-limbs or re-rigging.`);
|
|
178
|
+
if (steps.length === 0)
|
|
179
|
+
guidance.push("No repair step selected. Pass --normalize, --prune-distant, --smooth-bridges, --cut-stretch <limit> or --rebuild-limbs.");
|
|
180
|
+
return { glb: repaired, report: { steps, primitives: reports, before, after, guidance } };
|
|
181
|
+
}
|
|
182
|
+
function withWeights(prim, weights, K) {
|
|
183
|
+
const joints = [], w = [];
|
|
184
|
+
for (let v = 0; v < prim.pos.length; v += 1) {
|
|
185
|
+
const top = [...weights[v].entries()].sort((a, b) => b[1] - a[1]).slice(0, K);
|
|
186
|
+
const sum = top.reduce((a, [, x]) => a + x, 0) || 1;
|
|
187
|
+
joints.push([0, 1, 2, 3].map((k) => top[k]?.[0] ?? 0));
|
|
188
|
+
w.push([0, 1, 2, 3].map((k) => (top[k] ? top[k][1] / sum : 0)));
|
|
189
|
+
}
|
|
190
|
+
return { ...prim, joints, weights: w };
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=repair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair.js","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/skin/repair.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aura3d/cli",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.3.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"aura3d": "dist/cli.js",
|
|
@@ -28,10 +28,10 @@
|
|
|
28
28
|
"types": "./dist/index.d.ts",
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"typescript": "^5.8.3",
|
|
31
|
-
"@aura3d/asset-index": "4.
|
|
32
|
-
"@aura3d/audio": "4.
|
|
33
|
-
"create-aura3d": "4.
|
|
34
|
-
"@aura3d/rendering": "4.
|
|
31
|
+
"@aura3d/asset-index": "4.3.1",
|
|
32
|
+
"@aura3d/audio": "4.3.1",
|
|
33
|
+
"create-aura3d": "4.3.1",
|
|
34
|
+
"@aura3d/rendering": "4.3.1"
|
|
35
35
|
},
|
|
36
36
|
"description": "Bring real GLB/glTF assets into Aura3D browser apps with typed references, provenance, catalog search, validation, screenshots, and deploy checks.",
|
|
37
37
|
"keywords": [
|
|
@@ -76,7 +76,7 @@ Hard checklist (all must hold before claiming done):
|
|
|
76
76
|
|
|
77
77
|
## Default-look facts
|
|
78
78
|
|
|
79
|
-
No environment authored means the built-in neutral floor (4.1.2 published builds also log `ENV_FETCH_FAILED` for `/aura-environments/neutral.manifest.json`);
|
|
79
|
+
No environment authored means the built-in neutral floor (4.1.2 published builds also log `ENV_FETCH_FAILED` for `/aura-environments/neutral.manifest.json`); in 4.2.x `effects.vignette()` made frames about 25% to 40% darker (it ran on display-referred bytes; 4.3.0 applies it in linear light, about 6% to 18%; bloom does not darken); exposure runs brighter than three.js for the same intensities. Judge the captured frame with the same post settings, and read the full list in `docs/agents/art-direction.md` section 3.
|
|
80
80
|
|
|
81
81
|
## References
|
|
82
82
|
|