def read_obj(file_path):
    """
    读取.obj文件,返回顶点列表和面列表
    """
    vertices = []
    faces = []
    
    with open(file_path, 'r') as file:
        for line in file:
            parts = line.split()
            if len(parts) == 0:
                continue
            if parts[0] == 'v':  # 顶点
                vertices.append([float(parts[1]), float(parts[2]), float(parts[3])])
            elif parts[0] == 'f':  # 面
                faces.append([int(parts[1].split('/')[0]), int(parts[2].split('/')[0]), int(parts[3].split('/')[0])])
    
    return vertices, faces

def write_obj(file_path, vertices, faces):
    """
    将修改后的顶点和面列表写入到.obj文件
    """
    with open(file_path, 'w') as file:
        for vertex in vertices:
            file.write(f"v {vertex[0]} {vertex[1]} {vertex[2]}\n")
        
        for face in faces:
            file.write(f"f {face[0]} {face[1]} {face[2]}\n")

def translate_vertices(vertices, translation):
    """
    平移顶点,translation 是一个三维向量,例如 (500, 0, 0) 会沿 X 轴平移 500 米
    """
    return [[v[0] + translation[0], v[1] + translation[1], v[2] + translation[2]] for v in vertices]

def merge_objs(obj1_path, obj2_path, output_path, translation=(500, 0, 0)):
    """
    合并两个.obj文件,并对第二个文件的顶点进行平移
    obj1_path 和 obj2_path 是输入的.obj文件路径
    output_path 是输出的合并后的.obj文件路径
    translation 是平移向量,默认为沿 X 轴平移 500 米
    """
    # 读取第一个 obj 文件
    vertices1, faces1 = read_obj(obj1_path)
    
    # 读取第二个 obj 文件
    vertices2, faces2 = read_obj(obj2_path)
    
    # 平移第二个 obj 文件的顶点
    vertices2_translated = translate_vertices(vertices2, translation)
    
    # 合并顶点和面
    all_vertices = vertices1 + vertices2_translated
    all_faces = faces1 + [[f[0] + len(vertices1), f[1] + len(vertices1), f[2] + len(vertices1)] for f in faces2]
    
    # 写入合并后的 obj 文件
    write_obj(output_path, all_vertices, all_faces)
    print(f"合并完成,结果保存在 {output_path}")

# 示例调用
obj1_path = 'model1.obj'  # 第一个 .obj 文件
obj2_path = 'model2.obj'  # 第二个 .obj 文件
output_path = 'merged_model.obj'  # 输出合并后的 .obj 文件
merge_objs(obj1_path, obj2_path, output_path, translation=(500, 0, 0))