一些序言:
在最近关于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_select
eg以“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)
Numpy.logical_or.at
提出作为https://stackoverflow.com/a/30042202/5317130中概述的回答方法,但是
unique
在这种情况下不是必需的logical_or.at
将为至少选择了一个循环的任何顶点设置为真。与add.at
类似,使用logical_and.at
将需要为垂直选择选择所有循环相关问题 更多 >
编程相关推荐