feat: clothing lane, character sources, and DCC bridges
Bulk import of the working lanes that were living untracked on the PC. Content: - characters/ Lena/male body lanes, bakes, texture work, run logs - clothing/ garment pipeline, configs, gates, contract docs - garments/ MD-authored garment sources (.zprj/.zpac) - UAL-Lib/ Universal Animation Library 2 source (.blend/.fbx/.glb) - tools/ blender_bridge, iclone_bridge, md_bridge, tailor, glm_agent - docs/, plans/, dev/, .agents/plans/ Repo hygiene: - .gitattributes: LFS now covers .blend, .zprj, .zpac, .obj, .npy and the Reallusion .iAvatar/.ccAvatar/.ccRestore containers. Without this the ~3.8 GB in this commit would land as raw blobs. .png/.jpg are left out on purpose — ~250 are already tracked raw and converting them would rewrite every one without shrinking history. - .gitignore: exclude /accurig/ (~1 GB AccuRig program files, redistributable from Reallusion, nothing authored here) and /dev/null/ (git-lfs hook copies dropped by a `>/dev/null` redirect on Windows). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
import bpy, sys
|
||||
import numpy as np
|
||||
W = r"C:\Users\Jeremy\tinqs\animation\characters\female\lena_nude\hires_claude"
|
||||
bpy.ops.wm.open_mainfile(filepath=W + r"\03_sculpted.blend")
|
||||
ob = max([o for o in bpy.data.objects if o.type=='MESH'], key=lambda o: len(o.data.vertices))
|
||||
me = ob.data
|
||||
n_v = len(me.vertices)
|
||||
co = np.empty(n_v*3); me.vertices.foreach_get("co", co); co = co.reshape(-1,3)
|
||||
# face normals -> vertex normal variance (crease detector)
|
||||
n_f = len(me.polygons)
|
||||
fn = np.empty(n_f*3); me.polygons.foreach_get("normal", fn); fn = fn.reshape(-1,3)
|
||||
lt = np.empty(n_f, dtype=np.int32); me.polygons.foreach_get("loop_total", lt)
|
||||
ls = np.empty(n_f, dtype=np.int32); me.polygons.foreach_get("loop_start", ls)
|
||||
lv = np.empty(len(me.loops), dtype=np.int32); me.loops.foreach_get("vertex_index", lv)
|
||||
acc = np.zeros((n_v,3)); acc2 = np.zeros(n_v); cnt = np.zeros(n_v)
|
||||
for fi in range(n_f):
|
||||
for k in range(ls[fi], ls[fi]+lt[fi]):
|
||||
vi = lv[k]
|
||||
acc[vi] += fn[fi]; cnt[vi] += 1
|
||||
mean = acc / np.maximum(cnt,1)[:,None]
|
||||
ml = np.linalg.norm(mean, axis=1) # 1 = all normals aligned; low = crease/facet
|
||||
window = (co[:,1] < 0) & (co[:,2] > 0.58) & (co[:,2] < 0.82) & (np.abs(co[:,0]) < 0.12)
|
||||
bad = window & (ml < 0.90) & (cnt > 0)
|
||||
print(f"creased verts in front-chest window: {bad.sum()}")
|
||||
if bad.sum():
|
||||
b = co[bad]
|
||||
print(f"bbox: x [{b[:,0].min():+.3f},{b[:,0].max():+.3f}] "
|
||||
f"y [{b[:,1].min():+.3f},{b[:,1].max():+.3f}] "
|
||||
f"z [{b[:,2].min():+.3f},{b[:,2].max():+.3f}]")
|
||||
# cluster by z-decile to see structure
|
||||
for zlo in np.arange(0.58, 0.82, 0.02):
|
||||
m = bad & (co[:,2] >= zlo) & (co[:,2] < zlo+0.02)
|
||||
if m.sum() > 30:
|
||||
print(f" z {zlo:.2f}-{zlo+0.02:.2f}: n={m.sum():5d} "
|
||||
f"x[{co[m,0].min():+.3f},{co[m,0].max():+.3f}]")
|
||||
print("LOCATE_DONE")
|
||||
Reference in New Issue
Block a user