这绝对是我写过的最蠢的代码……
这是一个3d模型的数据结构:
me.vertices: [v0, v1, ...]
me.edges: [e0, e1, ...]
e0.vertices: [i0, i1]
me.vertice[i0] == v0
v0.co: [x, y, z]
大致流程:
- 遍历所有边
- 获取边的两个顶点座标
想要的结果:
[
[0, 0, 0], // 边 1 的第一个顶点座标
[1, 1, 1], // 边 1 的第二个顶点座标
[1, 1, 1], // 边 2 的第一个顶点座标
[2, 2, 2], // 边 2 的第二个顶点座标
...
]
len_edges = len(me.edges)
verts = me.vertices
len_verts = len_edges * 2
vs = np.zeros((len_verts * 3, ), dtype=np.float32, )
for i in range(len_edges):
i0, i1 = me.edges[i].vertices
v0 = verts[i0].co
v1 = verts[i1].co
s = i * 6
vs[s] = v0[0]
vs[s + 1] = v0[1]
vs[s + 2] = v0[2]
vs[s + 3] = v1[0]
vs[s + 4] = v1[1]
vs[s + 5] = v1[2]
vs.shape = (-1, 3, )
以上代码功能正常,但太蠢了,目前api有一个语法糖:
collection.foreach_get(attr, some_seq)
# Python equivalent
for i in range(len(seq)):
some_seq[i] = getattr(collection[i], attr)
这么用就可以:
vs = np.zeros((len_verts * 3, ), dtype=np.float32, )
me.vertices.foreach_get('co', vs)
vs.shape = (-1, 3, )
但我想不到该怎么改……
感谢关注!