【问题标题】:Filling enclosed space / air inside voxel models - any fast algorithms?填充体素模型内的封闭空间/空气 - 任何快速算法?
【发布时间】:2016-05-12 18:21:48
【问题描述】:

我已经为 .obj 模型创建了一个 Voxelizer,到目前为止运行良好。但是,它只会将模型的表面变成体素,并不会填充它。并且事后填充对于进一步的导出和优化非常重要。

我正在考虑填充空间的选项,但无法找到一种有效的算法来完成它。

这是“猫”内部的样子,再次导出为 .obj。

是否有任何快速算法来检测体素形状内的封闭空间?

我的体素正在使用任一存储

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


【解决方案1】:

这是迄今为止我想出的最佳方法: 1)它始于您只有一个体积的假设:没有单独的多边形网格。这很容易检查。如果不成立,则需要额外的步骤,但过程仍然相同。

2) 取网格中不属于壳体素的任何体素。光线追踪它到网格上最近的点,以确定它是内部还是外部体积的一部分。

3) 递归地向所有不在 shell 中的邻居泛滥,直到没有地方生长。发生这种情况时,您已经识别出网格的外部或内部(取决于您从哪里开始)。

4) 找到相反的体积是一个简单的减法运算:vol_2 = all_voxels - shell - vol_1。如果 vol_2 为空,则您的 shell 是打开的,并且洪水操作会渗透到间隙中。

【讨论】:

  • 或者实际上它可能是关闭的,如果体素足够大以至于壳的体素填满整个体积。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多