2012-02-04 40 views
2

我真的想为Blender编写一个导出脚本,导出矢量动画(如md2),但我似乎无法抓住由骨骼修饰的垂直线......我编写了静态导出器,但获得了转换的顶点点是有点超越我...搅拌机的顶点动画出口商?

有没有一种方法可以轻松地抓住某些帧骨骼动画的顶点的位置?目前,我正在制作混合动画,将每个帧导出为* .obj,将每个帧导入新场景,并使用静态模型脚本导出每个新模型以导出新的矢量位置...必须有一个更容易(更快) 办法!

有谁知道任何教程或指出可能有帮助的任何命令/方法吗?

我真的不是很好用python,所以我目前的出口商有点写得不好......我希望在代码框中显示代码,但我不知道如何显示Python代码在这里的代码块......对不起。

回答

0

一,来源。它假定你的骨骼动画对象被称为“立方体”。

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'] 

我们检索动画的开始和结束帧;这两个值是显示在屏幕底部的值,默认为“Start:1”和“End: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) 

的调用更新似乎没有必要,但最好有它,因为它会迫使依赖于帧位置的所有更新(即,动画)。

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")