【发布时间】:2016-05-12 18:21:48
【问题描述】:
我已经为 .obj 模型创建了一个 Voxelizer,到目前为止运行良好。但是,它只会将模型的表面变成体素,并不会填充它。并且事后填充对于进一步的导出和优化非常重要。
我正在考虑填充空间的选项,但无法找到一种有效的算法来完成它。
是否有任何快速算法来检测体素形状内的封闭空间?
我的体素正在使用任一存储
List<Voxel> //Voxel contains 4 integers for x,y,z,rgb OR
Map<int[], java.awt.Color>.
我需要一种能够真正有效地与其中一个一起工作的算法。
【问题讨论】:
-
您如何看待近似算法?如果它是一个封闭的空间,它是否必须 100% 工作?如果没有,您可以在 6 个方向上发送光线,并且对于每条光线击中的每个体素,在每 5 个方向(减去到达的方向)上执行递归检查,等等。在递归 4 中执行此操作,没有不击中体素的光线并且您可以相当安全地假设它已关闭。
-
它必须绝对准确。我刚想到的可能是使用 boolean[x][y][z] 来表示空气。这实际上应该比使用集合或地图更快。问题是间接连接到边界框的每一点空气都是可见的。因此,如果我在边界框的某个点开始循环并扩展到体素周围的所有 6 个方向,您可以获得相当有效的结果。我仍然确信一定有更好的方法......
-
让体素化器也填充形状可能是最快和最简单的。我没有证据,但是图形光栅化器在光栅化时也会填充形状。它不会绘制笔画,然后在第二步中填充它。
-
我无法使用图形,因为它只会影响二维级别的模型。您必须在每个新的体素层之间进行额外的循环,以查看其下方的体素是否也被填充。
-
如果这是对我评论的回应:我没有说你应该使用图形。我只是想说,我有一种感觉,在构建体素模型时填充它(而不是之后填充它)可能是一种更好的方法。光栅化只是通过一个可能相关的问题来说明。
标签: java algorithm 3d modeling wavefront