隐式曲面的参数化表示和隐式表示

从高屋建瓴的视角看,一个曲面(surface)的表达有两种方式:参数化表达和隐式表达。参数化表达(parametric representation)将二维参数域映射为三维的曲面 Ω→S,Ω⊂R2,S⊂R3 ,使用向量函数进行表达(vector-valued function,即函数的输出结果为一个向量,比如一个空间中的点坐标)。而隐式表达(implicit representation)则是通过量值函数(scalar-valued function,函数输出为一个标量)进行表达,隐式曲面被定义在该函数的零值面上: S={x∈R3|F(x)=0} 。

以曲线做类比,一个 单位圆既可以通过 参数化方式来表达: f:[0,2π]→R2,t↦(cos⁡t,sin⁡t) ,也可以通过 隐式方法进行表达: F:R2→R,(x,y)↦x2+y2−1 。

而对于更为复杂的曲面,我们一般难以用一个方程进行表达。这个时候可以对不同子区域(surface patch)用不同的方程进行分段表达。常见的分段曲面表达包括多边形网格(参数化)和体素(隐式)表达。

作为一个曲面表达,要能支持以下的操作:

  • Evaluation:其实就是可以能对曲面进行采样,从而获取到曲面上某一采样点的属性,比如position、normal等;
  • Query:能判别一个给定空间点在曲面的内部或外部以及计算该点到曲面的距离(vertex to surface distance);
  • Moification:该曲面是可修改或操控的;

下面介绍几种特定的参数化曲面表达:

1.3.1 样条曲面

张量积样条曲面(tensor-product spline surfaces),即NURBS(non-uniform rational basis spline)曲面(B样条曲线),一般用于CAD系统。样条(spline)是一条包含许多控制点和顶点的连续曲线。NURBS由有理多项式(rational polynomial)来表达曲线,non-uniform表示NURBS曲面可以由许多不同的多项表达式组成,

一个矩形片段的NURBS曲面f由两个锚向量(knot vectors) {u0,...,um+n},{v0,...,vk+n} 组成,由控制点c(3D)操纵,N(B-样条函数)决定:

f:[un,um]×[vn,vk]→R3(u,v)↦∑i=0m∑j=0kcijNin(u)Njn(v)

上面第一个公式没有太看懂,第二个大概是对采样通过控制点对B样条函数加权求和

该曲面被包裹在由控制点组成的凸包网格中,每个控制点的影响是局部的。样条曲面也是分段的,不同分段间有 Cn−1 的平滑度。B-样条曲面存在复杂度较高、难以操纵以及添加操纵点(细分)困难的问题。T-样条曲线是针对其弱点的一种改进方法。

1.3.2 细分曲面

细分曲面通过生成的方式不断细分控制网格,可达到一个特定的平滑度。相对样条曲面,细分曲面在拓扑形状上和几何约束上都更加自由。但是细分曲面要求其曲面具有一定的规则性,且容易丢失细节。

1.3.3 三角形网格

三角形网格是一组三角形的集合,共同组成了一个特定的结构。通过对顶点的重心组合(barycentric combination)p=αa+βb+γc来定义曲面,其中 α+β+γ=1,α,β,γ≥0 ,这是一个 R2↦R3 的线性映射。三角形网格中既包含几何结构(顶点位置)和拓扑结构(三角形网格结构)。三角形网格的拟合误差是 O(h2) 的,即当网格被细分时,其拟合误差被缩小为1/4,而三角形数F则增长为4F。当然,在实践中实际的策略时在平缓的面上使用更稀疏的采样,而在曲率变化更大的地方使用更高密度的采样。

如何判断一个三角形网格是否是一个二维流形(2-dimensional manifold)的判定是其是否含有非流形边或非流形顶点。一个非流形边(non-manifold edge)需要被包含在两个以上的三角形中,而一个非流形顶点(non-manifold vertex)则被包含在了超过一组扇形三角形中。对于非二维流形三角形网格,由于其不存在较好定义的邻域,因此往往难以进行处理。

欧拉公式给出了一个封闭相连的(closed,connected)三角形网格的顶点V,边E和三角形面F之间的数量关系:

V−E+F=2(1−g)

其中g称为示性数(genus),直观上可以表述为物体的“把手”的个数(如下图,其中球的g为0,环的g为1,而右边的形状的g为2)。而在实际计算中,我们取以下的约等于:

  • 三角形数约等于顶点数的两倍
  • 边数约等于顶点数的三倍
  • 顶点的平均度(valence)是6

以上的关系在对网格进行处理的时候非常有助于估计和优化处理速度以及数据结构。

1.4 隐式曲面表达

隐式曲面的基本思路是通过判别一个三维点位于曲面的内外从而定义曲面,往往被定义为一个量值函数 F:R3→R 的零值面。通常,负值被认为位于曲面的内部。只要函数F是连续的,隐式曲面僵尸连续且无洞的,且不会产生自交(self-occlusion)。

因此,隐式曲面在表达通过布尔操作合成的物体时具有相当的优势。隐式曲面在膨胀和腐蚀操作上也具有简便的特点(通过在F函数上局部增减)。

最为常用且自然的隐式曲面表达是符号距离场,即将每个三维点映射到一个有符号距离(signed distance),其绝对值表示该点到曲面的距离,符号表示点位于曲面的内/外。

隐式曲面的缺点是采样策略和渲染。

1.4.1 等距网格

最高效和普遍的隐式曲面的数据组织方式便是将距离函数的值离散地记录在预先划分好的等分的空间网格内(grid)。该方法在网格边长较小时往往会耗费极大的内存开销。

1.4.2 可适数据结构(adaptive data structure)

由于距离场中最重要的数据往往是曲面附近的采样点,因此,在网格的基础上仅对曲面附近的网格进行细分。该策略能将空间复杂度从立方降到平方。同时,对曲率较小的部分进行稀疏采样也是一种节省内存的方法:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值