1

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

4

2 回答 2

1

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

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

然后对于每一点:

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

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


在第二个想法有另一种简单的方法:

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

它不会为您提供理想的分布,但编写起来非常简单并且应该可以工作:)。

于 2012-07-25T10:21:28.047 回答
0

我所知道的最简单的方法是一个两阶段的过程。1) 将网格展开回二维表示,以及 2) 使用采样技术在表面上产生近似均匀分布的点。

如果您需要自己实现所有内容,那么展开过程很可能是最具挑战性的一步。blendermeshlab等工具包括执行此操作的工具,因为该问题与 3D 图形中 UV 纹理坐标的生成有关。我相信有许多算法和技术可以解决此类问题,但选择最好的可能需要反复试验,具体取决于三角形的退化程度。

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

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

根据过去的经验,这种方法的警告是,如果您的网格不是多方面的(即/它有裂缝、自相交或 t 形接头),您几乎肯定必须在开始之前清理这些。对于非常大的数据集,这可能非常耗时。

于 2012-07-24T07:13:51.687 回答