有人可以推荐一种从三角形表示的 3D 实体创建点样本的算法吗?点样本应该几乎均匀地分布在表面上,并且应该保证没有给定半径的球适合通过点样本。
2 回答
如果您不需要最佳性能(或者您可以预先计算点)并且不想编写太多代码,您可以使用一些蒙特卡罗变体。
您可以从模型边界框内的许多随机点开始,或者按照球半径的密度组织成网格。
然后对于每一点:
- 找到最近的三角形和距离
- 如果它太远 - 丢弃它
- 如果不是 - 将其投影在三角形上
我知道它很重,但代码应该相对简单。
在第二个想法有另一种简单的方法:
- 对于每个三角形,计算其边的长度。
- 如果边缘太长 - 将三角形分割(分成 2 或 4 - 这取决于您的需要)。
- 将生成的分割顶点(顶点)添加到点列表中。
- 对生成的三角形执行相同的操作。
- 最后将您的网格顶点添加到列表中。
它不会为您提供理想的分布,但编写起来非常简单并且应该可以工作:)。
我所知道的最简单的方法是一个两阶段的过程。1) 将网格展开回二维表示,以及 2) 使用采样技术在表面上产生近似均匀分布的点。
如果您需要自己实现所有内容,那么展开过程很可能是最具挑战性的一步。blender和meshlab等工具包括执行此操作的工具,因为该问题与 3D 图形中 UV 纹理坐标的生成有关。我相信有许多算法和技术可以解决此类问题,但选择最好的可能需要反复试验,具体取决于三角形的退化程度。
生成的展开网格上点的均匀分布很容易 - 您可以使用低差异采样序列(例如 Halton 或 Hammersly 序列)在您的空间上产生几乎均匀的点分布,并使用拒绝采样来删除任何点不属于展开的网格。
您需要做一些额外的检查,以确保展开时网格的接缝保持适当的采样水平,以确保在重新折叠时满足您对最小球的要求。
根据过去的经验,这种方法的警告是,如果您的网格不是多方面的(即/它有裂缝、自相交或 t 形接头),您几乎肯定必须在开始之前清理这些。对于非常大的数据集,这可能非常耗时。