您的位置:首页 > 其它

QSplat:基于多分辨率处理大规模网格的点绘制系统(部分翻译)

2006-07-24 12:49 417 查看
QSplat:基于多分辨率处理大规模网格的点绘制系统(部分)
来源:斯坦福大学计算机图形实验室
作者:Szymon Rusinkiewicz
Marc Levoy
卜道成
摘要:
随着3D扫描技术的发展,在实践中有着上亿数量级的网格的多边形都能被创造出来。传统的网格的显示,简化,渐进传输的算法已经不适合如此大规模的数据集。我们描述的这个系统将表示并逐步显示这些网格,它是基于边界球的多分辨率层次和基于点绘制系统的结合。一个专门的数据结构被用来做视域剔除,背面剔除,多细节层次选择以及绘制。这种表示方法不仅紧凑,而且能被快速的计算出来,这些使得它适合那些大规模的数据集。我们的执行程序,服务于大型的3D数字项目。不管物体的复杂程度还是摄影位置,我们的程序都能迅速启动,维护用户设置的交互式帧频,在模型移动中也能产生合理的图象质量并在机器空转时逐步求精达到一个高的最终的图象质量。我们已经论证了这个系统是可以扫描包含上亿数量级采样点的模型的。

范畴和课题描述:I.3.3 [Computer Graphics]:图片/图象的生成——显示算法;
I.3.5 [Computer Graphics]:计算几何和物体建模——曲线、面、体以及物体的表示方法;
I.3.6 [Computer Graphics]:方法论和技巧——图形的数据
结构和数据类型。

关键字:绘制系统,空间数据结构,多细节层次算法,压缩算法

1 绪论

在绘制过程中,计算机图形学方面一种新的意义重大的趋势已经朝使用样本来代表实际物体开始转变。这种趋势的一个实例已经成为生成实物三维样本模型的3D扫描系统的一个新增应用。但是对于3D扫描器来说,处理大量自身生成的数据仍然是一个问题。在过去的几年研究里,3D扫描系统在硬件和软件组件方面的改进在实践中增加了系统在扫描数量级达到几亿网格的样本的可行性。
目前的工作站还不能实时地显示这样数量级的网格,并且传统的网格的简化和渐进的显示算法在运行的时间和空间需求上使这些为了扫描包含超过几百万规模的网格样本的途径变得不切实际。此外,很多这样的技术都把精力集中在个别边和顶点的定位上,这样在每个顶点上要消耗相当大的精力。尽管如此,由于噪声的原因,仍然导致经过扫描的含有大量顶点和顶点位置的数据常常不精确。这就暗示了一种把个别点看成相对不重要的点和因此在每个原始点上花少点的精力这两者之间可供选择的方法。目前研究这个范例的包括Krishnamurthy和Levoy的Spline-fitting系统,Curless和Levoy的Range Image Merging系统以及Yemez和Schmitt的基于Octree Particles的绘制系统。这些算法都不能使得数据范围达到精确,并且事实上不能保护任何一个样本的原始网格的3D位置。
随着算法对每个原始点的低消耗这一趋势,我们已经开发出一种新的为了交互显示大规模网格算法。这个方法我们称之为:QSplat,并且在大型3D数字化项目课题中已经设计出来。因为它使用了简单的绘制算法,这种算法基于穿越边界球的层次结构。它在这个项目中适合浏览生成的模型,而这些模型都包含1亿到10亿的采样点。除此之外,QSplat不维护输入网格的连通性(这些连通性的数据在被扫描的数据中,他本身在对解决不连通性的深度有用,其他几乎没有什么意义),取而代之的是依赖基于点的表示法和Splat绘制法。结果,我们的系统在预处理和绘制的消耗方面比可比较的基于多边形的系统要低。QSplat启动迅速,可调整多细节层次去维护交互的帧频,以及在内存和磁盘使用方面有紧凑的表示方法。
在这篇论文中,我们呈现了QSplat的数据结构和绘制算法以及讨论了关于使它能在处理大规模网格上有实际使用价值方面的设计决定和一些权衡。我们描述了系统的绘制执行情况,并且讨论了它的预处理价值。最后,我们认为它关系到了先前显示大规模网格的算法,同时我们也描述了一些将来对于绘制其他种类大规模几何数据集的扩展。

2 QSplat的数据结构和算法

QSplat用边界球的层次结构作为可见性剔除技术,多细节层次的控制以及绘制。树中每个节点都包含球心位置和半径,法矢和法锥面的宽度,以及颜色(可选)。尽管对我们的程序来说,我们仅需要一种算法从三角网格中生成这种边界球的层次结构,但是QSplat还能从多边形、体素或者点云模型生成这样的层次结构。这种层次结构作为一种预处理被构造,并被写入到磁盘上。

2.1绘制算法

这种层次结构一旦被构造,下面的算法就可以用来显示:
TraverseHierarchy(node)
{
if (node not visible)
skip this branch of the tree
else if (node is a leaf node)
draw a splat
else if (benefit of recursing further is too low)
draw a splat
else
for each child in children(node)
TraverseHierarchy(child)
}
下面我们将对这个基本的算法的几种情况做详尽的讨论:

可见性剔除技术当我们在边界球的层次上做递归时,我们剔除那些不可见的节点。视域剔除是通过测试每个球体对着视域的位面完成的。如果球位于平截头体(视域平头四棱锥)的外面,那么它和它子树的节点都会被丢弃或者不做进一步的处理。如果球完全位于平截头体(视域平头四棱锥)的里面,这种情况下就要注意了,不用对节点的孩子节点试图做进一步的视域剔除。
我们在绘制的时候通过使用法矢和法锥面也可进行背面剔除。如果锥面完全背离视点,那么这些节点和它的子树节点都会被丢弃。我们也不难发现锥面完全指向视点,然后把组成这些面的节点的孩子节点不作为背面剔除的候选节点这一事实。

决定什么时候去做递归:启发式的使用QSplat去决定递归到什么程度是基于屏幕上的投影尺寸。也就是说,如果球投影到观察面上的区域超过一个极限时,就得对这个节点做细分。递归的中止为了维护用户选择的帧频,从而做从一帧到另一帧地调整。我们目前使用的是简单的反馈方案,这种方案通过实际的比率在先前帧的基础上渴望获得绘制时间来调整极限区域。Funkhouser和Séquin在多细节层次控制理论中已经证明了例似这样带有预测性的算法,这种算法使得帧到帧的绘制时间的变化变小。但是我们没有做到那种的程度,我们也没有象Hoppe的渐进网格系统中GeoMorphs算法那样加入任何做平滑转化的算法作为从一个多细节层次到另一个多细节层次的模型变化的片段。假如我们的程序在我们求精时对外观做适当改变和对典型观察点上做快速的变化的时,我们将不能发现缺乏滤波的真实的重要意义。但是其他应用程序,可能从这样的平滑转变中受益。
尽管屏幕区域对于多细节层次控制来说是最普遍的方案,但是其他具有启发性的方案已经被提出用来决定递归的程度。在我们的系统框架里,任何人都能整合出规则来对下面的情况做进一步的递归:轮廓线周围(通过使用每个节点的法矢),在高曲率的区域里(通过使用法锥面的宽度),屏中央凹型区域(这里只能通过映射位)。
上述帧频控制的执行在对模型进行交互操作期间被应用。一旦用户停止移动鼠标,我们就会通过使极限连续变小,一直小到和显示器一个像素点一样大小的时候来重绘场景。图一显示的一个样本就是通过QSplat在几个不同精练级别上绘制。


绘制Splats一旦延伸到了叶子节点或者决定中止递归,我们就绘制出一个Splat去表示当前的球。Splat的大小是基于当前球的投影的直径,它的颜色是基于当前每个球的法矢和颜色而从照明角度考虑获得的。Splats的绘制是通过激活分解遮挡的Z缓冲算法。我们将在3.3节中讨论每一个Splat的形状。

2.2预处理算法

我们的预处理算法是从用三角网格来表示被编码的模型开始的(下面的网格一般都指的是三角网格)。尽管每个人都能直接从点云模型建立一个QSplat的层次结构,但是直接从网格入手使计算每个节点的法矢变得容易。如果我们不使用网格的话,我们将不得不通过找每一个点周围小领域范围里的顶点组成的最小二乘面去计算法矢。从网格入手也使分配的球的大小到相应的输入顶点上(这些顶点在我们的边界球层次结构中可以变成叶节点),这样在绘制过程中使得点与点之间没有空洞。为了保证上述情形,如果每两个顶点由原始网格的一条边连接,则球的大小必须被选得足够大,使得每两个球在顶点的位置上能够接触到。我们目前的算法这是一个保守的算法——它导致了球过大,但是保证了不会留下任何空洞。
一旦分配了叶球尺寸,我们就用下面的算法去建立剩下的树:
BuildTree(vertices[begin..end])
{
if (begin == end)
return Sphere(vertices[begin])
else
midpoint = PartitionAlongLongestAxis(vertices[begin..end])
leftsubtree = BuildTree(vertices[begin..midpoint])
rightsubtree = BuildTree(vertices[midpoint+1..end])
return BoundingSphere(leftsubtree, rightsubtree)
}
算法通过沿着顶点的边界盒子的最长轴对顶点集的分离、两个子树的递归地计算以及两个子球的边界球的查找建立了剩下的树。当树被建立起来的时,在内部节点上的每个顶点的属性(如:法矢和颜色等)被设置成这些属性在子树中的平均值。在递归达到某一个顶点时,我们简单的去创建一个球,这个球的球心就在这个顶点的位置上。因为整个树的大小依赖每一个节点的分支因素,我们把这些节点都结合到树中去,使得树的平均分支大约有4个。这样将减少内部节点的数目,从而减少了树的存储量。预处理的最后一步就象3.1节描述的那样去量子化每个节点的属性。

3设计决定和权衡
现在让我们来考虑一些实施QSplat执行程序时做出的决定,使这些决定适合我们程序的可视化大型数据集扫描。我们描述了如何在量化、存储形式和描述Splat形状时权衡。Splatting的选择是受我们快速绘制和压缩表示法的影响。
3.1节点设计和量化
每个节点在边界球层次结构下的输出显示在图2c中。一个节点包含相对于它父节点的位置和球的尺寸、法矢、法锥面的宽度、颜色(可选)、用来存储表示树的数据结构的空间(比特表示)。我们在3.2节中讨论树的数据结构和存储节点的设计。


图二:QSplat文件和节点的设计。(a)树的存储方式是宽度优先(顺序由红线表示)。(b)父节点到孩子节点的连接是通过一个从一组父节点到第一个孩子节点的指针建立。如果所有的父节点的兄弟节点都是叶子节点那么这些指针都不出现。所有指针都是32位的(c)一个量化了的节点占据48个比特(不带颜色的只要32个比特)
球心位置和半径:每个球的球心位置和半径在边界球层次结构上相对于它们的父节点被编码。为了节约空间,这些度量的值定在了13比特。也就是说,球的半径数值范围相对与它父节点是1/13到13/13,球心相对于它父节点(每一个X,Y,Z)的中心的偏移量是它父节点直径的1/13的倍数。量化自顶向下进行,如此孩子节点球的位置和范围相对其父节点的量化的位置而被输入; 因而, 量化错误不向网格传播。为了保证量化过程不引起任何的空洞,量化的半径总是收敛于代表最近点的值以保证量化球非常接近真实球。
需要注意的是不是所有的13^4可能组合的中心偏移量和半径比是有效的,因为许多结果孩子节点的结果是不依附它父节点的。事实上,只有7621个可能的组合是有效的,这就意味着我们对球心位置和半径所使用的空间只能是13比特。假设父球的半径是1的话,这个编码的方案给出了对于孩子球的X、Y、Z的一个平均量化误差是0.04,对于孩子球半径而言有平均0.15的误差。半径误差远大于位置误差的原因是半径被球位置的量化误差首次增加(为了保证量化球能够接近实际球),于是半径总是收敛于代表最近点的值。我们只要不坚持量化球不完全接近原始球在半径方面就能够获得比较低的量化误差。但是要是这样的话,就会引起球不会向量化后那样紧密接触。这样做在绘制的时候会制造出空洞来
通过渐进式的编码来表示像球位置这样的几何量,因此实质上在层次结构的层次上按比特输出这些几何量。这种方案在网格压缩方面是违背传统方案的。传统方案依赖对于沿着一些路径和沿着网格边的顶点位置的不同的编码。实际上这种层次三角编码和Eck的多分辨率分析中小波表示几何体比较接近。我们每个节点只需要13比特空间的方案比stateof-the-art几何压缩方法更有竞争力,而后者是依靠最初量化的顶点位置使得每天顶点平均占用9-15个比特。然而这不是完全有效的比较,因为传统几何压缩方案同样也表示出了网格的连通性(这个方案我们已经抛弃),而且13比特存储一个节点还包括球的半径。
每个节点的位置和半径在绘制的时候被飞快得解码。由于这个原因,数据结构不但在磁盘上表现得紧凑,而且在绘制的时候比在绘制前解压数据的方案需要更少的内存空间。
法矢:每个节点的法矢存储时占用14比特。可表示的法矢对应的点在六面正方体上的52*52的格子上,并想样本的正规空间上较不一致的弯曲。在绘制时一种查找表被用来对可表示的法矢进行解码。在实践中我们仅仅使用52 * 52 * 6 = 16224不同的法矢去生成在背景灰暗部分不可见的产物,但是一些条带状的产物在低曲率的广阔区域里高强镜面周围是可见的。通过移动到每个法矢做相对父球的法矢渐进式的编码消除这些产物是有可能的,并达到比较好的压缩。但是这样会增加内部算法循环计算的复杂性,从而导致了空间和时间的一个权衡。不像节点位置的范围,法矢的空间是有界的,所以一个固定的量化表能满足任意场景下的法矢的编码。因此,在这样的情况下,我们选择了一个对法矢固定的量化,这种量化在运行时只需要一个查找表。当处理器的处理速度增加时,我们预测渐进量化方案将变得更加有前景。
颜色:颜色目前存储时占用16个比特。在做法矢运算的时候,颜色增加式的编码能够节约存储空间,但是在运行的时候耗费比较多的内存。
法锥面:经过实验后,我们决定给每个节点法锥面宽度仅2比特。四个有代表性的数值对应着面。在典型数据集上,使用量化的法锥面做背面剔除可以裁减掉超过90%的节点。这些节点通过准确的法锥面的宽度被剔除掉。值得注意的是我们总是保守地去表示法锥面的宽度,所以我们从不裁减本不该被裁减的几何元素。和法矢以及颜色一样,法锥面的宽度能相对于父节点的宽度而被表示,但是回减慢绘制速度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: