我正在做一个体素引擎,我的数据每个块都放在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]]


必须给我这些索引:

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


我想获得数组边缘的数字索引,即使周围没有0,因为我可以在块旁边检查是否有Air数据。

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

谢谢。

(对不起,我的英语,如果您听不懂,请发送评论)

编辑
阅读@Mad_Physicist注释后,我发布了我的未完成方法来循环执行任务(我没有完成任务,因为我正在寻找最快的方法):

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]])

关于python - 渲染3D阵列中的可见体素而不进行全部迭代,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48334944/

10-12 02:59