Blender的顶点动画导出器?

3 投票
1 回答
2333 浏览
提问于 2025-04-17 12:18

我真的很想为Blender写一个导出脚本,用来导出像md2这样的矢量动画,但我似乎无法获取到被骨骼修改的顶点……我写过静态导出器,但获取变换后的顶点位置对我来说有点难。

有没有简单的方法可以在某些帧上抓取被骨骼动画影响的顶点位置?目前我在制作Blender动画,导出每一帧为*.obj,然后把每一帧导入到一个新场景中,再用我的静态模型脚本导出每个新模型,以获取新的矢量位置……肯定有更简单(更快)的方法!

有没有人知道相关的教程,或者能指出一些可能有帮助的命令/方法?

我对Python不是很在行,所以我现在的导出器写得有点糟糕……我本来想在代码框里展示代码,但我不知道怎么在这里显示Python代码……抱歉。

1 个回答

1

首先,源代码。它假设你要动画的物体叫做“Cube”。

import bpy

o = bpy.data.objects['Cube']

frame_start = bpy.context.scene.frame_start
frame_end = bpy.context.scene.frame_end

for i in range(frame_start, frame_end):
    bpy.context.scene.frame_set(i)
    bpy.context.scene.update()

    m = o.to_mesh(bpy.context.scene, True, 'PREVIEW')

    print("Frame %d:" % i)

    for v in m.vertices:
        print("    (%f %f %f)" % (v.co.x, v.co.y, v.co.z))

    print("\n")

接下来,我们逐行分析。我们首先导入Blender的Python模块。

import bpy

然后,我们获取想要导出的物体的顶点。

o = bpy.data.objects['Cube']

接着,我们获取动画的起始帧和结束帧;这两个值就是在屏幕底部显示的,默认是“开始:1”和“结束:250”。

frame_start = bpy.context.scene.frame_start
frame_end = bpy.context.scene.frame_end

然后,我们遍历从第一帧到最后一帧的每一帧。

for i in range(frame_start, frame_end):

我们设置当前帧;注意,表面上看起来等效的调用(*bpy.ops.anim.change_frame(frame = i)*)是会正常工作的。如果有人能解释一下原因,请随时分享 :-))。

    bpy.context.scene.frame_set(i)

调用update似乎不是必须的,但最好加上,因为它会强制更新所有依赖于帧位置的内容(也就是动画)。

    bpy.context.scene.update()

我们将物体转换为网格,并根据它们的预览设置应用所有修改器(包括骨架)。

    m = o.to_mesh(bpy.context.scene, True, 'PREVIEW')

我们打印当前帧的编号。

    print("Frame %d:" % i)

我们打印该帧的所有顶点,每行一个。

    for v in m.vertices:
        print("    (%f %f %f)" % (v.co.x, v.co.y, v.co.z))

我们用换行符分隔不同帧的顶点。

    print("\n")

撰写回答