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>
43 lines
1.6 KiB
Python
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}")
|