如何从Blender导出带顶点坐标的面列表并生成JSON脚本?
解决方案:Blender模型面顶点坐标提取与JSON导出
内置终端 vs 独立脚本
- 内置Python终端:适合单次操作、快速调试。直接在Blender「脚本」工作区打开终端,粘贴代码片段就能实时执行,方便验证效果。
- 独立脚本:适合批量处理多模型、自动化工作流。无需打开Blender界面,通过命令行调用脚本执行,效率更高。
核心实现代码
以下脚本可以提取模型每个面的顶点坐标,并导出为符合需求的JSON文件,支持局部坐标和世界坐标两种模式:
1. 提取局部坐标(物体自身坐标系)
import bpy import json # 目标:处理当前选中的网格物体 target_obj = bpy.context.active_object if target_obj and target_obj.type == 'MESH': mesh_data = target_obj.data face_vertex_list = [] # 遍历每个面,提取顶点坐标 for face in mesh_data.polygons: # 把每个顶点的局部坐标转换成元组,存入列表 face_vertices = [tuple(mesh_data.vertices[vert_idx].co) for vert_idx in face.vertices] face_vertex_list.append(face_vertices) # 打印格式示例 print(json.dumps(face_vertex_list, indent=2)) # 导出到JSON文件 output_path = bpy.path.abspath("//model_faces_local.json") with open(output_path, 'w', encoding='utf-8') as f: json.dump(face_vertex_list, f, indent=2) print(f"文件已导出至:{output_path}") else: print("请选中一个有效的网格物体")
2. 提取世界坐标(全局坐标系)
如果需要全局空间下的顶点坐标,只需修改顶点坐标的计算逻辑,通过物体的世界矩阵转换:
# 替换上述代码中face_vertices的生成行 face_vertices = [tuple(target_obj.matrix_world @ mesh_data.vertices[vert_idx].co) for vert_idx in face.vertices]
导出文件可改名为model_faces_world.json,方便区分。
运行方式
内置环境运行
- 打开Blender,选中要处理的模型
- 切换到「脚本」工作区,新建文本文件,粘贴代码
- 点击顶部的「运行脚本」按钮,结果会打印在控制台,JSON文件导出到Blender当前工程目录(可通过
bpy.path.abspath("//")查看路径)
独立脚本批量处理
- 把代码保存为
export_face_vertices.py - 在命令行执行(需确保Blender已加入系统环境变量):
# 后台打开指定Blender文件并执行脚本 blender --background your_model_file.blend --python export_face_vertices.py
注意事项
- 若模型有未应用的变换(位置、旋转、缩放),建议先在Blender中执行「物体 > 应用 > 全部变换」,避免坐标偏差;或者使用世界矩阵转换的方式自动修正。
- 若需处理多个网格物体,可将代码修改为遍历
bpy.context.selected_objects,并为每个物体单独存储面数据。 - JSON格式不支持元组,导出后顶点数据会以列表形式存储,自定义渲染器读取时可直接转换为元组使用。
内容的提问来源于stack exchange,提问作者Kraken_Games
相关产品推荐
相关产品推荐

