8

问:在 Blender 2.64 中,我有一个处于编辑模式的网格,其中一些顶点被选中。如何获取或生成 Python 脚本中选定顶点的索引列表?

我发现 Blender Python API 参考非常难以导航,而且 Google 大多指向过时的 API。希望这对于 Blender 脚本专家来说是微不足道的。

索引应与网格的 OBJ 导出中的顶点索引一致。我想编写一个脚本来导出文本文件中的顶点索引,以便在 C++ 程序中访问这些顶点。

4

3 回答 3

12

只有在执行之前切换到对象模式,您的代码才能可靠地工作。原因是在编辑模式下,网格数据与对象模式下的网格不同步。这在您切换回对象模式时完成。您可以通过切换到编辑模式来验证这一点,从您的对象中选择一些顶点,执行您的代码,然后选择不同的顶点(仍处于编辑模式)并再次运行您的脚本。您会注意到 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.")

选择/取消选择节点并执行脚本以查看顶点更改。

于 2013-04-21T00:07:53.607 回答
7

终于在一个Blog中找到了,好看又紧凑:

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

它确实与 OBJ 导出 (Blender.2.64) 中的顶点排序一致。

于 2013-03-15T12:59:18.580 回答
5

基于 @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(2.70,2014 年 4 月 10 日)

于 2014-08-11T16:44:49.480 回答