chore(mako): handfix keepers — clip-curl pose recipe, repair masks, fin_locate
pose_clipcurl_idle.json is the recipe for extracting a clip's pinned curl; the .txt files are the crosshand-repair vertex masks. The 230 MB of A/B bake GLBs and render dirs stay out as regenerable scratch (now gitignored); review/ evidence PNGs were already in the ignored tier. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
After Width: | Height: | Size: 356 KiB |
|
After Width: | Height: | Size: 402 KiB |
|
After Width: | Height: | Size: 330 KiB |
|
After Width: | Height: | Size: 378 KiB |
|
After Width: | Height: | Size: 367 KiB |
|
After Width: | Height: | Size: 260 KiB |
|
After Width: | Height: | Size: 362 KiB |
|
After Width: | Height: | Size: 385 KiB |
|
After Width: | Height: | Size: 322 KiB |
|
After Width: | Height: | Size: 336 KiB |
|
After Width: | Height: | Size: 363 KiB |
|
After Width: | Height: | Size: 231 KiB |
|
After Width: | Height: | Size: 328 KiB |
|
After Width: | Height: | Size: 372 KiB |
|
After Width: | Height: | Size: 301 KiB |
@@ -0,0 +1,246 @@
|
|||||||
|
{
|
||||||
|
"_comment": "Finger rotations Idle_Loop (UAL1) pins on every body \u2014 extracted 2026-08-18 to show what the clips force on Mako's hand. NOT a library pose; a diagnostic.",
|
||||||
|
"source": "UAL1.glb Idle_Loop frame 0",
|
||||||
|
"bones": {
|
||||||
|
"index_01_l": [
|
||||||
|
0.44519037,
|
||||||
|
0.54936898,
|
||||||
|
-0.44519415,
|
||||||
|
0.54936463
|
||||||
|
],
|
||||||
|
"index_02_l": [
|
||||||
|
0.62334186,
|
||||||
|
6e-08,
|
||||||
|
2.2e-07,
|
||||||
|
0.78194946
|
||||||
|
],
|
||||||
|
"index_03_l": [
|
||||||
|
0.62334144,
|
||||||
|
-2e-07,
|
||||||
|
6e-08,
|
||||||
|
0.78194976
|
||||||
|
],
|
||||||
|
"index_04_leaf_l": [
|
||||||
|
0.0,
|
||||||
|
1.0,
|
||||||
|
-1e-08,
|
||||||
|
3.66e-06
|
||||||
|
],
|
||||||
|
"middle_01_l": [
|
||||||
|
0.43208984,
|
||||||
|
0.53869981,
|
||||||
|
-0.45804641,
|
||||||
|
0.55972713
|
||||||
|
],
|
||||||
|
"middle_02_l": [
|
||||||
|
0.62334126,
|
||||||
|
0.00094348,
|
||||||
|
0.00118364,
|
||||||
|
0.78194851
|
||||||
|
],
|
||||||
|
"middle_03_l": [
|
||||||
|
0.62334108,
|
||||||
|
-0.00070432,
|
||||||
|
-0.00088335,
|
||||||
|
0.78194928
|
||||||
|
],
|
||||||
|
"middle_04_leaf_l": [
|
||||||
|
0.0,
|
||||||
|
1.0,
|
||||||
|
1e-08,
|
||||||
|
3.64e-06
|
||||||
|
],
|
||||||
|
"pinky_01_l": [
|
||||||
|
0.50405717,
|
||||||
|
0.51154137,
|
||||||
|
-0.43515161,
|
||||||
|
0.5430423
|
||||||
|
],
|
||||||
|
"pinky_02_l": [
|
||||||
|
0.62316287,
|
||||||
|
-0.02006147,
|
||||||
|
0.01492548,
|
||||||
|
0.78169227
|
||||||
|
],
|
||||||
|
"pinky_03_l": [
|
||||||
|
0.6233415,
|
||||||
|
0.00037983,
|
||||||
|
0.00047662,
|
||||||
|
0.78194952
|
||||||
|
],
|
||||||
|
"pinky_04_leaf_l": [
|
||||||
|
2e-08,
|
||||||
|
1.0,
|
||||||
|
-0.0,
|
||||||
|
3.64e-06
|
||||||
|
],
|
||||||
|
"ring_01_l": [
|
||||||
|
0.43533966,
|
||||||
|
0.54135603,
|
||||||
|
-0.45490378,
|
||||||
|
0.55720335
|
||||||
|
],
|
||||||
|
"ring_02_l": [
|
||||||
|
0.62334186,
|
||||||
|
7.39e-06,
|
||||||
|
9.58e-06,
|
||||||
|
0.78194946
|
||||||
|
],
|
||||||
|
"ring_03_l": [
|
||||||
|
0.62334114,
|
||||||
|
-0.00066514,
|
||||||
|
-0.0008345,
|
||||||
|
0.78194928
|
||||||
|
],
|
||||||
|
"ring_04_leaf_l": [
|
||||||
|
0.0,
|
||||||
|
1.0,
|
||||||
|
0.0,
|
||||||
|
3.66e-06
|
||||||
|
],
|
||||||
|
"thumb_01_l": [
|
||||||
|
0.2908383,
|
||||||
|
0.94964916,
|
||||||
|
0.11458342,
|
||||||
|
0.02121698
|
||||||
|
],
|
||||||
|
"thumb_02_l": [
|
||||||
|
0.21938996,
|
||||||
|
0.02380256,
|
||||||
|
-0.00530472,
|
||||||
|
0.97533244
|
||||||
|
],
|
||||||
|
"thumb_03_l": [
|
||||||
|
0.68738812,
|
||||||
|
-0.00030907,
|
||||||
|
-0.00044466,
|
||||||
|
0.72629011
|
||||||
|
],
|
||||||
|
"thumb_04_leaf_l": [
|
||||||
|
0.0,
|
||||||
|
0.5061779,
|
||||||
|
2.8e-07,
|
||||||
|
0.86242908
|
||||||
|
],
|
||||||
|
"index_01_r": [
|
||||||
|
0.44519085,
|
||||||
|
-0.5493688,
|
||||||
|
0.44519404,
|
||||||
|
0.54936451
|
||||||
|
],
|
||||||
|
"index_02_r": [
|
||||||
|
0.62334144,
|
||||||
|
2.2e-07,
|
||||||
|
6e-08,
|
||||||
|
0.78194976
|
||||||
|
],
|
||||||
|
"index_03_r": [
|
||||||
|
0.62334156,
|
||||||
|
1.5e-07,
|
||||||
|
-2.1e-07,
|
||||||
|
0.7819497
|
||||||
|
],
|
||||||
|
"index_04_leaf_r": [
|
||||||
|
1e-08,
|
||||||
|
-1.0,
|
||||||
|
-0.0,
|
||||||
|
3.65e-06
|
||||||
|
],
|
||||||
|
"middle_01_r": [
|
||||||
|
0.4320901,
|
||||||
|
-0.53869969,
|
||||||
|
0.45804659,
|
||||||
|
0.55972695
|
||||||
|
],
|
||||||
|
"middle_02_r": [
|
||||||
|
0.62334079,
|
||||||
|
-0.00094351,
|
||||||
|
-0.0011834,
|
||||||
|
0.78194886
|
||||||
|
],
|
||||||
|
"middle_03_r": [
|
||||||
|
0.62334144,
|
||||||
|
0.00070417,
|
||||||
|
0.00088315,
|
||||||
|
0.78194898
|
||||||
|
],
|
||||||
|
"middle_04_leaf_r": [
|
||||||
|
0.0,
|
||||||
|
-1.0,
|
||||||
|
-0.0,
|
||||||
|
3.64e-06
|
||||||
|
],
|
||||||
|
"pinky_01_r": [
|
||||||
|
0.50405687,
|
||||||
|
-0.51154143,
|
||||||
|
0.4351517,
|
||||||
|
0.54304248
|
||||||
|
],
|
||||||
|
"pinky_02_r": [
|
||||||
|
0.6231631,
|
||||||
|
0.0200611,
|
||||||
|
-0.01492533,
|
||||||
|
0.78169209
|
||||||
|
],
|
||||||
|
"pinky_03_r": [
|
||||||
|
0.6233418,
|
||||||
|
-0.00038015,
|
||||||
|
-0.00047653,
|
||||||
|
0.78194928
|
||||||
|
],
|
||||||
|
"pinky_04_leaf_r": [
|
||||||
|
2e-08,
|
||||||
|
-1.0,
|
||||||
|
-1e-08,
|
||||||
|
3.65e-06
|
||||||
|
],
|
||||||
|
"ring_01_r": [
|
||||||
|
0.4353399,
|
||||||
|
-0.54135597,
|
||||||
|
0.45490402,
|
||||||
|
0.55720317
|
||||||
|
],
|
||||||
|
"ring_02_r": [
|
||||||
|
0.62334114,
|
||||||
|
-7.55e-06,
|
||||||
|
-9.28e-06,
|
||||||
|
0.78195
|
||||||
|
],
|
||||||
|
"ring_03_r": [
|
||||||
|
0.62334162,
|
||||||
|
0.00066492,
|
||||||
|
0.00083433,
|
||||||
|
0.78194892
|
||||||
|
],
|
||||||
|
"ring_04_leaf_r": [
|
||||||
|
0.0,
|
||||||
|
-1.0,
|
||||||
|
1e-08,
|
||||||
|
3.65e-06
|
||||||
|
],
|
||||||
|
"thumb_01_r": [
|
||||||
|
0.29083842,
|
||||||
|
-0.94964916,
|
||||||
|
-0.11458353,
|
||||||
|
0.02121704
|
||||||
|
],
|
||||||
|
"thumb_02_r": [
|
||||||
|
0.21939011,
|
||||||
|
-0.0238026,
|
||||||
|
0.00530485,
|
||||||
|
0.97533244
|
||||||
|
],
|
||||||
|
"thumb_03_r": [
|
||||||
|
0.68738812,
|
||||||
|
0.00030923,
|
||||||
|
0.00044454,
|
||||||
|
0.72629011
|
||||||
|
],
|
||||||
|
"thumb_04_leaf_r": [
|
||||||
|
3e-08,
|
||||||
|
-0.50617778,
|
||||||
|
-3e-07,
|
||||||
|
0.86242914
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 143 KiB |
|
After Width: | Height: | Size: 267 KiB |
|
After Width: | Height: | Size: 173 KiB |
|
After Width: | Height: | Size: 897 KiB |
|
After Width: | Height: | Size: 924 KiB |
|
After Width: | Height: | Size: 734 KiB |
|
After Width: | Height: | Size: 911 KiB |
|
After Width: | Height: | Size: 959 KiB |
|
After Width: | Height: | Size: 761 KiB |
@@ -0,0 +1,61 @@
|
|||||||
|
"""Cluster the worst-stretched edges by REST position to name the digit region."""
|
||||||
|
import sys, os, math
|
||||||
|
|
||||||
|
def load_obj(path):
|
||||||
|
vs, faces = [], []
|
||||||
|
with open(path) as f:
|
||||||
|
for line in f:
|
||||||
|
if line.startswith('v '):
|
||||||
|
p = line.split()
|
||||||
|
vs.append((float(p[1]), float(p[2]), float(p[3])))
|
||||||
|
elif line.startswith('f '):
|
||||||
|
idx = [int(tok.split('/')[0]) - 1 for tok in line.split()[1:]]
|
||||||
|
for i in range(1, len(idx) - 1):
|
||||||
|
faces.append((idx[0], idx[i], idx[i + 1]))
|
||||||
|
return vs, faces
|
||||||
|
|
||||||
|
def edge_set(faces):
|
||||||
|
es = set()
|
||||||
|
for a, b, c in faces:
|
||||||
|
for u, v in ((a, b), (b, c), (c, a)):
|
||||||
|
es.add((u, v) if u < v else (v, u))
|
||||||
|
return sorted(es)
|
||||||
|
|
||||||
|
def dist(p, q):
|
||||||
|
return math.sqrt(sum((p[i]-q[i])**2 for i in range(3)))
|
||||||
|
|
||||||
|
d = sys.argv[1]
|
||||||
|
for hand in ('l', 'r'):
|
||||||
|
rest_v, rest_f = load_obj(os.path.join(d, f'rest_hand_{hand}.obj'))
|
||||||
|
edges = edge_set(rest_f)
|
||||||
|
xs = sorted(v[0] for v in rest_v)
|
||||||
|
print(f'hand_{hand}: rest x range {xs[0]*100:.1f}..{xs[-1]*100:.1f} cm, '
|
||||||
|
f'y range {min(v[1] for v in rest_v)*100:.1f}..{max(v[1] for v in rest_v)*100:.1f}, '
|
||||||
|
f'z range {min(v[2] for v in rest_v)*100:.1f}..{max(v[2] for v in rest_v)*100:.1f}')
|
||||||
|
for pose in ('fist', 'grip'):
|
||||||
|
v, _ = load_obj(os.path.join(d, f'{pose}_hand_{hand}.obj'))
|
||||||
|
bad = []
|
||||||
|
for a, b in edges:
|
||||||
|
rl = dist(rest_v[a], rest_v[b])
|
||||||
|
if rl <= 1e-9:
|
||||||
|
continue
|
||||||
|
r = dist(v[a], v[b]) / rl
|
||||||
|
if r > 5:
|
||||||
|
bad.append((r, a))
|
||||||
|
# bounding box of bad verts in rest space
|
||||||
|
pts = [rest_v[a] for _, a in bad]
|
||||||
|
if not pts:
|
||||||
|
print(f' {pose}: no >5x edges')
|
||||||
|
continue
|
||||||
|
bx = (min(p[0] for p in pts)*100, max(p[0] for p in pts)*100)
|
||||||
|
by = (min(p[1] for p in pts)*100, max(p[1] for p in pts)*100)
|
||||||
|
bz = (min(p[2] for p in pts)*100, max(p[2] for p in pts)*100)
|
||||||
|
cx = sum(p[0] for p in pts)/len(pts)*100
|
||||||
|
cy = sum(p[1] for p in pts)/len(pts)*100
|
||||||
|
cz = sum(p[2] for p in pts)/len(pts)*100
|
||||||
|
print(f' {pose}: {len(bad)} edges>5x rest-bbox x[{bx[0]:.1f},{bx[1]:.1f}] '
|
||||||
|
f'y[{by[0]:.1f},{by[1]:.1f}] z[{bz[0]:.1f},{bz[1]:.1f}] centroid ({cx:.1f},{cy:.1f},{cz:.1f}) cm')
|
||||||
|
# z-histogram (palm axis?) to see if it's one digit or spread
|
||||||
|
zs = sorted(p[2]*100 for p in pts)
|
||||||
|
q = lambda f: zs[int(f*(len(zs)-1))]
|
||||||
|
print(f' rest z quartiles: {q(0):.1f} / {q(0.25):.1f} / {q(0.5):.1f} / {q(0.75):.1f} / {q(1):.1f}')
|
||||||