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