BMesh 逆收缩代码对应解释

构建标量场函数为了演化(逆收缩)

[f_{i}(r)=left{egin{array}{c} left(1-left(frac{r}{R_{i}} ight)^{2} ight)^{2}, quad r leq R_{i} \ 0, quad r>R_{i} end{array} ight. ]

其中 r^2 就是球函数
(r^{2}=left(x-c_{x}^{i} ight)^{2}+left(y-c_{y}^{i} ight)^{2}+left(z-c_{z}^{i} ight)^{2})
(R_i=alpha r_i) 其中(r_i)是球i的半径((c_x^i, c_y^i, c_z^i))是球的中心坐标,(alpha)是1.5应该就是一个系数。
标量场定义为满足下面公式的东西。
(mathcal{I}(oldsymbol{x})=sum_{i=1}^{n} f_{i}-T=0)
其中(T)是门限参数,门限参数控制着演进网格多接近标量场。一个更大的T降维生成更瘦的结果。
初始的网格图2C,定义为要演化的网格。
具体而言点在表面移动的轨迹被认为时间t的函数x(t)

[frac{d oldsymbol{x}}{d t}=oldsymbol{n}(oldsymbol{x}, t) mathcal{F}(oldsymbol{x}, oldsymbol{n}, mathfrak{K}, mathcal{I}, cdots) ]

其中 (d oldsymbol{x} / d t) 认为是速率。(oldsymbol{n}=- abla mathcal{I} /| abla mathcal{I}|)
被认为是法向量,(mathcal{I}) 被认为是标量场。(mathcal{F}(oldsymbol{x}, oldsymbol{n}, mathfrak{K}, mathcal{I}, cdots)) 是一个带符号的标量函数(运动速度函数)依赖于标量的属性包括位置和法向量曲率和标量场等等。典型的S(0)是初始化网格。
运动速度函数(mathcal{F}) 被标量场和一个切线水平集决定。公式如下

[mathcal{F}(oldsymbol{x}, oldsymbol{n}, mathfrak{kappa}, mathcal{I}, cdots)=left(mathcal{I}(oldsymbol{x})-mathcal{I}_{ ext {target}} ight) f(mathfrak{kappa}) ]

这公式意味着顶点演化的更快如果它原理切线水平集。区域函数在这个公式中控制着演化速度对不同区域的自适应。
标量场靠近小球会比靠近打球更加密集。在当前的系统中。(f(kappa)=1/left(1+left|kappa_{1} ight|+left|kappa_{2} ight| ight))表现的很好(kappa_{1})(kappa_{2})是顶点 (x) 的主曲率。
一个顶点(oldsymbol{x}(t))在当前的网格面S(t)演进如下所示

[oldsymbol{x}(t+Delta t)=oldsymbol{x}(t)+oldsymbol{n}(oldsymbol{x}, t) mathcal{F}(oldsymbol{x}, cdots) Delta t ]

(Delta t) 是时间间隔防止出现震荡情况,我们限制的迭代的次数。公式从另一篇论文CFL中导出
同时我们限制(Delta t)的最小值

[Delta t leq frac{ ext {step}}{mathcal{F}_{max }(oldsymbol{x}(t), cdots)} ]

step 定义为
(step =min left{r_{i} ight} / 2^{k}) k是细分次数。最小的step定义为最小的球面半径

  double step = getMinRadius(root, root->getValue()->radius) / pow(2, subdivisionLevel);

网格演进终止与表面接近标量场。演化工程在接近表面的时候很快。

原文地址:https://www.cnblogs.com/eat-too-much/p/14208995.html