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