Segmentation: - Face-based exclusive assignment (no overlap, no caps needed) - Hips split from torso (pelvis as own segment) - Torso_upper independent (spine_03 + clavicle, not a variant) - Clavicle moved from arm_upper to torso_upper Hair pipeline: - Solidify modifier (20mm) for scalp hair volume - Normal recalculation before solidify for consistent direction - Eyebrows/facial hair NOT solidified - Fixed mask generation (was outputting black, now white) Clothing pipeline: - Solidify modifier (25mm) for clothing thickness - Peasant shoes added from Fantasy pack Tooling: - convert_outfit.py with solidify support - inspect_glb.py, check_hair_symmetry.py for debugging - Segment reference distribution locked - Q-063 footsteps VFX filed Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
33 lines
1.4 KiB
Python
33 lines
1.4 KiB
Python
"""Inspect a GLB file's objects, vertex groups, and parent hierarchy."""
|
|
import sys
|
|
import bpy
|
|
|
|
if __name__ == "__main__":
|
|
argv = sys.argv
|
|
if "--" not in argv:
|
|
print("Usage: blender --background --python inspect_glb.py -- <input.glb>")
|
|
sys.exit(1)
|
|
args = argv[argv.index("--") + 1:]
|
|
input_path = args[0]
|
|
|
|
bpy.ops.wm.read_factory_settings(use_empty=True)
|
|
bpy.ops.import_scene.gltf(filepath=input_path)
|
|
|
|
for obj in bpy.context.scene.objects:
|
|
print(f"OBJ: {obj.name} type={obj.type} pos={tuple(round(v,3) for v in obj.location)}")
|
|
if obj.type == 'MESH':
|
|
vg_names = [vg.name for vg in obj.vertex_groups]
|
|
print(f" vertex_groups ({len(vg_names)}): {vg_names[:10]}")
|
|
print(f" parent: {obj.parent.name if obj.parent else 'None'}")
|
|
print(f" verts: {len(obj.data.vertices)}")
|
|
# Check skin modifier
|
|
for mod in obj.modifiers:
|
|
print(f" modifier: {mod.name} type={mod.type} object={mod.object.name if hasattr(mod, 'object') and mod.object else 'None'}")
|
|
if obj.type == 'ARMATURE':
|
|
bones = [b.name for b in obj.data.bones]
|
|
print(f" bones ({len(bones)}): {bones[:8]}...")
|
|
# Print head bone position if exists
|
|
for b in obj.data.bones:
|
|
if b.name == 'Head':
|
|
print(f" Head bone head_local: {tuple(round(v,3) for v in b.head_local)}")
|