假设我有一个bpy.types.Object,其中包含一个bpy.types.Mesh数据字段;如何应用与对象关联的修改器之一,以获得可能包含在NEW bpy.types.object中的NEW bpy.types.Mesh,从而使原始场景不被覆盖?
我有兴趣在将顶点数据导出为自定义格式之前应用EdgeSplit修改器;我想这样做的原因是让Blender自动透明地复制两个方向非常不同的面共享的顶点。
我假设您使用的是2.6 API。
bpy.ops.object.modifier_apply (modifier='EdgeSplit')
将其"边分割"修改器应用于当前活动对象。请注意,它是对象.modifier_apply(…)
你可以使用
bpy.context.scene.objects.active = my_object
以设置活动对象。请注意,它是对象.
此外,请检查modifier_apply文档。很多事情你只能用bpy.ops.*.来做
编辑:刚刚看到您需要一个新的(可能是临时的)网格对象。只做
bpy.ops.object.duplicate()
设置活动对象后,新的活动对象将成为重复对象(它保留任何添加的修饰符;如果它是一个名为"Cube"的对象,它将复制它,使其处于活动状态,并将其命名为"Cube.001"),然后可以对其应用修饰符。希望这足够清楚:)
编辑:注意,bpy.ops.object.duplicate()使用的不是活动对象,而是选定的。为了确保选择并复制正确的对象,请执行此
bpy.ops.object.select_all(action = 'DESELECT')
object.select = True
还有另一种方法似乎更适合自定义导出器:对要导出的对象调用to_mesh
方法。它为您提供了应用了所有修改器的对象网格的副本。这样使用:
mesh = your_object.to_mesh(scene = bpy.context.scene, apply_modifiers = True, settings = 'PREVIEW')
然后使用返回的网格将所需的任何数据写入自定义格式。原始对象(包括其数据)将保持不变,并且在导出完成后可以丢弃返回的网格。
查看Blender Python API文档了解更多信息。
这种方法可能存在一个问题。如果您定义了多个修饰符,我不确定您是否可以使用它只应用一个特定的修饰符。它似乎应用了所有这些,所以在您的情况下可能没有用处。