import os import numpy as np import json from typing import Dict, Any def convert_mesh_to_threejs(mesh_data: Dict[str, Any], output_path: str): """ Convert mesh data to THREE.js compatible JSON format. Args: mesh_data: Mesh data from SAM 3D Body output_path: Path to save the THREE.js compatible JSON """ try: # Convert mesh data to THREE.js format threejs_data = { "metadata": { "version": 4.5, "type": "Object", "generator": "MLSE Player 3D Generator" }, "geometries": [ { "uuid": "player-mesh", "type": "BufferGeometry", "data": { "attributes": { "position": { "itemSize": 3, "type": "Float32Array", "array": mesh_data["vertices"].flatten().tolist() }, "normal": { "itemSize": 3, "type": "Float32Array", "array": mesh_data.get("normals", np.zeros_like(mesh_data["vertices"])).flatten().tolist() }, "uv": { "itemSize": 2, "type": "Float32Array", "array": mesh_data.get("uvs", np.zeros((len(mesh_data["vertices"]), 2))).flatten().tolist() } }, "index": { "type": "Uint16Array", "array": mesh_data["faces"].flatten().tolist() } } } ], "materials": [ { "uuid": "player-material", "type": "MeshStandardMaterial", "color": 0x8888ff, "roughness": 0.5, "metalness": 0.2, "emissive": 0x000000, "side": 2 } ], "object": { "uuid": "player-object", "type": "Mesh", "name": "PlayerMesh", "geometry": "player-mesh", "material": "player-material", "position": [0, 0, 0], "quaternion": [0, 0, 0, 1], "scale": [1, 1, 1] } } # Write to file with open(output_path, 'w') as f: json.dump(threejs_data, f) return output_path except Exception as e: print(f"Error converting mesh to THREE.js format: {str(e)}") raise RuntimeError(f"Failed to convert mesh: {str(e)}")