20 lines
1.9 KiB
Python
20 lines
1.9 KiB
Python
"""Align Studio's centred/normalised mesh to its exact source high, retaining UVs."""
|
|
import bpy,sys,json,hashlib
|
|
import numpy as np
|
|
from pathlib import Path
|
|
from mathutils import Matrix,Vector
|
|
|
|
folder=Path(sys.argv[sys.argv.index('--')+1]).resolve()
|
|
bpy.ops.wm.read_factory_settings(use_empty=True)
|
|
def load(path):
|
|
before=set(bpy.data.objects);bpy.ops.import_scene.gltf(filepath=str(path),merge_vertices=False);objects=[o for o in bpy.data.objects if o not in before and o.type=='MESH'];assert len(objects)==1;return objects[0]
|
|
def bounds(obj):
|
|
points=[obj.matrix_world@v.co for v in obj.data.vertices];lo=Vector([min(p[i] for p in points) for i in range(3)]);hi=Vector([max(p[i] for p in points) for i in range(3)]);return lo,hi
|
|
def uvhash(obj):return hashlib.sha256(np.array([tuple(v.uv) for v in obj.data.uv_layers.active.data],dtype='<f4').tobytes()).hexdigest()
|
|
high=load(folder/'model.glb');low=load(folder/'model_lowpoly_uv.glb');hlo,hhi=bounds(high);llo,lhi=bounds(low);scale=(hhi.z-hlo.z)/(lhi.z-llo.z);hc=Vector(((hlo.x+hhi.x)/2,(hlo.y+hhi.y)/2,hlo.z));lc=Vector(((llo.x+lhi.x)/2,(llo.y+lhi.y)/2,llo.z))
|
|
before=uvhash(low);low.matrix_world=Matrix.Translation(hc)@Matrix.Scale(scale,4)@Matrix.Translation(-lc)@low.matrix_world
|
|
bpy.ops.object.select_all(action='DESELECT');low.select_set(True);bpy.context.view_layer.objects.active=low;bpy.ops.object.transform_apply(location=True,rotation=True,scale=True);assert uvhash(low)==before
|
|
bpy.ops.export_scene.gltf(filepath=str(folder/'model_lowpoly_uv_aligned.glb'),export_format='GLB',use_selection=True,export_materials='NONE')
|
|
report=dict(scale=scale,highMin=list(hlo),highMax=list(hhi),studioMin=list(llo),studioMax=list(lhi),matrix=[list(row) for row in Matrix.Translation(hc)@Matrix.Scale(scale,4)@Matrix.Translation(-lc)],uvHashBefore=before,uvHashAfter=uvhash(low),uvUnchanged=True)
|
|
(folder/'bake_alignment.json').write_text(json.dumps(report,indent=2),encoding='utf-8');print('MT_SUMMARY '+json.dumps(report))
|