"""
seolwu_jeonban.obj → jeonban_buf.json 변환
trimesh로 메시 단순화(611K → 20K 삼각형) + 좌표 변환 미리 적용
"""
import json, os, trimesh, numpy as np

OBJ = r'E:\도진팩토리\3D스캔및티칭시스템\seolwu_jeonban.obj'
OUT = r'E:\도진팩토리\3D스캔및티칭시스템\jeonban_buf.json'

OFS_X = -1983.9
OFS_Y = -8465.8
OFS_Z = -1019.0
TARGET = 80000  # 삼각형 목표 수

print('OBJ 로드 중...')
mesh = trimesh.load(OBJ, force='mesh')
print(f'원본: {len(mesh.faces):,} 삼각형')

print(f'단순화 중 → {TARGET:,} 삼각형...')
import open3d as o3d
o3d_mesh = o3d.geometry.TriangleMesh()
o3d_mesh.vertices = o3d.utility.Vector3dVector(mesh.vertices)
o3d_mesh.triangles = o3d.utility.Vector3iVector(mesh.faces)
o3d_mesh = o3d_mesh.simplify_quadric_decimation(TARGET)
mesh = trimesh.Trimesh(
    vertices=np.asarray(o3d_mesh.vertices),
    faces=np.asarray(o3d_mesh.triangles)
)
print(f'단순화 후: {len(mesh.faces):,} 삼각형')

# 좌표 변환 (JS와 동일: x+OFS_X, -z+OFS_Y, y+OFS_Z)
v = mesh.vertices  # (N, 3) — x,y,z
vt = np.empty_like(v)
vt[:, 0] = v[:, 0] + OFS_X
vt[:, 1] = -v[:, 2] + OFS_Y
vt[:, 2] = v[:, 1] + OFS_Z

# 삼각형 펼치기 (faces → flat position array)
tris = vt[mesh.faces]          # (F, 3, 3)
posArr = tris.reshape(-1).tolist()
posArr = [round(x, 1) for x in posArr]

print('JSON 저장 중...')
with open(OUT, 'w') as f:
    json.dump({'pos': posArr}, f, separators=(',', ':'))

size_mb = os.path.getsize(OUT) / 1024 / 1024
print(f'완료 → {OUT}')
print(f'삼각형: {len(mesh.faces):,}개 / 파일: {size_mb:.1f} MB (원본 42MB)')
