LAM2 / generateVertexIndices.py
ych144's picture
Upload 4 files
ef5c6d3 verified
"""
Copyright (c) 2024-2025, The Alibaba 3DAIGC Team Authors.
Blender FBX to GLB Converter
Converts 3D models from FBX to glTF Binary (GLB) format with optimized settings.
Requires Blender to run in background mode.
"""
import bpy
import sys
import os
import json
from pathlib import Path
def import_obj(filepath):
if not os.path.exists(filepath):
raise FileNotFoundError(f"文件不存在:{filepath}")
bpy.ops.wm.obj_import(filepath=filepath)
print(f"成功导入:{filepath}")
def clean_scene():
"""Clear all objects and data from the current Blender scene"""
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete()
for collection in [bpy.data.meshes, bpy.data.materials, bpy.data.textures]:
for item in collection:
collection.remove(item)
def apply_rotation(obj):
obj.rotation_euler = (1.5708, 0, 0)
bpy.context.view_layer.update()
obj.select_set(True)
bpy.context.view_layer.objects.active = obj
bpy.ops.object.transform_apply(location=False, rotation=True, scale=False) # 应用旋转
print(f"Applied 90-degree rotation to object: {obj.name}")
def main():
try:
# Parse command line arguments after "--"
argv = sys.argv[sys.argv.index("--") + 1:]
input_mesh = Path(argv[0])
output_vertex_order_file = argv[1]
# Validate input file
if not input_mesh.exists():
raise FileNotFoundError(f"Input FBX file not found: {input_mesh}")
# Prepare scene
clean_scene()
# Import FBX with default settings
print(f"Importing {input_mesh}...")
import_obj(str(input_mesh))
base_obj = bpy.context.view_layer.objects.active
apply_rotation(base_obj)
bpy.context.view_layer.objects.active = base_obj
base_obj.select_set(True)
bpy.ops.object.mode_set(mode='OBJECT')
base_objects = [obj for obj in bpy.context.scene.objects if obj.type == 'MESH']
if len(base_objects) != 1:
raise ValueError("Scene should contain exactly one base mesh object.")
base_obj = base_objects[0]
vertices = [(i, v.co.z) for i, v in enumerate(base_obj.data.vertices)]
sorted_vertices = sorted(vertices, key=lambda x: x[1]) # 按 Z 坐标从小到大排序
sorted_vertex_indices = [idx for idx, z in sorted_vertices]
with open(str(output_vertex_order_file), "w") as f:
json.dump(sorted_vertex_indices, f, indent=4) # 保存为 JSON 数组
print(f"Exported vertex order to: {str(output_vertex_order_file)}")
except Exception as e:
print(f"Error: {str(e)}")
sys.exit(1)
if __name__ == "__main__":
main()