我如何在 Blender 中为操作员访问由索引给出的多边形?

How can I in Blender acces a polygon, which is given by indices, for an operator?

Blender 2.77 我有一个多边形,引用为:

 bpy.data.objects['Cube.001'].data.polygons[0]

和一个操作员:

bpy.ops.transform.resize(value=(0, 0, 1), constraint_axis=(False, False, False),  constraint_orientation='GLOBAL', mirror=False, proportional='DISABLED',  proportional_edit_falloff='SMOOTH', proportional_size=1)

如何让运算符在多边形上执行? 我试过:

 bpy.data.objects['Cube.001'].data.polygons[0].select = True

选择它,但它似乎没有用。

看来您需要切换回对象模式才能执行...多边形[0]。select

# assume in EDIT... mode now
bpy.data.objects['Cube.001'].data.polygons[0]
bpy.ops.object.editmode_toggle()
bpy.data.objects['Cube.001'].data.polygons[0].select = True
bpy.ops.object.editmode_toggle()
bpy.ops.transform.resize(value=(0, 0, 1),
                     constraint_axis=(False, False, False),
                     constraint_orientation='GLOBAL',
                     mirror=False,
                     proportional='DISABLED',
                     proportional_edit_falloff='SMOOTH',
                     proportional_size=1)

虽然 blender 将网格数据存储在 object.data 内,但此数据仅在对象模式下有效,当您切换到编辑模式时,将创建网格数据的 bmesh 副本,它会替换 object.data 离开编辑模式时的内容。当您在编辑时使用重复网格时,您使用 python 对 object.data 所做的任何选择更改都不会影响编辑网格,并且在退出编辑模式时将被覆盖。

当您使用 bpy.ops.transform.resize() 它适用于活动项目,这意味着要调整多边形的大小,您需要处于编辑模式。在对象模式下,相同的运算符将调整对象的大小。

所以你可以使用

bpy.data.objects['Cube.001'].data.polygons[0].select = True
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.transform.resize(value=(0, 0, 1))
bpy.ops.object.mode_set(mode='OBJECT')

但使用 bmesh 是使用 python 编辑网格数据的首选方法。您可以找到使用 bmesh here and a more detailed example of editing the bmesh data here.

的示例

所以一个在 z 轴上缩放 face[0] 的简单示例是 -

import bpy
import bmesh

bm = bmesh.new()
bm.from_mesh(obj.data)

bm.faces.ensure_lookup_table()
bmesh.ops.scale(bm, verts=bm.faces[0].verts, vec=(0.0, 0.0, 1.0))

bm.to_mesh(obj.data)
bm.free()