在 3D 阵列中渲染可见体素,无需全部迭代

Render visible voxel in 3D array without iterate it all

我正在做一个体素引擎,我的数据在每个块的 3D 数组中。要渲染体素,我需要知道哪一个是可见的,所以它们周围会有 Air 块(在我的数据结构中为 0)。

所以我需要找到所有在左、右、前、后、上和机器人方向旁边有一个 0 的数字,但我真的不知道该怎么做。

我知道我可以用循环来完成,但我的目标是尽可能快地完成这个任务。

例如(二维):

[[0, 0, 0, 0, 0,],
 [0, 1, 1, 1, 0],
 [0, 1, 1, 1, 0],
 [0, 1, 1, 1, 1],
 [0, 1, 1, 1, 0]]

必须return我这些索引:

(1,1) (1,2) (1,3)
(2,1)       (2,3)
(3,1)             (3,4)
(4,1) (4,2) (4,3)

我想要数组边缘数字的索引,即使周围没有 0,因为如果有 Air 数据,我可以在块旁边签入。

我不知道这是否可能,如果不可能,我如何在不遍历所有数组的情况下渲染可见体素?

谢谢。

(对不起我的英语,如果你不明白,请发表评论)

编辑 看完@Mad_Physicist评论后,我post我用循环完成任务的不完整方法(我没有完成它,因为我正在寻找最快的方法):

matrix = numpy.zeros((10,10,10), dtype="uint8")

# Filling with some random data
for y in range(10):
    for z in range(10):
        for x in range(10):
            matrix[y, z, x] = random.choice((0,1,1)

result = numpy.transpose(numpy.where(matrix == 0))
for num in result.tolist():
    u = matrix.item(*num)
    # TODO: Check each direction

这种方法的弱点是我有时会通过无用的数据(所有方向的 0 和 0)。

您可以使用 scipy.ndimage.morphology.binary_erosion:

from scipy.ndimage.morphology import binary_erosion

np.argwhere(arr & ~binary_erosion(arr))

输出:

array([[1, 1],
       [1, 2],
       [1, 3],
       [2, 1],
       [2, 3],
       [3, 1],
       [3, 4],
       [4, 1],
       [4, 2],
       [4, 3]])