79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
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"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"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 = "face1.json" # 顶点数据文件
|
|
indices_file = "point_connection.json" # 线索引数据文件
|
|
|
|
# 输出文件
|
|
output_file = "D:/temp/vulkantest/Assets/face.obj" # 生成的OBJ文件
|
|
|
|
# 生成OBJ文件
|
|
create_triangular_obj_from_json(vertices_file, indices_file, output_file)
|
|
print(f"OBJ文件已生成: {output_file}") |