2012-07-24 66 views
3

比方说,我有一个bpy.types.Object包含一个bpy.types.Mesh数据字段;我如何应用与对象关联的修饰符之一,以便获得一个新的bpy.types.Mesh,可能包含在一个新的bpy.types.Object中,从而使原始的场景不变?如何在Python中应用修饰符,创建一个新的网格?

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

回答

8

我想你使用的是2.6 API。

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

...适用于当前活动对象的“边缘分割”修改器。请注意,这是对象 .modifier_apply(...)

您可以使用

bpy.context.scene.objects.active = my_object 

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

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

编辑:刚看到你需要一个新的(大概是临时的)网格物体。只要做到

bpy.ops.object.duplicate() 

您设置的活动对象,然后将新的活动对象将成为重复的(它保留任何添加改性剂之后,如果它被命名为“魔方”的对象,它复制它,激活它和名称它'Cube.001'),然后你可以应用修改器。希望这是很清楚:)

编辑:注意,那bpy.ops.object.duplicate()使用不活跃对象,但选择。为了确保被选择并重复正确的对象做到这一点

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

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

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

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

查看the Blender Python API Docs了解更多信息。

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

+0

它并不完全适用于我的情况,但我可以修改我的代码以符合您描述的技术。主要问题是我不想应用“电枢”修改器,因为我正在导出Actions和FCurves。但是,我也在导出形状键,最近我了解到,由于它们不包含正常信息,因此基本上需要使用to_mesh。由于我在代码中的某处执行了armature.pose_position ='REST',也许我可以使用to_mesh并应用Armature修饰符,并确保结果正确。我会考虑这一点。谢谢 :-) – damix911 2013-02-09 23:58:08

相关问题