如何在Python中应用修饰符,创建一个新的网格?

时间:2012-07-24 14:55:57

标签: python blender

假设我有一个包含bpy.types.Mesh数据字段的bpy.types.Object;我如何应用与该对象关联的一个修饰符,以获得一个新的bpy.types.Mesh,可能包含在一个新的bpy.types.Object中,从而使原始场景保持不变?

我有兴趣在将顶点数据导出到自定义格式之前应用EdgeSplit修改器;我想要这样做的原因是让Blender自动并透明地复制两个面向不同方向共享的顶点。

2 个答案:

答案 0 :(得分:9)

还有另一种方法,它似乎更适合自定义导出程序:在要导出的对象上调用to_mesh方法。它为您提供了应用了所有修改器的对象网格的副本。像这样使用它:

mesh = your_object.to_mesh(scene = bpy.context.scene, apply_modifiers = True, settings = 'PREVIEW')

然后使用返回的网格将您需要的任何数据写入自定义格式。原始对象(包括它的数据)将保持不变,导出完成后可以丢弃返回的网格。

查看the Blender Python API Docs了解详情。

此方法存在一个可能的问题。如果您定义了多个修饰符,我不确定您是否可以仅使用它来应用一个特定修饰符。它似乎适用于所有这些,所以它可能对你的情况没用。

答案 1 :(得分:8)

我想你正在使用2.6 API。

bpy.ops.object.modifier_apply (modifier='EdgeSplit')

...适用于当前活动对象的Edge Split修改器。请注意,它是对象 .modifier_apply(...)

您可以使用

bpy.context.scene.objects.active = my_object

设置活动对象。请注意,它是对象 .active。

另外,请检查modifier_apply docs。很多东西你只能用bpy.ops。*。

编辑:刚看到你需要一个新的(可能是临时的)网格对象。只是做

bpy.ops.object.duplicate()

设置活动对象后,新活动对象变为副本(它保留任何添加的修饰符;如果它是名为'Cube'的对象,则复制它,使其处于活动状态并将其命名为'Cube.001' )然后您可以应用修改器。希望这很清楚:))

编辑:注意,bpy.ops.object.duplicate()不使用有效对象,但选择 。为了确保选择和复制正确的对象,请执行此操作

bpy.ops.object.select_all(action = 'DESELECT')
object.select = True