Files
settled-reach/tooling/test_quaternius_raw.py
T
jpmschweitzerandClaude Opus 4.6 093b24e38e feat(assets): face-based segmentation pipeline + solidify for hair/clothing
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>
2026-03-23 17:43:04 +01:00

43 lines
1.6 KiB
Python

"""Load original Quaternius body + hair as-is and export a combined GLB for visual inspection."""
import sys
import os
import bpy
if __name__ == "__main__":
argv = sys.argv
if "--" not in argv:
print("Usage: blender --background --python test_quaternius_raw.py -- <output.glb>")
sys.exit(1)
output = argv[argv.index("--") + 1]
bpy.ops.wm.read_factory_settings(use_empty=True)
# Load the Superhero Female body (original, unmodified)
body_path = "/var/mnt/data/projects/settled-reach/main/docs/assets/downloads/Universal Base Characters[Source]/Base Characters/Exports/Godot - UE/Superhero_Female_FullBody.gltf"
bpy.ops.import_scene.gltf(filepath=body_path)
print("=== After body import ===")
for obj in bpy.context.scene.objects:
print(f" {obj.name} type={obj.type}")
# Load bob hair (Rigged to Head Bone, Female)
hair_path = "/var/mnt/data/projects/settled-reach/main/docs/assets/downloads/Universal Base Characters[Source]/Hairstyles/Rigged to Head Bone/glTF (Godot -Unreal)/Female/Hair_Bob.gltf"
bpy.ops.import_scene.gltf(filepath=hair_path)
print("=== After hair import ===")
for obj in bpy.context.scene.objects:
print(f" {obj.name} type={obj.type} parent={obj.parent.name if obj.parent else 'None'}")
# Export everything as one GLB
bpy.ops.object.select_all(action='SELECT')
bpy.ops.export_scene.gltf(
filepath=output,
use_selection=True,
export_format='GLB',
export_animations=False,
export_yup=True,
export_skins=True,
export_materials='EXPORT',
)
print(f"Exported: {output}")