gpt4 book ai didi

python - 渲染 3D 数组中的可见体素,无需全部迭代

转载 作者:太空宇宙 更新时间:2023-11-03 14:13:35 31 4
gpt4 key购买 nike

我正在做一个体素引擎,我的数据位于每个 block 的 3D 数组中。为了渲染体素,我需要知道哪一个是可见的,因此它们周围会有 Air block (我的数据结构中为 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 数据,我就可以在 block 旁边检查。

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

谢谢。

(对不起,我的英语不好,如果您不明白,请发送评论)

编辑阅读@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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com