import json def create_triangular_obj_from_json(vertices_file, indices_file, output_file): # 读取顶点数据 with open(vertices_file, 'r') as f: vertices = json.load(f) # 读取线索引数据 with open(indices_file, 'r') as f: edges = json.load(f) print(f"读取到 {len(vertices)} 个顶点") print(f"读取到 {len(edges)} 条边") # 根据边的连接关系自动识别三角形面 triangles = edges_to_triangles(edges) print(f"识别到 {len(triangles)} 个三角形面") # 创建OBJ文件 with open(output_file, 'w') as f: # 写入文件头 f.write("# OBJ文件 - 三角形面网格\n") f.write(f"# 顶点数: {len(vertices)}, 面数: {len(triangles)}\n\n") # 写入顶点信息 (v x y z) for i, vertex in enumerate(vertices): #f.write(f"# 顶点 {i}\n") f.write(f"v {vertex[0]:.6f} {vertex[1]:.6f} {vertex[2]:.6f}\n") f.write("\n") # 写入面信息 (f v1 v2 v3) for triangle in triangles: # OBJ文件索引从1开始,所以需要+1 #f.write(f"# 面 {triangle[0]} {triangle[1]} {triangle[2]}\n") f.write(f"f {triangle[0]+1} {triangle[1]+1} {triangle[2]+1}\n") def edges_to_triangles(edges): """ 将edges数组转换为triangles数组 每三个元素的第一值组成一个三角形 Args: edges: 从JSON读取的边数组 Returns: triangles: 三角形数组,每个元素包含三个点的索引 """ triangles = [] # 确保边的数量是3的倍数(每个三角形由3条边组成) if len(edges) % 3 != 0: print(f"警告: 边的数量({len(edges)})不是3的倍数") # 每3条边组成一个三角形,取每条边的第一个点 for i in range(0, len(edges), 3): if i + 2 < len(edges): # 确保有足够的边 triangle = [ edges[i][0], # 第一条边的第一个点 edges[i+1][0], # 第二条边的第一个点 edges[i+2][0] # 第三条边的第一个点 ] triangles.append(triangle) return triangles # 使用示例 if __name__ == "__main__": # 输入文件 vertices_file = "face_picture_point.json" # 顶点数据文件 indices_file = "point_connection.json" # 线索引数据文件 # 输出文件 output_file = "face_picture.obj" # 生成的OBJ文件 # 生成OBJ文件 create_triangular_obj_from_json(vertices_file, indices_file, output_file) print(f"OBJ文件已生成: {output_file}")