从3d数组获取边界信息

时间:2010-11-10 14:59:55

标签: java 3d mesh edge-detection

嘿,我正在尝试从3d数组中提取信息,其中每个条目代表一个坐标,以便从中抽取一些东西。问题是数组非常大(并且有几个)意味着我实际上无法绘制所有数组。

我正在努力实现的目的只是绘制外部坐标的表示,如果你愿意,可以绘制数组的外壳。此数组未满,可以设置大的空白空间,只设置几个像素,或者将大型像素数据组合在一起。我不知道期望什么样的形状(可能是一个简单的立方体,或复杂的凹面网格),并且我正在努力想出一种算法来有效地提取边界。该数组有效地在3d空间中存储一组点。

我想到创建6个2d网格(3d数组的每一边一个),并获得每个位置可以找到的最浅点,然后逐个绘制它们。然而,正如我所说,这个3d形状可能是凹的,这会产生这种方法的问题。想象一下顶部有一个圆形的圆锥体(所述圆形比圆锥体的底部大)。虽然顶部和侧面网格将从形状中获得正确的深度信息,但底部网格将通过垂直线将底座连接到圆圈,使我有效地松散圆锥形状。

然后我想到逐片剖析数组,并从切片数据创建2个网格。我相信这应该适用于任何类型的形状,但我很难找到一个算法,准确地给我每个切片的边框信息。再一次,如果您只是尝试从切片创建高度贴图,如果它们有任何凹陷,您将遇到问题。我也使用某种边缘跟踪算法,但是数组不提供连续数据,并且几乎肯定没有沿着每个切片的连续边缘。

我试着研究体积渲染,就像医学成像中使用的一样,因为它处理类似的问题,但我找不到任何可以使用的东西。

如果有人对此类问题或任何有价值的意见有任何经验,请指点我正确的方向。

P.S。我宁愿得到一个封闭的shell表示,因此我早期的2d网格方法。然而,一种简单地给我壳点的方法,它们之间没有任何联系,这仍然是非常有用的。

谢谢你, 泽

3 个答案:

答案 0 :(得分:1)

我首先回顾一下你的数据结构。正如您所观察到的,数组不会在点之间保持任何明显的空间关系。对于您描述的数据,八叉树非常适合表示。根据您的点集的复杂性,您可以仅使用八叉树找到地壳 - 假设您在近点之间有一些连接。

或者,您可以转向更严格的算法,如光线投射或行进立方体。

答案 1 :(得分:1)

猜猜,到现在为止对你真正有用已经有点晚了,但是为了参考我会说这是体积建模的完美场景(正如你自己猜测的那样)。只要您知道点云的边界框,就可以将这些坐标映射到体素空间,并增加每个数据点的每个体素的密度(值)。完全定义完卷后,可以使用Marching cubes algorithm为给定的阈值(iso值)生成3D曲面网格。得到的表面不需要是连续的,而是将所有体素包裹在值>内部的等值。 2D等效物是heatmaps ...您可以通过调整等阈值(更高意味着更严格)和体素分辨率来改善表面质量。

由于您使用的是Java,因此您可能需要查看我的toxiclibs volumeutils库,该库还附带sevaral examples(适用于Processing),以显示常规方法。

答案 2 :(得分:0)

  

想象一下顶部有圆圈的圆锥体   (说圆圈大于圆锥体   基础)。而顶部和侧面网格   会得到正确的深度信息   形状,底部网格会   将基座连接到圆圈   垂直线条,让我有效   松散圆锥形状。

即使是像这样简单的例子也不可能手动重建,更不用说算法了。您的数据表示具有锥形孔的圆柱体的可能性与表示圆锥体的顶点的顶点相似。

  

我不知道是什么样的形状   期待(可能是一个简单的立方体......

同样,如果没有关于如何生成数据的进一步信息,以立方体形式排列的8个顶点也可以表示2个交叉正方形。如果您知道数据是由某种旋转的3D扫描仪生成的,那么这至少是一个开始。