"""Quick recon: joined garment-adjacent body mesh AABB per body type.""" import bpy import os REPO = "/var/mnt/data/projects/settled-reach" BODIES_DIR = os.path.join(REPO, "client/assets/characters/bodies") BODY_TYPES = ["average_m", "average_f", "muscular_m", "muscular_f", "thin_m", "thin_f", "heavy_m", "heavy_f", "teen_m", "teen_f", "child"] SEGS = ["seg_torso", "seg_hips", "seg_neck", "seg_arm_upper_l", "seg_arm_upper_r", "seg_leg_upper_l", "seg_leg_upper_r"] for body in BODY_TYPES: bpy.ops.object.select_all(action='SELECT') bpy.ops.object.delete(use_global=False) xs, ys, zs = [], [], [] t_xs, t_ys = [], [] for seg in SEGS: path = os.path.join(BODIES_DIR, body, seg + ".glb") if not os.path.exists(path): continue before = set(bpy.data.objects) bpy.ops.import_scene.gltf(filepath=path) for o in set(bpy.data.objects) - before: if o.type == 'MESH' and len(o.vertex_groups) > 0: for v in o.data.vertices: w = o.matrix_world @ v.co xs.append(w.x) ys.append(w.y) zs.append(w.z) if seg == "seg_torso": t_xs.append(w.x) t_ys.append(w.y) print(f"AABB {body}: full x={max(xs)-min(xs):.3f} " f"y={max(ys)-min(ys):.3f} z_top={max(zs):.3f} " f"| torso x={max(t_xs)-min(t_xs):.3f} depth y={max(t_ys)-min(t_ys):.3f}")