66 lines
2.4 KiB
Python
66 lines
2.4 KiB
Python
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))
|