如何在球体上投影 0 属网格模型?

计算科学 投影
2021-12-19 00:30:16

我有一个代表 0 属模型的网格。我的目标是构建从该网格到其边界球的同胚。

我试图理解http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.42.2762&rep=rep1&type=pdf中的一段:

[在球体上投影 0 类网格的算法,如下所述] 的基本思想是让对象向其凸包生长,然后将其直接投影到球体上。[...]

在我们的实现中,我们使用了这一原理的变体。我们首先计算给定模型的体素化。然后使用相应体积距离函数的梯度来引导给定网格的顶点朝向凸配置。这个过程可以被认为是某种“逆”变形表面技术。

这是它引用的文章的链接:http: //design.osu.edu/carlson/history/PDFs/shape-kent.pdf

有人可以解释一下吗:

  1. 如何计算给定模型的体素化?
  2. 什么是“对应体积距离函数”?
  3. 如何使用它的梯度来“将给定网格的顶点引导到凸配置”?

一旦我们有了“凸配置”,球体上的投影就很容易了。

欢迎任何开源实现。

1个回答

以下是对这三个问题的一些答案以及对球面参数化替代方法的参考:

1. 如何计算给定模型的体素化?

含义: 这意味着将您的表面嵌入到 3D 体素网格中,并确定哪些体素与表面的某些三角形相交。

如何做到这一点: 有几种方法可以做到这一点,最简单的一种是针对每个三角形,迭代三角形边界框内的体素,并测试每个体素是否与三角形相交。更复杂的实现可以使用 GPU,它非常适合这类事情 [1]。也可以使用 Bresenham 算法 [2] 的一些变体来“光栅化”3D 中的三角形。

2.计算距离函数

含义:从体素为空或与表面相交(在步骤 1 中获得)的体素网格开始,用其中心与表面之间的距离填充每个空体素。

如何做到这一点:有一种有效的算法(参见 [3] 中的调查),它通过对体积进行多次“扫描”来操作,它非常容易实现并且非常高效。

3. 使用梯度将网格的顶点引导为凸面配置 这意味着求解一个演化方程,将初始表面变形为凸面。演化方程在每一步都使用到初始表面的距离梯度。

球面参数化的替代 方法 您可以使用其他方法。在理论方面,[5] 中的方法很优雅(但可能难以实现)。如果您想要一种尽可能简单的方法,请将您的网格切成两半并使用平面 Tutte/Floater 参数化 [6] 对每一半进行参数化,然后将两半粘合。然后,您可以进一步优化映射以使两半之间的接缝消失。在我的石墨软件 [7] 中有这种方法的实现

参考:

[1] https://developer.nvidia.com/content/basics-gpu-voxelization

[2] https://stackoverflow.com/questions/21663613/triangle-rasterization-bresenhams-in-3d

[3] 3D 距离场:技术和应用调查,Jones 等人,IEEE Trans。在可见。和计算机图形学,2006

[4] math.nyu.edu/~bkleiner/mean_convex_flow.pdf

[5] 球面参数化基础,Gotsmann 等人,ACM Siggraph 2003

[6] 表面三角剖分的参数化和平滑逼近,Floater,1996

[7] Graphite 版本中球面参数化的实现。2. https://gforge.inria.fr/frs/download.php/file/33290/Graphite-2-a6.tar.bz2 , src/packages/OGF/parameterizer/algos/spherical_stretch_map_parameterizer.h,.cpp