根据numpy中的顶点坐标选择网格的面
Selecting faces of a mesh based on vertices coordinates in numpy
我有两个 numpy 数组,一个用于网格的 3D 顶点,称为 vert
,一个用于三角形面,称为 faces
:
vert
数组是float
的N x 3
形状数组,因此有N个三维点。每个点的x
坐标可以有正值也可以有负值。
作为一个纯粹的例子,这可以是 vert
数组:
[[ 2.886495 24.886948 15.909558]
[ -13.916695 -58.985245 19.655312]
[ 40.415527 8.968353 8.515955]
...
[ 13.392465 -58.20602 18.752457]
[ -12.504704 -58.307934 18.912386]
[ 13.322185 -58.52817 19.165733]]
由于网格居中,网格的左部分是具有正x分量的部分,对应的顶点索引由np.where
i_vert_left = np.where(vert[:,0]>0)[0]
我现在想过滤掉那些由坐标完全在正 x
轴上的三角形组成的面。
但是我在正确执行此 indexing 操作时遇到问题。
我的第一次尝试是对面进行子集化,使它们对应的顶点具有 x>0
faces_left = np.asarray([f for f in faces if np.all(np.isin(i_vert_left,f)) ])
但是在大网格上操作非常慢。
我如何利用人脸的智能索引?
假设 faces
是一个 Nx3
整数数组,索引每个三角形的三个顶点,我认为你应该只需要:
# Check whether each vertex is left or not
vert_left_mask = vert[:, 0] > 0
# Check whether each face has all vertices on left or not
faces_left_mask = np.all(vert_left_mask[faces], axis=1)
# Select resulting left faces
faces_left = faces[faces_left_mask]
这里主要的"trick"在vert_left_mask[faces]
,它把每个整数的顶点编号替换成一个布尔值,表示该顶点是否左,所以很容易分辨出哪个面是完全左的np.all
.
我有两个 numpy 数组,一个用于网格的 3D 顶点,称为 vert
,一个用于三角形面,称为 faces
:
vert
数组是float
的N x 3
形状数组,因此有N个三维点。每个点的x
坐标可以有正值也可以有负值。
作为一个纯粹的例子,这可以是 vert
数组:
[[ 2.886495 24.886948 15.909558]
[ -13.916695 -58.985245 19.655312]
[ 40.415527 8.968353 8.515955]
...
[ 13.392465 -58.20602 18.752457]
[ -12.504704 -58.307934 18.912386]
[ 13.322185 -58.52817 19.165733]]
由于网格居中,网格的左部分是具有正x分量的部分,对应的顶点索引由np.where
i_vert_left = np.where(vert[:,0]>0)[0]
我现在想过滤掉那些由坐标完全在正 x
轴上的三角形组成的面。
但是我在正确执行此 indexing 操作时遇到问题。
我的第一次尝试是对面进行子集化,使它们对应的顶点具有 x>0
faces_left = np.asarray([f for f in faces if np.all(np.isin(i_vert_left,f)) ])
但是在大网格上操作非常慢。 我如何利用人脸的智能索引?
假设 faces
是一个 Nx3
整数数组,索引每个三角形的三个顶点,我认为你应该只需要:
# Check whether each vertex is left or not
vert_left_mask = vert[:, 0] > 0
# Check whether each face has all vertices on left or not
faces_left_mask = np.all(vert_left_mask[faces], axis=1)
# Select resulting left faces
faces_left = faces[faces_left_mask]
这里主要的"trick"在vert_left_mask[faces]
,它把每个整数的顶点编号替换成一个布尔值,表示该顶点是否左,所以很容易分辨出哪个面是完全左的np.all
.