Blender 脚本:选定顶点的索引

10 投票
3 回答
19195 浏览
提问于 2025-04-17 19:11

问:在Blender 2.64中,我在编辑模式下有一些选中的顶点。我该如何在Python脚本中获取或生成这些选中顶点的索引列表?

我觉得Blender的Python API参考文档实在是让人摸不着头脑,而且谷歌搜索大多数指向的是过时的API。希望这对Blender脚本高手来说是个简单的问题。

这些索引应该和OBJ格式导出时的顶点索引一致。我想写一个脚本,把顶点索引导出到一个文本文件中,以便在C++程序中访问这些顶点。

3 个回答

6

根据@hochl和@DCS的建议,在编辑模式下,在Python控制台中运行以下代码:

import bmesh; [i.index for i in bmesh.from_edit_mesh(bpy.context.active_object.data).verts if i.select]

*使用的是Blender 2.70版本(2014年4月10日发布)

12

最后我在一个博客里找到了这个,内容简洁明了:

Verts = [i.index for i in bpy.context.active_object.data.vertices if i.select]

这确实和OBJ导出时的顶点顺序是一致的(Blender.2.64)。

13

你的代码只有在切换到对象模式后才能可靠地运行。原因是,在编辑模式下,网格数据和对象模式下的网格数据不同步。只有当你切换回对象模式时,这些数据才会同步。你可以通过以下步骤来验证这一点:先切换到编辑模式,选择一些顶点,然后执行你的代码。接着再选择不同的顶点(仍然在编辑模式下),再次运行你的脚本。你会发现,Python控制台中你选择的顶点列表并没有变化。这种情况是有说明的,并且也有文档记录。如果你想在编辑模式下获取选中的顶点,下面的代码可以作为一个初步的参考(在2.66.5 r56033版本中测试过):

import bpy
import bmesh

obj=bpy.context.object
if obj.mode == 'EDIT':
    bm=bmesh.from_edit_mesh(obj.data)
    for v in bm.verts:
        if v.select:
            print(v.co)
else:
    print("Object is not in edit mode.")

选择或取消选择节点,然后执行脚本,看看顶点是如何变化的。

撰写回答