以下是对这三个问题的一些答案以及对球面参数化替代方法的参考:
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