在3d形状上创建样本点

时间:2012-07-20 21:34:52

标签: 3d computational-geometry

有人可以推荐一种算法,用三角形表示的三维实体创建点样本吗?点样本应该几乎均匀地分布在表面上,并且应该保证没有任何给定半径的球适合通过点样本。

2 个答案:

答案 0 :(得分:1)

如果您不需要最佳性能(或者您可以预先计算点数)并且不想编写大量代码,则可以使用一些蒙特卡罗变体。

您可以从模型边界框内的许多随机点开始,或者组织成具有球半径密度的网格。

然后对每一点:

  • 找到最近的三角形和距离
  • 如果太过分了 - 丢弃它
  • 如果不是 - 将其投影在三角形上

我知道它很重,但代码应该相对简单。


第二个想法是另一个简单的方法:

  • 对于每个三角形计算其边缘的长度。
  • 如果边缘太长 - 将三角形分开(分为2或4 - 这取决于您的需要)。
  • 将得到的分割顶点(顶点)添加到点列表中。
  • 对生成的三角形执行相同操作。
  • 最后,将网格顶点添加到列表中。

它不会给你理想的发行版,但写起来很简单,应该可以工作:)。

答案 1 :(得分:0)

我所知道的最简单的方法是两个阶段的过程。 1)将网格展开为二维表示,2)使用采样技术,在表面上形成大致均匀分布的点。

如果您需要自己实施所有内容,那么展开过程很可能是最具挑战性的一步。像blendermeshlab这样的工具包括这样做的工具,因为问题与在3D图形中生成UV纹理坐标有关。我相信有很多算法和技术可以解决这些问题,但选择最佳可能是一个试错的情况,具体取决于你的三角形是如何退化的。

在合成的展开网格上点的均匀分布很容易 - 您可以使用low discrepancy sampling sequence(例如Halton或Hammersly序列)在您的空间上产生几乎均匀的点分布,并且拒绝采样删除任何不属于展开网格的点。

您需要做一些额外的检查,以确保展开时网格的接缝保持适当的采样水平,以确保在重新折叠时满足您对最小球的要求。

根据过去的经验,这种方法的警告是,如果你的网格不是多方面的(即它有裂缝,自交叉或丁字路口),你几乎肯定要在开始之前清理它们。对于非常大的数据集,这可能非常耗时。