三角网格曲面参数化

三角网格曲面参数化

本文介绍文章 Parametrization and smooth approximation of surface
triangulations
中的保形参数化算法,并给出MATLAB程序

曲面参数化问题:对于给定的三角网格曲面$\mathbf{S}$,找到一个映射$\phi(u,v): \mathbb{R}^2\longmapsto\mathbb{R}^3$,使得平面参数域中的点与曲面网格的点一一对应,求解参数$(u,v)$,即$\phi^{-1}$的过程称为参数化。


算法描述

  1. 对于三角网格曲面$\mathbf{S}​$的每个内部点$x_i​$,寻找1领域内的邻接点,将其记为$x_{j_1},x_{j_2},\dots,x_{j_m}​$,定义$x_i​$的子图的顶点集$X_i={x_i,x_{j_1},x_{j_2},\dots,x_{j_m}}​$表示,如上图左侧所示。

  2. 将步骤1中的$X_i​$通过某种方式投影到平面域$\mathbb{R}^2​$中,得到平面域中的图$P_i={p,p_1,p_2,\dots,p_m}​$。上图中间

    这里的投影方式有多种选择,文章提及到最小二乘面和平均法向面,但是当曲面中三角面片之间的夹角过大时,这两种方法不具有稳定性。于是介绍了一种W-W提出的测地极坐标映射的方法。

    $$
    r_k=\Vert p_k-p\Vert =\Vert x_{j_k}-x_i\Vert
    $$

$$
\theta_k = ang(p_k,p,p_{k+1})=2\pi \frac{ang(x_{j_k},x_i,x_{j_{k+1}})}{\sum_kang(x_{j_k},x_i,x_{k_{k+1}})}
$$
这里$ang(a,b,c)$表示向量$\vec {ba}$与向量$\vec {bc}$之间的角度。实际上上面第二个等式就是将空间角度等比例放缩到平面中,因为平面周角为$2\pi$,所以前面需要乘$2\pi$。定义$p=(0,0)$,$p_1=(\Vert x_{j_1}-x_i\Vert,0)$,这里$p$相当于极点,$pp_1$相当于极轴,根据极坐标$(r_k,\theta_k)$则可计算出每个$p_k$。则得到平面域中的多边形${p,p_1,p_2,\dots,p_m}$及其内部一点$p​$

  1. 计算$p​$关于该平面多边形的广义重心坐标。这里采用均值重心坐标[1]

    均值重心坐标的计算方式如下:

    c++实现均值重心坐标可参考我的另一篇文章:均值重心坐标Mean Value Coordinates In 2D代码实现

  2. 在第3步可计算出投影到平面域中的每个内部点关于1-ring点的广义重心坐标。

    记:$\lambda_i=[\dots,0,\dots,\lambda_{j_a},\dots,\lambda_{j_b},\dots,0,\dots]$,即只是$x_i$的邻接点对应序号中的元素为第三步计算出的重心坐标值,其余位置为0

  3. 固定边界点对应的参数(如参数化到矩形域,则将网格曲面上边界点参数有序定义为矩形域的边界)

    假定后$N​$个点为边界点,初始化${(u_i,v_i)}_{i=n+1}^N​$

  4. 记$\Lambda=[\lambda_1,\lambda_2,\dots,\lambda_n]^{\rm T}$,求稀疏解线性方程组:

MATLAB代码

下面代码仅使用与开网格

建议在桌面端浏览器或大屏移动端查看代码

  • 首先导入模型文件:

  • 计算边界点

  • 对非边界点循环 计算均值重心坐标

  • 筛选出有用的MVC

  • 初始化边界点的$(u,v)$参数

  • 构造最后一步中的稀疏线性系统

  • 可视化结果

将绿白相见棋盘格贴图到模型表面可以直观感受参数化的好坏

发表评论

邮箱地址不会被公开。 必填项已用*标注