从多个索引返回到一

2024-04-25 05:00:06 发布

您现在位置:Python中文网/ 问答频道 /正文

一些序言:

enter image description here

在最近关于blender stackexchange的回答中,根据UV顶点的坐标选择了UV顶点

该图像显示了一个包含9个顶点和4个面的简单网格。网格“循环”是每个面的顶点。所以这个网格有16个循环。UV与回路相关联

import bpy
import numpy as np

ob = bpy.context.object
me = ob.data
uv_layer = me.uv_layers.active
# get uv values
uvs = np.empty((2 * len(me.loops), 1))
uv_layer.data.foreach_get("uv", uvs)
# select 
u, v = uvs.reshape((-1, 2)).T
uv_layer.data.foreach_set(
        "select",
         np.logical_and(
            (u >= 0) & (u <= 1),
            (v >= 0) & (v <= 1)
            )
        )

结束前序

例如,选定的uv坐标。(按循环顺序)

>>> uvlayer.data.foreach_get("select", uvselect)
>>> uvselect
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int32)

与循环关联的顶点索引。上面的中间顶点分为4次(每个面一次),4次有2个条目,4个外角有1个条目。(再次按循环顺序)

>>> me.loops.foreach_get("vertex_index", loop_vert_index)
>>> loop_vert_index
array([8, 6, 3, 7, 4, 8, 7, 2, 0, 5, 8, 4, 5, 1, 6, 8], dtype=int32)

9个顶点的当前选择

>>> me.vertices.foreach_get("select", vert_select)
>>> vert_select
array([0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)

问题是:如果选择了与顶点相关联的任何循环,我如何使用uv选择uvselect,用loop_vert_index映射来创建vert_selecteg以“numpy”方式选择中间顶点(索引8)(如果选择了回路0、5、10或15中的任何一个)

编辑

已经找到一种方法,使用Sum rows where value equal in column中概述的方法通过approach 2 of this answer获取,例如,如果选择了所有循环

vert_select = [1 1 1 1 2 2 2 2 4]

可用于选择网格顶点的。(如果选择了any循环,则相当于select vert)


Tags: layer网格datagetindexnpselectuv
1条回答
网友
1楼 · 发布于 2024-04-25 05:00:06

Numpy.logical_or.at

提出作为https://stackoverflow.com/a/30042202/5317130中概述的回答方法,但是unique在这种情况下不是必需的

logical_or.at将为至少选择了一个循环的任何顶点设置为真。与add.at类似,使用logical_and.at将需要为垂直选择选择所有循环

import numpy as np
import bpy

ob = bpy.context.object
me = ob.data

uvlayer = me.uv_layers.active
A = np.empty((2, len(me.loops)), dtype=np.int32)
me.loops.foreach_get("vertex_index", A[0])
uvlayer.data.foreach_get("select", A[1])

vert_sel = np.zeros(len(me.vertices), dtype=np.int32)

np.logical_or.at(vert_sel, *A)
print(vert_sel.T)
me.vertices.foreach_set("select", vert_sel)

相关问题 更多 >