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

dam*_*911 3 python blender

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

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

小智 9

我想你正在使用2.6 API.

bpy.ops.object.modifier_apply (modifier='EdgeSplit')
Run Code Online (Sandbox Code Playgroud)

...适用于当前活动对象的"边缘分割"修改器.请注意它的对象 .modifier_apply(...)

您可以使用

bpy.context.scene.objects.active = my_object
Run Code Online (Sandbox Code Playgroud)

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

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

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

bpy.ops.object.duplicate()
Run Code Online (Sandbox Code Playgroud)

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

编辑:注意,bpy.ops.object.duplicate()使用的不是活动对象,而是选中.要确保选择正确的对象并进行复制,请执行此操作

bpy.ops.object.select_all(action = 'DESELECT')
object.select = True
Run Code Online (Sandbox Code Playgroud)


ada*_*dam 9

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

mesh = your_object.to_mesh(scene = bpy.context.scene, apply_modifiers = True, settings = 'PREVIEW')
Run Code Online (Sandbox Code Playgroud)

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

有关详细信息,请查看Blender Python API文档.

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