You need to enable JavaScript to run this app. Blender 2.9自定义导出实现三角面顶点扁平化为XY坐标
优惠活动
大模型
产品
解决方案
定价
更多

Blender 2.9自定义导出实现三角面顶点扁平化为XY坐标

Blender 2.9三角面顶点扁平化导出自定义格式实现方案

核心实现逻辑

要实现三角面顶点扁平化仅保留XY坐标,只需要对每个三角面的局部顶点做反向旋转抵消对象自身的欧拉角,让三角面完全对齐XY平面后丢弃Z轴坐标即可,后续目标程序使用导出的欧拉角旋转后可还原为原3D姿态。

修改后的完整脚本代码

bl_info = {
    "name": "Dave's Export",
    "author": "Dave",
    "version": (1, 2),
    "blender": (2, 83, 0),
    "location": "File > Export > Dave's Export",
    "warning": "",
    "description": "Export active mesh",
    "category": "Import-Export",
}

import bpy
import os

from bpy_extras.io_utils import ExportHelper

class DavesExport(bpy.types.Operator, ExportHelper):

    bl_idname = "export_scene.custom_export"
    bl_label = "Export"
    bl_options = {'PRESET', 'UNDO'}
    filename_ext = ".dave"

    def execute(self, context):

        filepath = self.filepath
        filepath = bpy.path.ensure_ext(filepath, self.filename_ext)

        out = open(filepath, "w")
        scene = bpy.data.scenes[0]

        for obj in scene.objects:

            if obj.type == 'MESH':

                # Note; obj is just a triangle.

                # Position
                out.write(str(obj.location.x) + ' ' + str(obj.location.y) + ' ' + str(obj.location.z))
                out.write('|')

                # Rotation
                out.write(str(obj.rotation_euler.x) + ' ' + str(obj.rotation_euler.y) + ' ' + str(obj.rotation_euler.z))
                out.write('|')

                # Vertices (x3, flattened to XY)
                # 新增:计算反向旋转矩阵,抵消对象自身旋转让三角面对齐XY平面
                inv_rot_matrix = obj.rotation_euler.to_matrix().inverted()
                for vertex in obj.data.vertices:
                    # 应用反向旋转得到扁平化坐标,丢弃Z轴
                    flat_vert = inv_rot_matrix @ vertex.co
                    out.write(str(flat_vert.x) + ' ' + str(flat_vert.y))
                    out.write('|')

                out.write('\n')

        out.close()

        return {'FINISHED'}

    def invoke(self, context, event):
        wm = context.window_manager
        wm.fileselect_add(self)
        return {'RUNNING_MODAL'}

def menu_button(self, context):
    self.layout.operator(DavesExport.bl_idname, text="Dave's Export")

def register():
    bpy.utils.register_class(DavesExport)
    bpy.types.TOPBAR_MT_file_export.append(menu_button)

def unregister():
    bpy.utils.unregister_class(DavesExport)
    bpy.types.TOPBAR_MT_file_export.remove(menu_button)

关键修改说明

  • 新增了反向旋转矩阵计算逻辑:通过obj.rotation_euler.to_matrix().inverted()得到旋转逆矩阵,抵消三角面当前的旋转量,使三角面完全对齐XY平面
  • 顶点处理逻辑修改:每个局部顶点坐标乘以逆矩阵后,仅导出XY轴数值,丢弃Z轴完成扁平化
  • 完全保留原有对象位置、欧拉角的导出逻辑,兼容后续目标程序的旋转还原需求

新手导出插件学习参考

本脚本结构非常适合作为Blender 2.9自定义导出插件的入门学习模板,包含了Blender插件开发的标准流程:

  • 标准的bl_info元数据声明,用于Blender识别插件信息
  • 继承ExportHelper工具类快速实现导出文件选择弹窗
  • 场景对象遍历、网格数据读取的基础API使用方法
  • 导出菜单注册、注销的标准写法
    逻辑简洁无多余依赖,新手可以直接基于该模板修改导出字段、导出格式,适配自身的需求。

内容的提问来源于stack exchange,提问作者whoshotdk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 14:54:03