vtk教程第九章 高级算法

46 篇文章 20 订阅
12 篇文章 15 订阅

我们再次回到可视化算法。本章描述的算法要么实现起来比较复杂,要么在3D可视化应用中应用较少。我们将算法分类为标量、向量、张量或建模算法。

9.1标量算法

正如我们所看到的,标量算法通常涉及通过查找表映射标量值,或者创建等高线或曲面。在本节中,我们将研究另一种轮廓算法,分割立方体,该算法使用密集点云生成轮廓曲面。我们也描述地毯情节。地毯图不是真正的3D可视化技术,但被广泛用于可视化许多类型的标量数据。最后,裁剪是与轮廓相关的另一个重要算法,其中单元格作为标量值的函数被切割成碎片。分割立方体是一种类似于移动立方体的轮廓算法[Cline88]。与移动立方体不同,分割立方体生成的点原语与三角形(3D)或线(2D)相比。如果轮廓表面上的点数量很大,轮廓表面的渲染外观看起来是“固体”。要实现这种坚固的外观,点的密度必须等于或更大

图9-1立方体分割算法概述轮廓通过的体素以小于屏幕分辨率被细分为亚体素。如果轮廓线穿过一个亚体素,则生成一个中心点。

比屏幕分辨率高。(此外,这些点必须使用表面渲染中使用的标准光照和阴影方程来渲染。)

分割立方体的动机是渲染点比渲染多边形快得多。这取决于渲染硬件/软件。特殊用途的硬件已经开发出来以高速渲染阴影点。在其他系统中,更多的注意力放在多边形渲染上,渲染速度的差异没有那么大。此外,某些几何操作(如裁剪和合并数据)是简单的点操作。与多边形相比较的操作实现起来要困难得多。

用密集的点云创建轮廓的一个缺点是表面的放大(例如通过相机缩放)揭示了表面的不连接性质。因此,必须构造最大变焦的点集,或者根据摄像机与轮廓线的相对关系动态构造点集。

虽然划分立方体最初是为体积数据集开发的,但通过在参数坐标中细分,可以使算法适应其他数据集类型。我们的演示假设我们正在处理卷。

立方体分割算法概述如图9 - 1所示。与其他轮廓算法一样,我们首先选择一个轮廓值。我们首先访问每个体素,并选择等值面所经过的那些体素。(当等高线值上下同时存在标量值时,等高线面通过体素。)我们还计算每个体素点的梯度,用于计算点法线。

图9-2递归分块算法。图的上半部分显示了算法的二维描述。下半部分是算法的三维描述。

选择等值面所经过的体素后,将体素细分为规则的亚体素网格。分割的数量由体素的宽度和屏幕分辨率r控制。屏幕分辨率定义为世界坐标中相邻像素之间的距离。我们可以表示沿坐标轴划分的个数

商数四舍五入到最接近的整数。子点上的标量值是使用体素的插值函数生成的(参见图8 - 10)。然后我们确定轮廓是否通过每个亚体素。如果是,我们只需在亚体素的中心生成一个点,并使用标准插值函数计算其法线。

该算法的一个有趣变体是图9 - 2所示的递归实现。我们不是直接(即程序地)将体素细分为规则网格,而是递归地划分体素(类似于八叉树分解)。体素被定期细分,创建8个亚体素和19个新点(12个中间点,6个中面点和1个中体素点)。新点上的标量值使用三线性插值函数从原始体素插值。如果等值面经过每个亚体素,这个过程就会重复。这个过程一直持续到亚体素的大小小于或等于屏幕分辨率。在这种情况下,在亚体素的中心生成一个点。所有这些点的集合构成分割立方体的等值面。

图9-3立方体等面线划分示例。左图由50,078个点组成,右图由2,506,989个点组成。

递归实现的优点是,细分过程在轮廓线无法通过的体素区域提前终止。另一方面,递归细分要求以2的幂进行体素细分。这可以产生比程序实现更多的点数。

图9 - 3显示了两个划分立方体等值面的例子。左边的等高线曲面由50078个点组成。因为这些点不是在显示分辨率下生成的,所以可以通过轮廓表面看到。右边的第二个等高线曲面由2,506,989个点组成。这些点是在显示分辨率下生成的,因此轮廓表面看起来坚实。

如图9 - 1和图9 - 2所示,分割立方体生成的点并不完全位于等高线面上。我们可以通过检查终端亚体素的大小来确定最大误差。假设一个终端亚体素是一个立方体,立方体的边长为l,则最大误差为立方体对角线长度的一半,或。

地毯的情节

常见的数据形式是带有相关标量数据的2D图像数据集。地毯图可以可视化这种形式的数据。地毯图是通过沿表面法线方向(或者可能是某个用户定义的方向)扭曲2D曲面来创建的。翘曲量由标量值控制,可能与比例因子结合使用。地毯图类似于矢量位移图(见第175页的“位移图”)。

尽管地毯图通常应用于图像数据,但它们也可以用于可视化由2D结构化网格或2D非结构化网格组成的数据集。在地毯图的基本形式中,只能用于可视化三个变量:两个表面位置坐标和一个标量值。然而,通过在表面上使用颜色映射引入另一个变量是很常见的。

图9-4地毯示意图(a)指数余弦函数的可视化。函数值由表面位移表示。颜色表示衍生值(expCos.cxx)。(b)结构网格中燃烧室流动能量的地毯图。颜色和平面位移表示能量值(warpComb。tcl)。

地毯图的应用如图9 - 4所示。图9 - 4 (a)显示了以原点为中心,点位于半径r的指数余弦函数

函数值用于扭曲表面,而函数导数用于着色。

图9 - 4 (b)显示了在结构化网格中可视化流动能量的地毯图。位移和颜色都用来表示能量值。虽然该图与图6 - 14 (b)相似,但有一些重要的区别。图6 - 14 (b)为矢量数据,图9 - 4 (b)为标量数据。图9 - 4 (b)在曲面法线方向(或者可能是用户定义的方向)上变形曲面。矢量数据(即矢量方向)控制图6 - 14 (b)中的变形方向。

使用标量场裁剪

裁剪是一种常见的图形操作,它限制多边形的范围,使其不位于视图挫折之外(参见43页的“摄像机”)。图9 - 5显示了用无限平面裁剪前后的三角形。剪辑操作将一个多边形转换为另一个多边形。剪辑也可以是一个强大的建模工具。剪切结构的一部分可以显示表面或包含在表面内的其他部分的内部细节。对象可以被分割成碎片,这些碎片可以被单独移动和控制。

我们可以使用166页“轮廓”中讨论的“行军”原语的变体,使用任意隐式函数进行剪辑。我们举例说明三角形的技巧。回忆一下,行进的三角形将三角形转换成近似于等值的标量值的线。这是通过每个顶点的内外关系来实现的

图9-5裁剪三角形得到一个多边形。暗线代表一个无限平面。

图9-6切割多边形会生成线段(裁剪平面。tcl)。

对于某个标量。出于我们的目的,我们使用一个标量值来表示三角形顶点到平面的有符号距离。这个无限平面,用一个隐式函数的形式来描述,将空间划分为两个无限的半空间。所有标量值为负的点都位于平面的一侧,所有标量值为正的点都位于平面的另一侧。图9 - 6显示了一个用三角形网格表示的有限平面。粗线表示无限平面,定义为F(x,y,z) = x + y + z - c = 0。第191页的“切割”中描述的切割算法使用特定于每个单元格原语的轮廓操作创建了一组线。在这个例子中,三角形的轮廓运算符提取了位于无限平面和组成有限平面的三角形交点上的直线。三角形的等高线操作采用图9 - 7所示的8种情况,对每个三角形进行适当的等高线或“切割”。

裁剪将多边形转换为多边形。我们使用修改过的case表对输出如图9 - 8所示多边形的三角形进行裁剪。在VTK中,每个多边形数据单元都有不同的case表来定义剪辑操作。将clip算法应用于图9 - 9中的多边形数据,使用平面方程生成的相同标量场生成一组新的三角形。

使用标量字段制定裁剪允许更复杂的操作。裁剪可以使用计算的标量数据,也可以使用多边形数据集点属性中的标量数据。

图9-7三角形切(修)线的8种情况。黑点表示“在”标量切割区域内的三角形顶点。实线显示切割操作的输出。

图9-8裁剪三角形的8种情况。黑点表示“在”标量裁剪区域内的三角形顶点。阴影区域显示剪辑操作的输出。

图9-9用平面函数(clipPlane. zip)裁剪三角形的平面。tcl)。

图9 - 10所示的扫描图像首先被转换为一个四边形网格,顶点标量值设置为扫描图像的强度。剪切这个四边形网格的值等于

扫描图像最大强度的1/2产生如图9 - 10所示的多边形模型。

图9-10扫描图像用其最大强度的1/2的标量值剪辑会产生四边形和三角形的混合物(createBFont. x)。tcl)。

9.2矢量算法

在第6章中,我们展示了如何创建简单的矢量符号,以及如何通过矢量场集成粒子来创建流线。在本节中,我们将扩展这些概念来创建流带和流多边形。此外,我们还介绍了向量场拓扑的概念,并展示了如何使用拓扑结构来表征向量场。

流线描述

流线描述了矢量场中的粒子路径。通过给这些线着色,或创建局部符号(如虚线或定向锥),我们可以表示额外的标量和时间信息。然而,这些技术只能传达关于向量场的基本信息。局部信息(例如,流动旋转或导数)和全局信息(例如,场的结构,如涡管)没有表示。streamribbon和streamsurfaces是两种用于表示本地和全局信息的技术。

流线型技术的自然延伸扩大了线条以创建带状。带状可以通过生成两条相邻的流线,然后用多边形网格连接这些线来构造。只要流线彼此相对接近,这种技术就能很好地工作。如果发生分离,流线会发散,生成的色带将不能准确地表示流,因为我们期望色带的表面处处与向量场相切(即流线的定义)。连接两条相距很远的流线的直纹面通常不能满足这一要求。

流带提供了重要的流动参数信息:矢量涡度和流动散度。涡度是矢量场旋转的度量,表示为矢量量:方向(旋转轴)和幅度(旋转量)。流向涡度剪辑图9-10扫描图像用其最大强度的1/2的标量值剪辑会产生四边形和三角形的混合物(createBFont。tcl)。w w是沿瞬时速度矢量的投影。换句话说,流向涡量是矢量场围绕流线的旋转,定义如下。

流带的扭曲量近似于流向涡度。流动散度是衡量流动“扩散”的指标。流带宽度的变化与流动的横流发散成正比。

流曲面是通过基准曲线的无数条流线的集合。基本曲线(或rake)定义了流线的起点。如果基曲线是闭合的(例如,一个圆),曲面是闭合的,就会产生流管。因此,流带是与长度相比宽度较窄的流表面的特殊类型。

与矢量图标或流线相比,流面提供了关于矢量场结构的额外信息。流面上的任何一点都与速度矢量相切。因此,以流体流动为例,没有流体可以通过表面。流管是恒定质量通量的代表。流曲面比流线或矢量符号更好地显示矢量场结构,因为它们不需要在图标之间进行视觉插值。

流面可以通过从用户指定的rake生成一组流线来计算。然后通过连接相邻流线来构造多边形网格。这种方法的一个困难是局部矢量场发散会导致流线分离。分离会给表面带来很大的误差,或者可能导致自交,这在物理上是不可能的。

Hultquist [Hultquist92]采用了另一种计算流曲面的方法。流面是沿其边缘连接的流带的集合。在这种方法中,流线的计算和流面的平铺是同时进行的。这允许在流分离或收敛时添加或删除流线。平铺也可以控制,以防止产生长而细的三角形。如果流动的散度过大,表面也可能被“撕裂”,即条带分离。

流多边形

到目前为止所描述的技术提供了矢量场量的近似测量,如顺流涡度和发散度。然而,向量场包含的信息比这些技术所能传达的要多。因此,人们设计了其他技术来可视化这些信息。其中一种技术就是流多边形[Schroeder91],它是许多高级矢量和张量可视化方法的基础。流多边形用于可视化应变、位移和旋转的局部属性。我们从描述矢量场对局部应变状态的影响开始。非均匀矢量场在其发生区域引起局部变形。如果矢量场是流体或固体等物理介质中的位移,则变形由局部应变(即局部变形)和刚体运动组成。为了在数学上描述变形,我们在指定的点上检查一个三维矢量。利用一阶泰勒级数展开约,我们可以将局部变形表示为w vw v × w vw= ------------- vuvw= (),, xxyz= (),, x eij

其中是局部应变,是局部旋转。注意,这些变量表示为

张量。(将此方程与图6 - 20中给出的方程进行比较。注意,这个方程和下面的方程9-5的非对角线项相差1/2。这是因为

图6 - 20表示用于弹性研究的工程剪切应变。

公式9-5表示一个张量,在数学上是一致的。)

局部应变表示为处偏导数的组合,如下所示。

对角线上的项是应变的法向分量。非对角线项是剪切应变。局部刚体旋转由

式9-6也可以用张量符号表示为

其中为上一节中提到的涡度向量。涡度,即局部刚体旋转

对于不熟悉张量表示法的读者来说,这个演示肯定不够完整。

但是,将公式9-5和公式9-6中的矩阵直接转化为视觉形式

图9-11矢量场局部变形分量图虚线表示最初未变形的物体。

将有助于澄清这里提出的概念。从图9 - 11可以看出,法向应变、剪切应变和刚体运动产生明显的变形模式。这些模态结合在一起产生总变形。法向应变的模态引起垂直于表面方向上的压缩或扩展,而剪切应变引起角度变形。这些应变与刚体绕轴旋转结合,在某一点产生总应变。

流多边形技术的本质就是表现这些变形模式。将一个正n边多边形(如图9 - 12所示)置于矢量场的指定位置,然后根据局部应变进行变形。应变的分量可以单独显示,也可以组合显示。这个多边形法线的方向是任意的。但是,将法线与局部向量对齐是很方便的。此时刚体绕该矢量的旋转为流向涡量,法向应变和剪切应变的作用均在垂直于流过该点的流线的平面内。

流多边形提供了其他有趣的可能性。流多边形可以沿着轨迹扫过,通常是流线,以生成管。管的半径r可以根据某个标量函数进行修正。其中一个应用是可视化流体流动。在无剪切的不可压缩流体中,管的半径可以根据标量函数矢量大小而变化。然后方程

表示恒定质量流量的面积。因此,管子会随着流速的减慢而变厚,随着流速的增加而变窄。管子的n个边都可以用不同的标量函数着色,尽管为了视觉清晰度,最多应该使用一个或两个函数。

图9-12流多边形(a)平面视图。(b)与矢量对齐。(c)沿流线排列。(d)扫多边形形成管(officeTube.tcl)。

由streampolygon生成的streamtubes和我们在前一节中描述的streamtubes是不一样的。流多边形不一定沿着流线。如果是,则流多边形表示某一点上的信息,而流管是由多条流线构造的近似值。此外,由流多边形扫描构造的管道中的径向变化并不一定与质量流有关,因为流多边形的半径可以绑定到任意标量变量。

向量场拓扑

向量场具有复杂的结构,其特征是被称为临界点的特殊特征[Globus91] [Helman91]。临界点是矢量场中局部矢量大小为零和矢量方向未定义的位置。在这些点上,向量场要么收敛要么发散,并且/或者在点周围发生局部循环。

临界点位于数据集单元格中,其中向量场的u、v和w分量都经过零。这些点的定位使用迭代搜索程序,如双截面技术。每次迭代计算单元插值函数,直到找到零向量。一旦找到临界点,它的局部行为就由偏导数矩阵决定。这是因为在临界点时速度为零,而向量场可以用偏导数的一阶展开来近似[Helman91]。

偏导矩阵可以用向量符号表示为

也就是雅可比矩阵。的特征值表征了向量场在临界点附近的行为。特征值由虚分量和实分量组成。虚部描述了向量场围绕临界点的旋转,实部描述了向量场对临界点的相对吸引或排斥。二维的临界点如图9 - 13所示。

许多可视化技术已经发展到从分析关键点来构造矢量场拓扑。这些技术提供了对场的全局理解,包括附着点和分离点以及场涡。使用流体流动类比,附着点和分离点发生在物体表面,其中向量场的切向分量趋于零,流动垂直于表面。因此,流线将在这些点开始或结束。漩涡没有共同的定义,但一般来说,漩涡是相对集中的涡度区域(例如,流动旋转)。涡的研究很重要,因为它们代表能量损失的区域,或者对下游流动条件有重大影响(例如,大型飞机后面的拖尾涡)。

一种有用的可视化技术创建向量场骨架,将向量场划分为单独的区域。在每个区域内,矢量场在拓扑上等价于均匀流。这些骨架是通过定位临界点,然后用流线连接临界点来创建的。在三维矢量场分析中,该技术可应用于物体表面的流动分离、附着线及其他重要流动特征的定位。此外,在一般的三维流动中,均匀流动的区域是由表面分开的,三维流动骨架的创建是当前的研究课题。

涡流可视化是目前研究的另一个领域。一种技术是计算螺旋密度

图9-13二维临界点图特征值的实部(R1

R2

)矩阵的一阶导数控制向量场的吸引或排斥。

特征值的虚部(I1

, I2

)控制旋转。

这是一个标量函数的向量点积之间的涡度和局部向量。较大的正值为右旋,较大的负值为左旋。螺旋密度可以很方便地用等值面来表示,它可以指示旋涡的位置和结构。

9.3张量算法

在第六章中,我们看到实对称张量可以用张量的特征值和特征向量来刻画。回想一下,我们可以把系统的特征向量表示为

图9-14创建超流线。一个椭圆沿着特征场的流线被扫过。

椭圆的长/小轴由另外两个特征向量控制。

其中是特征值方向上的单位向量,和是特征值。因此,我们可以将一个实对称张量场分解为三个向量场,每个场由公式9-13中描述的三个特征向量之一定义。我们称这些向量场为特征场,因为它们是从张量场的特征向量导出的。

以这种方式分解张量场为可视化真实对称张量提供了额外的见解。我们可以直接使用前面介绍的向量场可视化技术或使用它们的变体。其中一种技术是流多边形技术的新扩展,

超流线方法。

超流线是通过三个特征场之一创建一个流线,然后沿着流线扫一个几何原语来构造的[Delmarcelle93]。通常,一个椭圆被用作几何原语,其中剩下的两个特征向量定义了椭圆的长轴和小轴(图9 - 14)。沿特征场流线扫掠椭圆得到管状形状。另一个有用的生成几何原语是十字。十字臂的长度和方向由两个特征向量控制。扫过十字会导致一个螺旋形状,因为特征向量(因此交叉臂)会在一些张量场中旋转。

超流线示例如图9 - 15所示。数据来自于应用于半无限域的点负载。将此图与使用张量椭球来可视化相同数据的图6 - 22进行比较。注意,从超流线可视化中可以获得更少的混乱和更多的信息。

9.4建模算法

可视化几何

可视化最常见的应用之一是查看几何图形。我们可能有一个部件或复杂组件的几何表示(可能是在CAD系统上设计的),并希望在制造之前查看该部件或组件。而观看几何更好地解决在

图9-15超流线示例

(超。tcl)。所示的四条超流线沿小主应力轴积分。还显示了一个平面(用不同的查找表着色)。

关于计算机图形学的文本,通常有数据集结构我们希望以同样的方式查看。例如,我们可能想要查看数据集特定部分上的数据映射,或者查看数据集本身的结构(例如,查看有限元网格)。

三维数据集有表面和内部。通常,我们希望可视化数据集的表面或内部的一部分。(注:体绘制是另一回事——参见218页的“体绘制”。)为了可视化数据集,我们必须提取数据集拓扑/几何(以及相关数据)的一部分作为某种形式的表面原语,如多边形。如果数据集的表面是不透明的,我们可能还希望消除遮挡的内部细节。

我们已经看到结构化数据集,例如图像数据或结构化网格,如何拥有一个自然的i-j-k坐标系统,允许从数据集内部提取点、线和面(请参阅第269页的“结构化坐标系统”)。例如,要从结构化的维度网格中提取第五个iplane,我们使用(假设零偏移寻址)指定数据范围。

更一般地,我们可以从数据集中提取边界边和面。边界边是一维单元格类型(例如,直线或折线),或仅由该单个单元格使用的2D单元格的边缘。类似地,边界面是2D单元格类型(例如,多边形,三角形条)或仅由该单个单元格使用的3D单元格的面(图9 - 16)。我们可以使用前一章的拓扑算子来获得这些信息。二维或更小维度的单元被提取,而边界边和面是通过计算特定拓扑边界(即边缘或面邻居)的单元邻居数来确定的。如果没有邻居,则该边或面为边界边或面,并被提取。

使用这些技术,我们可以查看数据集的结构。然而,也有一些情况,我们希望在数据选择方面有更多的控制。我们称之为数据提取。

数据提取

通常我们希望从数据集中提取部分数据。这可能是因为我们想要减少数据的大小,或者因为我们只对数据的一部分感兴趣。

图9-17子采样数据(a)结构化数据可以通过选择每n个点进行下采样。(b)非结构化数据的次采样需要局部重新整理。

减少数据集大小是一个重要的实际能力,因为可视化数据的大小可能非常大。通过减少数据大小,可以实现计算和内存需求的减少。这将导致更好的交互响应。

我们还可能需要减少数据的大小,以便可视化大型数据集的重要特征。这可以用来减少图像杂波和提高可视化的有效性。较小的数据大小也使可视化用户能够相对于较大的数据集更快地浏览和检查数据。接下来,我们将介绍两种提取数据的技术。一种是基于几何提取,另一种是基于数据阈值分割,即阈值分割。

几何提取。几何提取是基于几何或拓扑特征来选择数据。常用的提取技术选择位于指定id范围内的一组点和单元格。一个典型的例子是选择id在0-100之间的所有单元格,或者选择id在250-500之间的所有单元格。有限元分析人员经常使用这种方法将可视化隔离到几个关键区域。

另一种有用的技术称为空间提取,它选择位于空间指定区域内的数据集结构和相关数据属性。例如,点和半径可用于选择(或取消选择)封闭球体内的数据。隐式函数是描述这些区域特别有用的工具。评价为负的点在区域内,而区域外的点评价为正;因此,所有点都为正的单元格在区域外,所有点都为负的单元格在区域内。图9-16边界边和面。图9-17子采样数据(a)结构化数据可以通过选择每n个点进行下采样。(b)非结构化数据的次采样需要局部重新整理。(a)结构化数据的子抽样(b)非结构化数据的子抽样336高级算法

子抽样(图9 - 17)是一种通过选择原始数据的一个子集来减少数据大小的方法。子集是通过选择参数n来指定的,指定每抽取第n个数据点。例如,在图像数据和结构化网格等结构化数据集中,每选择第n个点会产生如图9 - 17 (a)所示的结果。

子采样会修改数据集的拓扑结构。如果没有选择点或单元格,就会留下一个拓扑“洞”。必须修改数据集拓扑结构以填充漏洞。在结构化数据中,这只是跨结构化i-j-k坐标的统一选择。在非结构化数据(图9 - 17 (b))中,必须使用三角剖分或其他复杂的镶嵌方案来填充洞。由于非结构化数据固有的复杂性,子抽样通常不用于非结构化数据。

一个相关的技术是数据屏蔽。在数据屏蔽中,我们选择每n个至少在数据集中留下一个或多个拓扑“洞”的单元格。屏蔽还可能改变数据集的拓扑结构,因为结构化数据集中的单元格的部分选择只能使用非结构化网格表示。屏蔽通常用于提高交互性能或快速处理部分数据。

阈值。阈值提取基于属性值的数据集数据的部分。例如,我们可以选择标量值在(0,1)之间的点的所有单元格,或者速度大小大于1.0的所有点。

标量阈值很容易实现。阈值可以是标量值大于或小于的单个值,也可以是值的范围。可以提取关联标量值满足阈值条件的单元格或点。通过将类型转换为单个标量值,可以以类似的方式提取其他数据集属性类型,如向量、法线或张量。例如,向量可以用矢量大小提取,张量可以用矩阵确定。

几何提取和阈值分割的一个问题是,迄今为止提出的方法提取的是“原子”数据块,即一个完整的单元。有时细胞可能会越过阈值的边界。在这种情况下,单元格必须被剪切(参见第323页的“用标量字段剪切”),并且只提取单元格的一部分。

探测

探测通过使用一组点(探测)对一个数据集(输入)进行采样来获得数据集属性,如图9 - 18 (a)所示。探测也称为“重新采样”。例如,使用沿直线、平面或体积的点序列探测输入数据集。探测的结果是一个新的数据集(输出),其中包含探测数据集的拓扑和几何结构,以及从输入数据集插值的点属性。探测操作完成后,可以使用本文中描述的任何适当技术对输出数据集进行可视化。

具体探测过程如图9 - 18 (b)所示。对于探测数据集中的每个点,确定输入数据集中的位置(即单元格、子单元格和参数坐标)和插值权值。然后将来自单元格的数据值内插到探针

图9-18探测数据一个数据集(探针)的几何形状用于从另一个数据集(输入)提取数据集属性

图9-19在燃烧室中探测数据

探针是50个2的正则数组

点,然后通过轮廓过滤器

(probeComb。tcl)。

点。在输入数据集之外的探测点被赋值为nil(或适当的)。这个过程对探测数据集中的所有点重复。

探测可用于减少数据或以特定方式查看数据。

•当探测操作被限制在输入数据集的子区域,或者探测点的数量小于输入点的数量时,数据会减少。

•通过对特定选择的数据集进行采样,可以以特定的方式查看数据。使用由一条线组成的探测数据集可以沿一条线绘制x-y坐标,或者使用平面可以进行表面颜色映射或线条轮廓绘制。

探测必须小心使用,否则可能会产生错误。区域内采样不足的数据可能会错过重要的高频信息或局部数据变化。过度采样数据虽然不会产生错误,但会对数据的准确性产生错误的信心。因此,采样频率应该与输入数据集具有相似的密度,或者如果密度更高,则应该根据原始数据频率仔细注释可视化。

探测的一个重要应用是将不规则或非结构化数据转换为结构化形式,使用适当分辨率的体积作为探测来对非结构化数据进行采样。如果我们使用体绘制或其他体可视化技术来查看数据,这是非常有用的。

图9-20创建三角形条带

图9 - 19以三个探针为例。在结构化网格中探测样品流密度。探针的输出通过轮廓滤波器来生成轮廓线。如图所示,我们可以选择性地选择探针的位置和范围,使我们能够专注于数据中的重要区域。

三角形条生成

三角形带是三角形多边形的紧凑表示,如第127页的“三角形带”所述。许多渲染库包括三角形条作为图形原语,因为它们是通用多边形渲染的高性能替代品。

可视化和图形数据通常用三角形表示。例如,移动的立方体会生成成千上万甚至可能是数百万个三角形来表示等值面。为了在可视化中获得更好的性能,我们可以将三角形多边形转换为三角形条。或者,如果数据是用多边形表示的,我们可以先对多边形进行三角剖分,然后创建三角形带。生成三角形条带的

一个简单方法是贪婪地将三角形聚集成一个条带(图9 - 20)。方法如下。找到一个“未标记”的三角形来初始化条带-未标记的三角形是尚未聚集到三角形条带中的三角形。从最初的三角形开始,条带可以向三个方向之一生长,对应于三角形的三条边。我们选择沿着我们遇到的第一个未标记的相邻三角形的方向生长条带。如果没有未标记的邻居,则三角形带是完整的;否则,通过向满足三角形条带拓扑的列表中添加三角形来扩展条带。长条一直生长到找不到未标记的邻居为止。然后使用相同的数据创建额外的条带

图9-21三角形带样例。(a)由134条390个三角形组成的结构化三角形网格(stripF.)。tcl)。(b)非结构三角形网格由

2227条平均长度3.94,最长的条带101个三角形。图像是通过显示每一个其他三角形条带(uStripeF。tcl)。

程序,直到每个三角形都被标记。

三角形带的长度根据三角形网格的结构而变化很大。图9 - 21 (a)显示了来自最初构造的数据集的长度为390个三角形的三角形条。这种情况是例外的:非结构化三角形网格通常平均每条约5-6个三角形(图9 - 21 (b))。即便如此,存储空间的节省也令人印象深刻。长度为6的三角形需要8个点来表示,而8个三角形需要24个点,这样可以节省66.7%的内存。渲染速度也会受到很大影响,这取决于渲染系统的能力。

  • 连通性

单元间连通性是数据集的一种拓扑属性。当单元格共享点、边或面等边界特征时,它们就是拓扑连接的(图9 - 22)。连通性在许多建模应用程序中都很有用,特别是当我们想要分离出数据集的“部分”时。

连通性的一个应用是提取等值面的一个有意义的部分。如果等值面是由MRI或CT扫描等测量数据生成的,那么它可能包含“噪声”或不重要的解剖结构。使用连通性算法,我们可以通过消除噪声或不希望的解剖结构来分离出我们想要的等值面的部分。图9 - 23是从噪声信号中提取感兴趣的2D曲面(例如,等高线)的示例。

图9-22连接单元格。

图9-23利用连通性提取感兴趣的部分等值面。

连接算法可以使用递归访问方法实现。首先,我们任意选择一个单元格,并将其标记为“已访问”。然后,根据所需的连接类型(即点、边、面),我们收集适当的邻居并标记它们已访问。这个过程递归地重复,直到访问所有连接的单元格。我们通常把这样一组连接的细胞称为连接的“表面”,即使这些细胞的拓扑维度可能不是两个。

为了识别额外的连接表面,我们定位另一个未访问的单元,并重复前面描述的过程。我们继续识别连接表面,直到访问数据集中的每个单元格。当每个连接表面被识别时,它被分配一个表面编号。我们可以使用这个数字来指定要提取的表面,或者我们可以指定“种子”点或单元格,并提取与它们连接的表面。

在某些情况下,连接算法的递归深度超过了计算机系统的管理能力。在这种情况下,我们可以指定最大递归深度。当超过此深度时,将终止递归,并使用递归中的当前单元格作为种子重新启动递归。

多边形法线生成

Gouraud和Phong底纹(见第3章)可以改善渲染多边形的外观。这两种方法都需要点法线。不幸的是,多边形网格并不总是包含点法线,或者数据文件格式可能不支持点法线。如图9-22所示。图9-23利用连通性提取感兴趣等值面的部分。一般数据集(通常不会生成表面法线)和立体光刻文件格式(不支持点法线)的341立方体算法。图9 - 24 (a)显示了一个由立体光刻格式定义的模型。模型的侧面很明显。

为了解决这种情况,我们可以从多边形网格中计算曲面法线。下面是一个简单的方法。首先,围绕一个公共点计算多边形法线。然后在该点对这些法线求平均值,法线被重新正化(即,)并与该点关联。这种方法在两个条件下很有效。

1. 图9 - 24(b)所示,该点周围所有多边形的方向是一致的。如果定义多边形点的顺序与其边缘邻居的顺序一致,则多边形的取向是一致的。也就是说,如果多边形p是由点(1,2,3)定义的,那么多边形的边邻居p23必须在(3,2)方向上使用边(2,3)。如果不一致,则平均点法线可能为零或不能准确表示曲面的方向。这是因为多边形法线是由其定义点形成的边的叉乘计算得出的。

2. 相邻多边形的面法线角差很小。否则,锐利的角或边缘在渲染时将有一个水洗的外观,导致不满意的图像(图9 - 24 (c))。

为了避免这些问题,我们采用了一种更复杂的多边形法线生成算法。这种方法包括确保多边形方向一致的步骤,以及在锐利边缘上复制点的边缘分割方案。

为了使边的方向一致,我们使用递归邻居遍历。选择一个初始多边形并标记为“一致”。对于初始多边形的每个边缘邻居,检查邻居多边形点的顺序-如果不一致,则反转顺序。然后将相邻多边形标记为“一致”。这个过程对每个边缘邻居进行递归重复,直到所有邻居都被标记为“一致”。在某些情况下,可能有多个连接面,因此该过程可能必须重复,直到访问所有多边形。

类似的遍历方法分割锐利的边缘。锐边是由两个多边形共享的边,其法线随用户指定的特征角而变化。两个多边形之间的特征角是它们法线之间的夹角(图9 - 25 (a))。当递归遍历过程中遇到尖锐的边缘时,沿边缘的点被复制,有效地断开沿边缘的网格(图9 - 25 (b))。然后,当共享多边形法线在该过程的后面计算时,对锐利边缘的平均法线的贡献将被阻止。

在一些计算机上,对递归深度的限制可能会成为一个问题。多边形表面可以由数百万个多边形组成,从而导致很大的递归深度。因此,递归的深度可以由用户指定。如果递归深度超过指定值,则递归停止,递归边界上的多边形成为种子,重新开始该过程。

图9 - 24 (d)为特征角为60度的先进法向生成技术的结果。锐利的边缘被清晰地定义,弯曲的区域缺乏原始模型中明显的表面。图中显示的是Gouraud阴影。

图9-24曲面法线生成。(a)无法线的多面模型。

(b)多边形必须始终朝向,才能准确计算法线。(c)锐利的边缘不能很好地用共享法线表示,如这个模型的角落所示。(d)

具有锐利边缘分裂的法线生成(法线。cxx)。

大量毁灭

各种各样的数据压缩技术已经被开发出来以应对大数据量。的

UNIX实用程序压缩/解压缩,PC实用程序zip压缩数据文件。MPEG压缩算法对视频序列进行压缩。这些技术可能是无损的,也就是说

图9-25计算特征角(a)和分棱(b)。

在压缩/解压步骤之间没有数据丢失或有损,这意味着数据在压缩过程中丢失。实用程序压缩/解压缩和压缩是无损的,而MPEG是有损的。

在图形方面,数据压缩技术也得到了发展。我们在本章前面看到的子采样方法是用于可视化数据的简单数据压缩技术的一个例子。图形数据压缩的另一个新兴领域是多边形约简技术。

多边形缩减技术减少了建模对象所需的多边形数量。模型的大小,在多边形计数方面,在过去几年中有了巨大的增长。这是因为许多模型是使用激光扫描仪或卫星等数字测量设备创建的。这些设备可以以极高的速度生成数据。例如,激光数字化仪可以在15秒的扫描时间内生成50万个三角形。像移动立方体这样的可视化算法也会生成大量的多边形:典型的从512 3体积生成1到300万个三角形。

一种多边形缩减技术是抽取算法[Schroeder92a]。抽取算法的目标是减少三角形网格中三角形的总数,保持原始拓扑结构,并与原始几何结构形成良好的近似。三角形网格是多边形网格的一种特殊形式,其中每个多边形都是三角形。如果需要,可以使用标准的多边形三角剖分方法将多边形网格转换为三角形网格。抽取与图9 - 17 (b)中描述的非结构化网格的子采样技术有关。区别在于

•抽取只处理三角形网格,而不是任意的非结构化网格;

•选择删除哪些点是抽取标准的函数,抽取标准是删除一个点所引入的局部误差的度量;

•通过删除点创建的孔的三角剖分以保留边缘或其他重要特征的方式进行。抽取通过迭代访问三角形网格中的每个点进行。对于每个点,执行三个基本步骤(图9 - 26)。第一步对局部几何和拓扑进行分类

图9-26抽取算法概述

就在附近。分类产生图中所示的五个类别之一:简单、边界、复杂、边缘和角点。基于此分类,第二步使用局部误差度量(即抽取标准)来确定是否可以删除点。如果满足条件,第三步删除点(以及相关的三角形),并对生成的孔进行三角化。下面将对每个步骤和示例应用程序进行更详细的描述。

点分类。抽取算法的第一步是描述给定点的局部几何和拓扑结构。分类的结果确定顶点是否是潜在的删除候选点,如果是,则使用哪个标准。

每个点可以被指定为五种可能的分类之一:简单、复杂、边界、内边或角顶点。每种类型的示例如图9 - 26所示。

一个简单的点被一个完整的三角形循环包围着,每条使用该点的边都被恰好两个三角形所使用。如果这条边没有被两个三角形使用,或者这个点被一个不在三角形循环中的三角形使用,那么这个点就是复点。这些是非流形的情况。图9-26抽取算法概述简单复杂边界内边角分类顶点计算误差三角剖分与平面的距离与直线的距离递归三维三角剖分与分割平面的细分9.4建模算法345网格边界上的点,即三角形组成的半圆内的点,是边界点。

一个简单点可以进一步划分为内边或角点。这些分类是基于局部网格几何。如果两个相邻三角形之间的表面法角角大于指定的特征角,则存在特征边(见图9 - 25 (a))。当一个点被两条特征边使用时,这个点就是内边点。如果有一条、三条或多条特征边使用该点,则该点为角点。

三角形网格不删除复杂顶点和角顶点;所有其他顶点都成为删除的候选者。

大量毁灭标准。一旦我们有了要删除的候选点,我们就会估计通过删除这个点,然后用另一个三角剖分来替换它(及其相关的三角形)所产生的误差。有许多可能的误差测量方法;但最简单的是基于局部平面性或局部共线性的距离测量(图9 - 26)。

在一个简单点周围的局部区域,网格几乎被认为是“平坦的”,因为根据定义没有特征边。因此,简单点使用基于到平面距离的误差测量。通过局部区域的平面既可以用最小二乘平面计算,也可以用面积平均平面计算。

划分为边界或内边缘的点被认为铺在边缘上,并使用距离到边缘的误差测量。也就是说,我们计算候选点到三角剖分过程中形成的新边的距离。

如果一个点的距离测量值小于d,那么这个点就满足抽取标准d。所有使用该点的三角形也会被删除,在网格中留下一个“洞”。这个洞是用局部三角测量法修补的。

三角测量。在删除一个点之后,产生的孔必须重新排列。虽然孔是由一圈边定义的,在拓扑上是二维的,但它通常是非平面的,因此不能使用通用的2D三角测量技术。相反,我们使用一种特殊的递归3D分治技术来对循环进行三角测量。

三角测量过程如下。选择一个初始分割平面将循环分成两半,并创建两个子循环。如果每个子循环中的所有点都位于平面的相对两侧,那么分割是有效的。此外,长宽比检查确保循环不会太长太细,从而产生针状三角形。长宽比是分割线的长度与子循环中一点到分割平面的最小距离之间的比值。如果候选分割平面无效或不满足纵横比准则,则评估另一个候选分割平面。一旦找到一个分割平面,那么每个子循环的细分将继续递归,直到一个子循环由三条边组成。在这种情况下,子循环生成一个三角形并停止递归。

有时,三角测量会失败,因为找不到分裂平面。在这种情况下,候选点不会被删除,网格保持在原始状态。这对算法没有任何问题,并且通过访问数据集中的下一个点继续抽取。

结果。抽取算法的典型压缩率范围从2:1到100:1,对于“大型”(即10个5三角形)数据集,以10:1为标称数字。根据数据类型的不同,结果差异很大。CAD模型通常减少最少,因为这些模型有很多锋利

图9-27抽取算法示例三角形网格显示在线框中。

边缘和其他细节特征,CAD建模者通常产生最小的三角测量。地形数据,特别是相对平坦的区域,可能以100:1的比例减少。

图9 - 27显示了抽取在激光数字化数据和夏威夷檀香山地形模型中的两个应用。在这两种情况下,压缩比都在10:1的情况下减少了90%左右。线框图像被显示以强调多边形网格的密度。每对中左边的图像是原始数据;右边的图像是抽取网格。图9-27抽取算法示例三角形网格显示在线框中。(a)激光数字化仪数据抽取(deciFran.)tcl)。(b)地形数据抽取(deciHawa.)tcl)。注意抽取网格中围绕高曲率特征的层次。与子采样技术相比,抽取的优点是网格自适应修改,以保留高曲率区域的更多细节。

先进的技术。多边形约简是一个活跃的研究领域。除了抽取算法之外,还提出了许多强大的算法(参见第380页的“书目注释”)。虽然我们不能在本节中完整地讨论这个领域,但有两个值得注意的趋势。首先,渐进式方案[Hoppe96]允许三角形网格的增量传输和重建——这对于基于web的几何可视化尤其重要。其次,最近的算法修改网格的拓扑[He96] [Popovic97] [Schroeder97]。这一特性对于获得任意级别的网格缩减是必不可少的。

渐进式网格是由一系列的三角形网格通过运算联系起来的

M和mn在哪

表示全分辨率下的网格,M

0

是一个简化的基网格。渐进式网格的关键特征是可以选择网格操作,使其具有可逆性。然后,操作可以以相反的顺序应用(从基础网格M开始)

0

以获得所需还原水平的网格(假设还原水平小于基础网格M

0

).

一个这样的可逆算子是边折叠,它的逆是如图所示的边分裂

图9 - 28 (a).网格内部边缘的每一次折叠都会导致两个三角形的消除

(如果折叠顶点在边界上,则为一个三角形)。该操作由五个值表示

哪里是要折叠/分裂的顶点,哪里是要折叠/分裂的顶点,和是分裂边缘左右两侧的两个额外顶点。这两个顶点结合并定义了删除或添加的两个三角形。A表示顶点属性信息,它至少包含折叠/分割顶点的坐标。(注意:在抽取算法的上下文中,边折叠算子取代了递归三角剖分过程。)

虽然渐进网格允许我们紧凑地存储和传输三角形网格,但问题仍然是,基础网格的大小通常大于所需的缩减水平。因为在一些应用程序中,我们希望实现任何给定的水平,我们希望基本网格不包含三角形

(一些顶点是启动边缘分割操作所必需的)。为了解决这个问题,将拓扑保持的可逆边折叠/分割操作符扩展为顶点分割/合并操作符。顶点分割/合并操作符修改网格的拓扑结构,并允许任意级别的缩减。

图9-28渐进网格算子边折叠/分割和顶点分割/合并。

当我们将原来使用顶点的一个或多个三角形的连通性列表中的顶点替换为顶点时,就会发生网格分裂(图9 - 28 (b))。新顶点的坐标值与。裂缝在网格中引入了一个“裂缝”或“洞”。我们不喜欢分割网格,但在高抽取率下,这可以缓解拓扑约束,并允许进一步抽取。只有当有效的边折叠不可用时,或者当顶点不能三角化时(例如,非流形顶点),才会调用分割。一旦分裂操作发生,顶点和将被重新插入优先级队列。

根据顶点的分类使用不同的分割策略(图9 - 28(c))。内边顶点沿着特征边分割,角顶点也是如此。Nonmanifold

图9-29拓扑修改渐进网格算法结果

顶点被分割成独立的流形块。在任何其他类型的顶点分裂是通过任意地将循环分割成两部分发生的。例如,如果一个简单的顶点因为有效的边折叠不可用而无法删除,那么三角形循环将被任意地分成两半

(可能在递归过程中)。

与边折叠/分割一样,顶点分割/合并也可以表示为紧凑操作。顶点分割/合并操作可以用四个值表示

顶点和定义将与原始顶点分离的三角形扫描(从到)(我们采用逆时针顺序约定来唯一地定义三角形扫描)。图9 - 29显示了对两组数据应用拓扑修改渐进网格算法的结果。

图9 - 29 (a-c)中,有孔的薄板被抽取(较暗的线条表示边缘分裂)。序列中的中间图像显示了拓扑对算法的限制。只有当网格的拓扑结构被允许修改时,最终的缩减水平才有可能。图9 - 29 (d-f)显示了同样的算法应用于CAD数据。

图9-30半柱面平滑示意图左下图是原始模型。在x轴上,平滑迭代的次数被修改。在y轴上,松弛因子被修正。

网格平滑

网格平滑是一种调整数据集的点坐标的技术。网格平滑的目的是改善网格的外观,和/或改善数据集单元格的形状。平滑期间,数据集的拓扑不被修改,只有几何。网格平滑的应用包括改善等值面的外观,或作为一个建模工具,以消除sur

面对噪音。模型的外观可以通过应用网格平滑来显著改善。

图9 - 30是一个平滑应用到随机曲面畸变(smoothCyl.)的解析曲面(半柱面)的例子。tcl)。

一个简单而有效的技巧是拉普拉斯平滑。在某一位置上的点的拉普拉斯平滑方程由

其中是新的坐标位置,和是“连接”到的点的位置,是用户指定的权重。从几何上看,这种关系如图9 - 31 (a)所示。在这里,顶点通过边与周围的点相连。这个方程表示新位置与原位置的偏移量加上平均向量乘以。通常,因子是一个很小的数字(例如,0.01),并且流程被重复执行(例如,50-100次迭代)。注意,平滑的整体效果是减少高频表面信息。该算法将减小曲面曲率,并趋向于使曲面变平。

除了调整迭代次数和平滑因子外,还可以通过修改与周围点之间的连接来控制平滑。例如,如果位于网格中的折叠边缘或锋利边缘上,我们可能只想使用两个边缘端点来计算平滑向量,限制沿边缘的运动(图9 - 31 (b))。我们也可以锚定,以防止任何运动。锚定对于位于“角”或其他特殊特征(如非流形附件)上的点很有用。锚定和控制点连接的一个好处是我们可以限制网格的收缩量。它也倾向于产生更好的整体结果。(在图9 - 30中,曲面的边界点被约束沿边界移动,尖角处的点被锚定。)

尽管拉普拉斯平滑在大多数情况下都能很好地工作,但也有一些拉普拉斯平滑的应用可能会严重破坏网格。大量的平滑迭代或较大的平滑因子会导致过度的收缩和表面变形。有些物体,如图9 - 30所示的球体或圆柱体,会在每次迭代中失去体积,甚至会缩小到一个点。在极少数情况下,网格可能会“由内而外”地拉自己。这种情况发生在平均矢量移动穿过网格边界时,导致一些附加的三角形重叠或相交。

网格平滑在创建不要求高精度的模型时特别有用。正如我们所看到的,平滑修改点坐标,因此,曲面几何。高级算法平滑以改善模型的外观,但如果您要从光滑的表面测量,则要仔细描述误差。或者,您可能希望设计自己的平滑算法,以便更好地适应底层数据。

扫过的体积和表面

考虑移动一个物体(例如,你的手)在某个路径上(例如,举起你的手)。我们如何将这个运动形象化?显而易见的答案是,当手移动时,形成一个时间动画序列。但是,如果我们希望静态地表示运动以及手所穿过的空间呢?然后我们可以使用扫面和扫体。扫掠体积是物体沿任意轨迹在空间中移动时所占据的空间体积。扫面是被扫体的表面。

一起,扫过的体积和扫过的表面可以静态地表示物体的运动。

过去在创造扫描表面和体积方面的努力主要集中在分析技术上。各种3D几何原语(例如,线、多边形、样条)的数学表示被扩展到包括第四维时间(路径)。不幸的是,这些方法在实践中从未成功过,部分原因是数学的复杂性,部分原因是问题的退化。

简并发生在一个n维物体以这样一种方式移动,使其表示变成(n-1)维的时候。例如,沿法线方向移动一个平面,扫出一个三维“立方体”体积。然而,以垂直于法线的方向扫平面会导致简并状态,因为平面扫出一个2D“矩形”。

可以使用数值逼近技术[Schroeder94],而不是解析地创建扫描表面。隐式建模为通过扫面和扫体可视化物体运动的有效技术提供了基础。该技术不受简并的影响,可以处理可以计算距离函数的任何几何表示,例如VTK单元类型。

使用隐式建模方法生成扫面和卷的技术如下所示。必须定义几何模型或零件,以及描述零件运动的路径或扫掠轨迹。然后执行如图9 - 32所示的操作。

1. 从部件生成隐式模型。这就产生了以体积形式的隐式表示。我们称之为隐式模型。

2. 构造另一个卷,即工作空间卷,它在沿着路径移动时严格限定。然后一小步一小步地扫过。。在每个步骤s中,使用工作空间体积进行采样。我们使用布尔联合操作来执行采样。

3.提取等值面,或偏移面(s)从使用轮廓算法,如推进立方体。

4. 步骤3可能会创建多个连接表面。如果需要单个曲面,则使用连通性来提取单个“最大”曲面(以三角形的数量表示)。这个曲面是被扫曲面的近似值,它所包围的体积是被扫曲面的近似值。

图9-32扫面技术概述

图9-33通过采样隐式卷生成工作区卷

有几点需要额外解释。该算法使用隐式模型和工作空间两个卷。两者都是隐式模型,但工作空间体积用于在零件沿扫描轨迹移动时积累零件。理论上,零件可以直接采样到工作空间中,以创建扫描表面的隐式模型。性能问题要求隐式模型被采样到工作区卷中。这是因为对部件的隐式模型进行采样比对部件本身进行采样要快得多,因为与对隐式模型进行采样相比,从可能由数万个单元格组成的部件计算距离函数是相对耗时的。

采样如图9 - 33所示。扫描轨迹由一系列变换矩阵定义。随着零件的移动,使用插值来计算一个中间变换矩阵t。通过将VW逆变换到使用t的局部空间来实现采样。然后,类似于“探测”中描述的探测操作

图9-34计算采样和步进误差

的点通过变换矩阵的逆变换,并用于插值到隐式模型的距离值。由于我们处理的是隐式建模技术,具有凹特征的部件可以生成多个曲面。

正如第339页的“连接性”中所讨论的,连接性算法用于分离出扫过的表面。这个最终曲面是实际扫描曲面的近似值,因为我们对点数组(即隐式模型)上的实际几何表示进行采样,然后对另一个体积(即工作空间体积)上的隐式模型进行采样。

此外,沿扫描轨迹步进会产生与步长成比例的误差。这些错误的特征如下(图9 - 34)。给定体素大小L/D,其中L是体积的边长,D是体积的尺寸(为方便起见,假设均匀),最大采样误差为

由步进引起的误差,包括平移分量和旋转分量,受限于,其中为隐式模型上任何给定平移步长点的最大位移。结合这些关于取样体积和步进误差的术语,总误差为

其中下标I和W分别指隐式模型和工作空间体积。

为了展示该算法的应用,我们为字母“VTK”和“mace”模型生成扫面,如图9 - 35所示。我们故意选择步长来夸大步进误差。使用更多的步骤可以使表面的“颠簸”变得平滑。此外,表面的外观与所选择的等值面值有很大的不同。数值越大,表面就越圆、越光滑。如果你使用接近零的小值(假设正距离函数),曲面可能会破裂。为了纠正这一点,你需要使用更高分辨率的作品

图9-35扫面示意图(a)扫过的狼牙棒在25个地点取样。(b)扫扫21个地点的vtk样本。

空间或计算负距离。在隐式建模步骤中,通过对原始几何图形内的所有点求负距离来计算负距离。负距离允许我们使用零等值面值或生成内偏置曲面。负距离只能计算封闭(即流形)物体。非结构化点数据集由三维空间中不规则位置的点组成。点与点之间的关系是任意的。

可视化非结构化点

非结构化点数据集的例子是通过(任意)放置的热电偶阵列可视化温度分布,或者在地理区域的分散位置测量降雨水平。

与图像数据和结构化网格甚至非结构化网格不同,非结构化点数据集没有将一个点与另一个点关联起来的拓扑组件。由于这些原因,非结构化点很容易表示,但很难可视化。它们很难可视化,因为没有固有的“结构”,我们可以将可视化技术库应用到其中。除了仅仅显示点(可能用标量值着色,或使用定向矢量符号)之外,迄今为止讨论的任何技术都不能使用。因此,为了可视化非结构化点,我们必须构建可以应用可视化技术的结构。

在给定随机点集的情况下,有几种方法可以构建拓扑结构。一种常见的方法是将非结构化点采样到图像数据集中,然后使用标准的体积或基于表面的渲染技术对数据进行可视化。另一种方法是从非结构化点创建n维三角剖分,从而创建拓扑结构。下面几节将介绍这些技术和其他常用技术。

图9-36二维喷涂工艺示意图(a)向图像数据集中注入点(圆形splats)。(b)轮廓化图像数据集。任何基于图像的可视化技术都可以使用。

抛雪球算法技术。飞溅技术通过将非结构化点采样到图像数据集中来构建拓扑结构(图9 - 36)。采样是通过创建特殊的影响或飞溅函数SF(x,y,z)来执行的,这些函数将每个非结构化点的数据值分布在周围区域。为了对非结构化点进行采样,将每个点插入到图像数据集SP中,并使用喷溅函数SF(x,y,z)通过SP分布数据值。

一旦构建了拓扑结构,就可以使用任何基于图像的可视化技术(包括体绘制)。一个常见的溅射函数是以圆点为中心的均匀高斯分布。函数可以方便地转换到表单中

式中,s是乘指数的比例因子,f是指数比例因子,r是任意点到高斯中心点(即飞溅点)的距离,r是高斯分布的影响半径,其中。

高斯函数(图9 - 37 (a))在二维(图9 - 37 (b))的横截面上变成圆,在三维(图9 - 37 (b))变成球。由于函数的值在什么时候最大,最大值由比例因子s给出。参数f控制着溅射的衰减速率。标量值可用于设置s的值,因此相对较大的标量值比较小的值创建更大的分段。

可以使用标准的隐式建模布尔运算(公式6-13、公式6-14和公式6-15)来累积数据块。也就是说,我们可以选择形成一个并集,交叉,或差异的板。联合运算符和交集运算符使用最频繁。

另一个有趣的变化是根据矢量(如表面法线或矢量数据)修改飞溅的形状。图9 - 37 (c)显示了一个示例,其中splat形状沿平行于矢量的方向被拉长。因此,如果我们有一组点和法线,我们可以通过结合溅射和等值面提取来创建一个多边形表面。

图9-37高斯溅射函数。(a)一维,(b)二维球面,和

(c)二维椭圆。

为了生成定向片,我们通过引入偏心因子E和矢量来修改公式9-22

z和rxy是从哪里计算出来的

参数z是沿矢量的距离,参数rxy是垂直于v到点p的距离。偏心系数控制着splat的形状。值的结果是球形的splat,而在矢量v的方向上产生扁平的splat和伸长的splat。

图9 - 38 (A)显示了一个椭圆splat。(splat surface是通过等值面提取创建的。)不出所料,碎片是一个椭球。图9 - 38 (b)是用于从非结构化点集重建曲面的椭圆溅射应用。使用椭圆板的优点是,我们可以在垂直于法线点的平面上压平板。这有助于在点样本之间架起桥梁。表面本身是使用标准等值面提取算法提取的。

插值技术。插值技术构造一个函数来平滑地插值一组非结构化点。也就是说,给定n个点和函数值的集合,创建一个新函数来插值这些点。一旦插值函数被构造,我们可以通过对图像数据集进行采样,从非结构化点构建拓扑结构。然后,我们可以使用贯穿文本的各种技术中的任何一种来可视化图像数据。

图9-38椭圆喷涂。(a)偏心距E=10的单个椭圆片。

圆锥显示矢量(singleSplat.)的方向。cxx)。(b)用椭圆片将表面重建为1003

体积之后进行等值面提取。点有规律地下采样和覆盖在原始网格(splatFace。tcl)。

Shepard的方法是一种逆距离加权插值技术[Wixom78]。插值函数可以写成

在哪里。Shepard的方法易于实现,但有一些不受欢迎的特性,限制了它在大多数实际应用中的实用性。插值函数生成一个局部

"平点"在每一点上,因为导数为零

因此,Shepard的方法在每个点周围的区域有过度的约束。

Shepard方法是基函数方法的一个例子。也就是说,插值函数F(p)由以每个数据点为中心的函数和组成。其他基函数方法也被Nielson [Nielson91]所描述。它们在基函数的局部化和插值函数的复杂程度上有所不同。基函数的局部化方法

图9-39 Delaunay三角剖分(a)和Dirichlet镶嵌(b)在Delaunay三角剖分中,每个三角形的圆周不包含其他点,只包含三角形的三个顶点。狄利克雷细分中每个点周围的区域是最接近的点的集合。

它们的影响只局限于一个小区域。更复杂的基函数的例子包括二次多项式和三次样条。更多信息请参阅参考文献。

三角测量技术。

三角测量技术直接从非结构化点构建拓扑结构。这些点被三角化,以创建一个由完全绑定点和点的线性组合(所谓的凸包)的n维简式组成的拓扑结构。三角剖分的结果是一组三角形(2D)或四面体(3D),这取决于输入数据的维度[Lawson86]。

点集的n维三角剖分是定义点在p中的n维简式的集合。简式彼此不相交,仅共享边界特征,如边或面。Delaunay三角剖分是一种特别重要的形式[Bowyer81] [Watson81]。它具有这样的性质:任何n维单纯形的圆,除了单纯形的n+1个定义点外,不包含P的其他点(图9 - 39 (a))。

德劳内三角剖分法有许多有趣的性质。在二维中,Delaunay三角剖分已被证明是最优的三角剖分。也就是说,在德劳内三角剖分中,三角形的最小内角大于或等于任何其他可能的三角剖分的最小内角。Delaunay三角剖分是Dirichlet镶嵌(图9 - 39 (b))的对偶,Dirichlet镶嵌是计算几何中的另一个重要结构。Dirichlet镶嵌,也称为Voronoi镶嵌,是一种空间平铺,其中每个平铺代表最接近点pi的空间。(这些瓷砖被称为Voronoi单元格。)通过在Voronoi细胞之间创建共享n-1边界的边(例如,3D中的脸和2D中的边),可以从Dirichlet镶嵌中构建一个n维Delaunay三角剖分。相反地,狄利克雷镶嵌的顶点位于德劳内圆的圆周中心。

图9-40利用Watson和Boyer技术计算Delaunay三角剖分。点被注入三角剖分,形成新的Delaunay三角剖分。在最后一步,最初的边界点被删除,以揭示最终的三角剖分。

德劳内三角剖分可以使用多种技术进行计算。我们描述了由Watson [Watson81]和Bowyer [Bowyer81]独立引入的一种特别优雅的技术(图9 - 40)。该算法首先构造一个初始的Delaunay三角剖分,该三角剖分严格限定了点集P,即所谓的边界三角剖分。这种边界三角形划分可以像单个三角形(2D)或四面体(3D)一样简单。然后,将P中的每个点逐个注入到当前三角剖分中。如果注入点位于任何单纯形的圆周内,则删除该单纯形,在三角剖分中留下一个“洞”。在删除所有简化后,使用洞边界上的n-1维面以及注入点来构造改进的三角剖分。这是一个Delaunay三角剖分,这个过程一直持续到所有点都被注入到三角剖分中。最后一步去除连接形成初始边界三角剖分的点的简化,以显示完成的德劳内三角剖分。

这个简单的三角测量技术演示展示了如何从一组非结构化点创建拓扑结构。我们忽略了一些难题,如简并和数值问题。简并发生在德劳内三角剖分中的点以这样一种方式存在,使得三角剖分不是唯一的。例如,位于正方形、矩形或六边形顶点上的点是简并的,因为它们可以用不止一种方式进行三角剖分,其中每种三角剖分都是等效的(根据Delaunay准则)。数值问题发生时,我们试图计算周长,特别是在高维三角剖分,或当简单的低纵横比存在。

尽管存在这些问题,三角测量方法仍然是可视化非结构化点的强大工具。一旦我们将数据转换为三角测量(或者用我们的术语,非结构化网格),我们就可以使用标准的非结构化网格技术直接可视化我们的数据。

混合动力技术。最近的工作重点是结合三角剖分和基函数技术来插值二维二元数据。其基本思想如下。对P进行三角剖分。然后在三角剖分的边缘上定义一个曲线插值网络。利用插值样条的某些极小性构造了这些曲线。最后,利用曲线网络构造一系列三角基函数,即曲面补丁表现出函数值的连续性,以及可能的高阶导数。(详见[Nielson91])

  • 多维可视化

多维数据集的处理是一个重要的数据可视化问题。数据集中的每个点都由一个n维坐标描述,其中。在这里,我们假设每个坐标都是一个自变量,我们希望可视化一个单独的因变量。(向量和张量的多维可视化是一个开放的研究领域。)多维数据的一个应用是财务可视化,其中我们可能希望将投资回报率可视化为利率、初始投资、投资期限和收入的函数,仅举几个例子。

在应用多维可视化时,我们必须解决两个基本问题。这些是投射和理解的问题。

投影的问题是,在使用计算机图形时,我们有两个维度来表示我们的数据,如果我们使用专门的方法,可能是三个或四个维度。使用3D图形,我们可以给出三维的错觉,或者我们可以使用立体观看技术来实现三维。我们也可以通过动画图像将时间作为第四维空间。然而,除了这些有限的情况,一般的n维数据不能在二维计算机屏幕上表示。

理解的问题在于,人类不容易理解超过三个维度,或者可能是三个维度加上时间。因此,即使我们可以创建一种技术来显示多维数据,理解数据的困难也会损害该技术的有用性。

大多数多维可视化技术都使用某种形式的维度映射,其中n维映射到3维,然后用3D计算机图形技术显示。映射是通过固定除三个变量之外的所有变量来实现的,然后将文本中描述的可视化技术应用于结果数据。为了获得最大的利益,固定自变量,映射到三维空间,然后生成可视化的过程必须是交互式的。这提高了可视化过程的有效性,允许用户通过操作数据的不同部分来构建数据的内部模型。Inselberg和Dimsdale提出了

一种新的多维可视化方法[Inselberg87]。这种方法使用平行坐标系。不是在正交轴上绘制点,而是沿着单独的平行轴绘制每个点的第i维坐标。如图9 - 41所示,这是一个五维点。在平行坐标图中,点表现为线。结果,n维点的图呈现为线段的序列,这些线段可能相交或分组以形成复杂的扇形图案。这样一来,人类的模式识别能力就发挥了作用。不幸的是,如果点的数量变得很大,而数据不是强相关的,那么结果图就会变成一团黑色,任何数据趋势都淹没在视觉显示中。

另一个有用的多变量技术使用字形。这种技术将字形的一部分与每个变量关联起来。尽管通常不能为任意n维数据设计字形,但在许多应用程序中,我们可以创建字形来传达我们感兴趣的信息。有关字形的更多信息,请参阅190页的“字形”。

图9-41平行坐标绘制五维点(a)单点图,(b)多点图。

文本算法

纹理是计算机图形中常用的工具,用于引入细节,而不需要图形原语的高成本。正如我们在第7章中提到的,纹理映射也可以用于可视化数据。我们将在下面几节中探讨一些技术。

纹理的阈值。我们在前面看到了如何基于标量值对数据进行阈值设置(请参阅第336页的“阈值设置”)。我们将这种方法称为几何阈值分割,因为数据集的结构组件(例如,点和单元格)是基于数据值提取的。相比之下,我们可以使用纹理映射技术来实现类似的结果。我们称之为纹理阈值技术。

纹理阈值隐藏了我们不想看到的特征,突出了我们想看到的特征。关于这个主题有很多变化。一个特征可以通过使其透明或半透明,通过降低其强度,或使用柔和的颜色来隐藏。一个特征可以通过使其不透明、增加其强度或添加明亮的颜色来强调。在下面的段落中,我们将描述一种结合强度和透明度的技术。

纹理阈值需要两个信息:纹理映射和映射的索引,或纹理坐标。在最简单的情况下,我们可以设计一个纹理映射,它由两个不同的区域组成,如图9 - 42 (a)所示。第一个区域也可以称为“隐藏”、“关闭”或“外部”。第二个区域被称为“强调”、“上”或“内”。(使用这些不同的标签取决于具体的应用。)有了这个纹理贴图,我们可以通过计算一个合适的纹理坐标来设置纹理阈值。我们希望强调的区域被分配一个坐标映射到纹理地图的“强调”部分。我们想要隐藏的区域被分配一个坐标来映射到纹理地图的“隐藏”部分。

一种纹理阈值技术使用透明度。我们可以通过将alpha不透明度值设置为0(透明)来隐藏一个区域,并通过将alpha值设置为1(不透明)来突出它。因此,纹理图由两个区域组成:一个隐藏区域和一个突出区域。当然,这种效果可以通过使用中间alpha值来创建半透明图像来软化。

该技术的扩展引入了第三个区域到纹理映射中:过渡区域(图9 - 42 (b))。过渡区域是隐藏和突出之间的区域

图9-42 1D纹理图。(a)进出图。(b)在进出图中增加过渡区域。

地区。我们可以使用过渡区域在突出的区域周围绘制边界,进一步突出该区域。

为了构建纹理地图,我们使用强度alpha或值。强度调节底层颜色,而alpha值控制透明度(如前所述)。在突出的区域,强度和不透明度值设置高。在隐藏区域,强度值可以设置为任意值(if),也可以设置为较低的值(if)。过渡区域可以使用各种强度和强度的组合。一个很好的组合会产生一个黑色的、不透明的过渡区域(即和)。

为了用阈值技术可视化信息,我们必须将数据映射到纹理坐标。如前所述,我们可以将标量值与阈值规范结合使用,将数据映射到纹理映射的隐藏区域、过渡区域和突出区域。图9 - 43 (a)显示了应用于流体流动模拟标量数据的纹理阈值化示例。将标量阈值设置为仅显示标量值大于或等于的数据。

另一个有用的纹理阈值应用程序使用隐式函数将点位置映射到纹理坐标。这在效果上类似于几何裁剪(参见第323页的“用标量字段裁剪”)。正如我们在第185页的“隐式函数”中看到的,隐式函数自然地将一个坐标值映射到三个区域:、、和;或者等价地,纹理图的隐藏、过渡和突出区域。使用隐式函数的布尔组合,我们可以创建数据的复杂切割,如图9 - 43 (b)所示。该图显示了两个嵌套的球体。外部球体由两个平面的布尔组合切割,以显示内部球体。

布尔纹理。纹理阈值可以扩展到更高的维度。也就是说,2D或3D纹理坐标可用于将两个或三个数据变量映射到纹理映射中。其中一种技术是布尔纹理,一种使用2D纹理映射和两个隐式函数来剪辑几何图形的方法[Lorensen93]。

布尔纹理扩展纹理阈值几何裁剪从1D到2D。使用两个隐式函数来标记区域,而不是使用一个隐式函数来标记区域“in”或“out”。这将导致四个不同的区域对应于“in”和“out”的所有可能组合。

图9-43纹理阈值划分示例(a)使用标量阈值显示平面上1.5以上的流密度值(texThresh. 1.5)。tcl)。(b)两个平面切嵌套球体的布尔组合(tcutSph.)cxx)。

图9-44 2D布尔纹理

布尔纹理映射被修改以反映这一点,如图9 - 44所示。与1D纹理阈值分割一样,可以创建过渡区域来分离四个区域。

布尔纹理映射可以通过强度和透明度值的组合来创建,以实现各种效果。通过将in/out的四种组合(即图9 - 44中的四个区域)与“隐藏”和“强调”的两种组合组合在一起,可以产生16种不同的布尔纹理。图9 - 45 (a)将这些组合表示为两个隐式函数a和b的布尔组合。隐式函数的“内部”用下标i表示,而外部用下标o表示。布尔表达式表示

图9-45 16个布尔纹理。(a) 16种进出组合。(b)纹理应用到球体使用两个椭圆圆柱隐式函数。

图9-46矢量动画的纹理映射。连续应用16个纹理创建沿矢量运动的效果。(a)简单地图。(b)不同强度的运动“羽毛”效应。

我们希望隐藏的区域,如开放的圆圈所示。深色的圆圈是被强调的区域。我们可以在图9 - 45 (b)中看到将这些不同的布尔纹理应用到一个球体上的效果。该图中的隐式函数是两个椭圆柱体共享一个公共轴,并相互旋转90度。此外,过渡区域已定义,以生成所示的暗切边。所有16个球体共享相同的纹理坐标;只有纹理贴图会改变。

纹理动画。基于时间的动画技术可以说明运动或时间数据变化。这个过程通常需要相对大量的计算机资源来读取、处理和显示数据。因此,在动画数据时,减少计算机资源的技术是可取的。

纹理映射可用于动画某些类型的数据。在这些技术中,数据不是逐帧重新生成的,而是使用时变纹理映射来改变数据的视觉外观。这种方法的一个例子是矢量场的纹理动画[Yamrom95]。

正如我们在第173页的“刺猬和定向字形”中看到的,向量场可以表示为定向和缩放的线。纹理动画可以将这种静态表示方案转换为动态表示。关键是构建一系列的一维纹理地图,当快速应用在顺序创造运动的错觉。图9 - 46 (a)显示了一系列16个这样的纹理映射。贴图由intensity-alpha()值组成,纹理贴图的一部分被设置为完全不透明的,使用full intensity()。这显示为图9 - 46 (a)中的“暗”模式。地图的其余部分被设置为完全透明,使用任意强度()显示为“白色”部分。如图所示,从上到下扫描的16个纹理映射序列产生了从左到右运动的外观。还要注意纹理映射是如何被设计成环绕形成连续模式的。

随着1D纹理映射,纹理坐标s也必须生成-在一条直线上,这是直截了当的。直线原点接收纹理坐标s = 0,而直线终点接收纹理坐标s = 1。任何中间点(如果矢量是折线)为I0= Ia I1 =, a = 1 I1 =, a = 0图9-46矢量动画的纹理映射。连续应用16个纹理创建沿矢量运动的效果。(a)简单地图。(b)不同强度的运动“羽毛”效应。1 16 (a)简单不透明/透明变化(b)羽毛不透明/透明变化9.5综合367在区间(0,1)以单调方式参数化。纹理坐标只需要生成一次。只有纹理贴图被改变来生成矢量动画。

其他效果可以通过修改纹理贴图实现。图9 - 46 (b)显示了一个具有重复序列的不透明/透明区域的纹理图。在每个不透明区域,强度从左到右逐渐降低。结果是,这往往是“羽化”的外观矢量运动。产生的图像更赏心悦目。

9.5把一切放在一起

在本章的结尾部分,我们概述了数据可视化的基础知识。在本节中,我们将向您展示如何使用可视化工具包中实现的一些高级算法。

分割立方体/点生成

划分立方体在VTK中通过类vtkDividingCubes实现。它被专门用于处理图像数据集。除了指定轮廓值,还必须指定点之间的分离距离(使用SetDistance()方法)。如果你想要一个坚固的外观,选择一个距离小于或等于显示分辨率。

分离距离控制着点生成的精度。当渲染时,可能会生成看起来形成固体表面的点,但并不准确地位于轮廓表面上。虽然在查看等高线表面时这通常不是问题,但如果点位置的准确性很重要,则必须将距离值设置得更小。然而,这可能会导致大量的分数。要减少点数,可以使用SetIncrement()方法,该方法指定每生成第n个点数。使用这种方法,可以获得良好的准确性和控制总分。点位置很重要的一个例子是,当点用于定位字形或作为流线生成的种子点时。

可视化工具包提供了其他点生成技术。源对象vtkPointSource在一个球形区域内生成用户指定的点数。点的位置在球面内是随机的。(请注意,球体中心附近有较高的点密度的自然趋势,因为点是沿着半径和球角和随机生成的。)

图9 - 47是一个使用vtkPointSource生成流线的例子。该数据集是一个具有流速和标量压力场的结构化维度网格。该数据集是一个小型办公室流动的CFD模拟。如图所示,房间里有几个书柜、几张桌子、一扇窗户和通风系统的进、出口。其中一张桌子上放着一个小而强的热源(例如,一根香烟)。在左图中,使用vtkPointSource点生成器在入口附近启动了25条流线。第二张图显示了当我们将点源稍微向左移动时会发生什么。通过调整单个参数(例如,点源的中心),可以快速探索我们的模拟数据。

另一个方便的点生成对象是类vtkEdgePoints。vtkEdgePoints生成等值面上的点。这些点是通过定位单元的边缘来生成的,这些边缘的点在等面值的上面和下面。用线性插值法生成点。由于vtkEdgePoints操作于任何单元格类型,因此该过滤器的输入类型是任何数据集类型(例如,

图9-47使用随机点种子创建流线(office. zip)tcl)。

使用标量字段进行剪辑

剪切在vtkClipPolyData中实现。每个多边形数据基元在其Clip()方法中使用类似于第323页中描述的三角形的案例表来实现操作。vtkClipPolyData有一些方法来控制隐式函数是否提供标量数据,或者是否使用数据集的标量数据。ComputeScalarDataOn()使用隐式函数,ComputeScalarDataOff()使用数据集的标量数据。生成两个输出多边形数据集。通过GetOutput()和GetClippedOutput()方法访问。GetOutput()返回“在”剪切区域内的多边形数据,而GetClippedOutput()返回“在”区域外的多边形数据。(注意,如果要获得剪切的输出,必须启用GenerateClippedOutputOn()。)inside和outside的含义可以使用InsideOutOn()方法反转。图9 - 48显示了一个用布尔隐式函数裁剪的四边形平面。

直到最近,VTK只支持多边形数据单元类型(顶点、多边形、线、折线、多边形和三角形条)的裁剪。VTK 4.0版本以来的最新添加功能支持使用有序Delaunay三角测量方法对3D单元进行裁剪。

扫过的体积和表面

扫面可以以两种有趣的方式应用。首先,它们可以作为建模工具来创造不寻常的形状和形式。从这个意义上说,扫面是一种先进的隐式建模技术。其次,扫面可以用来静态地表示物体运动。这本身就是一种重要的可视化技术,并且有许多重要的应用。其中一个应用程序是为可维护性而设计的。

在设计像汽车发动机这样的复杂机械系统时,设计适当的关键发动机部件是很重要的。这些组件,如火花塞,需要更高水平的服务和维护。重要的是,这些组件可以很容易地被机制触及。我们都读过这样的恐怖故事:为了换火花塞,必须拆卸发动机。确保能够随时接触到关键的发动机部件,可以防止类似情况的发生。

图9-48球面和椭圆剪辑平面示意图这两个变换将每个隐式函数放置到适当的位置。裁剪器产生两个输出。

(clipSphCyl。tcl)。

扫面可以帮助设计部分入口。我们简单地定义了一个路径来删除部分(在设计过程的早期),然后生成一个扫过的表面。然后将该表面(有时称为维护访问实体或MAS)放回CAD系统中。从这一点开始,周边组件(如燃油管路或线束)的设计必须避免MAS。只要不违反MAS,就可以拆卸该部件。如果违反MAS,则必须重新评估拆卸路径或重新设计部件或周围组件。

图9 - 49显示了如何从一个简单的几何表示创建一个扫面。几何图形是一个简单的线条描边VTK。下一步是定义运动路径。这个路径是通过创建一个变换矩阵列表来定义的。如有必要,线性插值用于沿路径生成中间点。

在图9 - 49中,我们还可以看到构建扫描曲面的基本程序。首先,必须使用vtkimplictmodeler构造该部件的隐式表示。然后将其作为vtkSweptSurface的输入提供。隐式模型的分辨率大于或等于vtkSweptSurface的分辨率是很重要的。这将使我们构造曲面时的误差最小化。可以定义围绕部件及其运动的边界框,或者自动计算。为了得到正确的结果,这个盒子必须严格地包含移动的部件。我们还可以设置插值步骤的数量,或者允许自动计算。在图中,为了更好地说明算法的步进,我们选择了一个较小的数字。

执行vtkSweptSurface后,我们使用等曲面算法提取扫描曲面。等面值为偏移距离;因此,我们可以创建考虑几何公差的表面。(如果我们设计的是机械系统,这一点尤其重要。)隐式建模器在VTK中的实现使用正距离函数;等面线的值总是正的。要创建零和负值的扫面,需要对隐式建模器进行修改。

  • 多维可视化

多维数据集的一个重要特征是它们不能根据可视化工具包中定义的任何类型进行分类。这意味着与多维数据接口的源对象负责将它们所接口的数据转换为VTK中定义的类型之一。这可能是一个困难的过程,需要您编写接口代码。

其他可视化系统以不同的方式处理这个问题。在这些系统中,定义了可以表示多维数据的数据集类型。这个数据集类型本质上是一个n维矩阵。还定义了其他过滤器,允许用户提取数据集的片段,并将它们组装成更常规的数据集类型,例如卷或结构化网格。在将数据从多维形式映射到常规形式之后,可以应用标准可视化技术。(VTK的未来实现可能包括此功能。目前,您必须将多维数据映射到已知的VTK表单。)

为了说明这些想法,我们将参考图9 - 50。这是多维金融数据的一个例子。这些数据反映了与货币贷款相关的参数。在文件financial.txt中有六个不同的变量:TIME_LATE、MONTHLY_PAYMENT、UNPAID_PRINCIPLE、LOAN_AMOUNT、INTEREST_RATE和MONTHLY_INCOME。(注:这是模拟数据,不要据此做财务决策!)我们将使用高斯溅射来可视化这些数据(参见第356页的“溅射技术”)。

图9-49由线条描边的“vtk”生成扫描曲面。类vtkSweptSurface在VTK 4.4的专利目录中。中删除了该目录

VTK 5.0,该类在该版本中不可用。

图9-50多维财务数据可视化展示了可视化网络、输出图像和示例c++代码。cxx)。灰色/线框表面表示数据总体。黑色的表面代表拖欠贷款的数据点。

第一步是选择因变量和自变量。这个选择本质上是从多维数据到非结构化点数据集的映射。在这个例子中,我们将选择

MONTHLY_PAYMENT、INTEREST_RATE和LOAN_AMOUNT作为我们的(x, y, z)点坐标,TIME_LATE作为标量值。这映射了六个变量中的四个。现在我们将忽略其他两个变量。

我们使用vtkGaussianSplatter来执行飞溅操作(即从非结构化点到卷数据集的转换)。接下来是等值面提取。我们把数据分成两部分。这是我们第一次向所有人泼水。这是为了显示上下文,在图中显示为灰色/线框。第二次,我们将数据分割并按TIME_LATE的值缩放。因此,只有逾期付款才会形成第二个等值面。

这个可视化的结果很有趣。首先,我们看到两个自变量MONTHLY_PAYMENT和LOAN_AMOUNT之间有很强的相关性。(在以交互方式查看数据时,这一点更加明显。)我们看到数据大致落在这两个轴之间45度角的平面上。稍微反思一下,这是显而易见的:月供是贷款金额(以及利率和还款期)的强烈函数。其次,我们看到在总体中存在拖欠账户的聚类。该集群往往随着利率的提高而增长,随着月供和贷款金额的减少而缩小。虽然与利率之间的关系是可以预料的,但向月供减少的聚集却不是。因此,我们的可视化为数据提供了线索。进一步的探索可以揭示原因,或者我们可以进行额外的数据分析和采集来理解现象。

关于多维可视化的一个重要注意事项。因为我们倾向于以奇怪的方式组合变量(例如,使用MONTHLY_PAYMENT、INTEREST_RATE和LOAN_AMOUNT作为(x, y, z)坐标),所以通常需要对数据进行规范化。为了规范化数据,我们只需将数据值调整到(0,1)之间。否则,我们的数据可能会严重倾斜,导致糟糕的可视化效果。

  • 连通性

许多有用的可视化算法常常借鉴其他领域。拓扑连通性分析就是这样一种技术。这种技术最好被归类为计算几何中的一种方法,但在计算机图形学和可视化中有许多有用的用途。

为了说明连通性分析的应用,我们将使用由杜克大学体内显微镜中心的Janet MacFall生成的MRI数据集。数据集是一个尺寸为2563的卷,包含在CD-ROM中。数据是一棵小松树的根系。使用类vtkSliceCubes,一个大体积移动立方体的实现,我们生成了一个由351,118个三角形表示的初始等值面。(我们已经放置了文件pine_root。三光盘。这是一种更快的处理数据的方法。如果您有一台足够大的计算机,您可以直接使用vtkVolume16Reader和vtkMarchingCubes来处理卷。)

初始数据集如图9 - 51 (a)所示。请注意,由于数据中的噪声和孤立的水分,有许多小的、不连接的等值面。我们使用vtkConnectivityFilter来删除这些小的、不连接的表面。过滤效果如图9 - 51 (b)所示。超过50000个三角形被移除,剩下299480个三角形。

vtkConnectivityFilter是一个通用的过滤器,将数据集作为输入,并生成一个非结构化网格作为输出。它通过提取在点上连接的细胞(即共享公共点)来发挥作用。在本例中,提取单个最大曲面。还可以指定单元格id和点id,并提取与这些连接的曲面。

图9-51应用连通性过滤器去除噪声等值面

(connPineRoot。tcl)。数据来自256

松树根系体积数据。

抽取

抽取是一种三维数据压缩技术,用于表示为三角形网格的曲面。我们最常使用它来改善大型模型的渲染交互响应。

图9 - 52显示了抽取法对松树根样本数据的应用。使用抽取和连通性的组合,原始模型的351,118个三角形减少到81,111个三角形。抽取参数相当保守。这里我们看到大约减少了55%。

在vtkDecimate过滤器中最常见的参数是TargetReduction, InitialError, ErrorIncrement, MaximumIterations和InitialFeatureAngle。TargetReduction指定压缩因子(接近1的数字表示更高的压缩)。由于拓扑、抽取标准、纵横比和特征角的限制,这种减少可能无法实现(即,TargetReduction是一个期望的目标,而不是一个有保证的输出)。InitialError和ErrorIncrement控制抽取标准。当过滤器启动时,抽取标准被设置为InitialError。然后,对于每一次迭代,抽取标准都增加ErrorIncrement。当目标减少达到或迭代次数达到MaximumIterations时,算法终止。InitialFeatureAngle用于计算特征边。更小的角度迫使算法保留更多的表面细节。

其他重要的参数是AspectRatio和MaximumSubIterations。AspectRatio控制三角测量过程。所有三角形都必须满足这个条件,否则抽取时顶点不会被删除。子迭代是抽取标准不增加的迭代。这可以用于在快速抽取期间合并三角形。MaximumSubIterations控制子迭代的数量。该参数通常设置为2。

  • 裁减纹理

纹理映射是一种功能强大的可视化技术。除了以最小的努力为图像添加细节之外,我们还可以执行重要的查看和建模操作。其中一个操作是剪切数据以查看内部结构。

图9 - 53是一个使用透明纹理贴图进行纹理剪辑的例子。车展由五个复杂的部件组成,其中一些部件被外壳隐藏起来。为了查看电机的内部,我们定义了一个隐式剪切函数。这个函数只是两个平面的交点,形成一个剪切“角”。对象vtkImplicitTextureCoords与这个隐式函数结合使用来生成纹理坐标。然后用适当的纹理贴图渲染这些对象,可以看到电机的内部部件。

纹理映射由三个区域组成(如前面章节所述)。隐藏区域是透明的。过渡区域是不透明的,但具有黑色(零强度)的颜色。突出的区域是完全强度和不透明的。从图9 - 53中可以看到,边界呈现为黑色边框,视觉效果很好。

纹理技术的重要性在于,我们可以改变对象的外观,甚至可以毫不费力地执行裁剪等建模操作。我们只需要改变纹理贴图。这个过程相对于几何建模的替代方法要快得多。同时,

图9-52应用连通性和抽取滤波器去除噪声等值面,减少数据大小(deciPineRoot. net)。tcl)。数据来自256

松树根系体积数据。

图9-53电机内部结构纹理图两个切割平面与透明纹理(马达)结合使用。tcl)。

纹理的硬件支持越来越普遍。因此,尽管视觉复杂度明显增加,但渲染率仍然很高。

狄洛尼三角剖分

Delaunay三角剖分是一种利用非结构化点数据构建拓扑结构的方法。在二维中,我们生成三角形(即非结构化网格或多边形数据集),而在三维中,我们生成四面体(即非结构化网格)。图像数据的典型例子包括空间中测量的点,或者多维数据的维度子集。

在图9 - 54的例子中,我们展示了如何从一个点场创建一个2D德劳内三角剖分。这些点是通过在区间内生成随机的x和y坐标值来创建的,并将z值设置为恒定值(即,这些点位于x-y平面上)。然后对这些点进行三角剖分,并使用管形和球面符号突出显示三角剖分的结果点和边缘。

关于Delaunay三角测量的一个重要问题是该过程在数值上是敏感的。创建长宽比差的三角形(例如,条子)会导致算法崩溃。如果你有大量的点要三角测量,你可能会考虑随机点的顺序。这种方法倾向于生成具有更好长宽比的三角形,并给出更好的结果。您可能还想考虑其他在数值上更健壮的Delaunay三角测量实现。有关示例,请参见[Edelsbrunner94]。

9.6章节小结

分割立方体是一种标量轮廓化操作,它生成点,而不是像线或多边形这样的表面原语。由于计算机图像分辨率有限,稠密的点云看起来是固态的。

向量场具有复杂的结构。该结构可以使用流带、流曲面和流多边形进行可视化。向量场的拓扑可以用流线连接临界点来表征。

张量场由三个正交向量场组成。向量场是张量场的主特征向量、中特征向量和次特征向量。超流线可以用来可视化张量场。

数据集拓扑操作生成三角形条带,提取连接曲面,并计算曲面法线。抽取是一种多边形减少算法,减少三角形网格中三角形的数量。隐式建模技术可用于构造扫面和体。非结构化点很容易表示,但很难可视化。飞溅,插值和三角测量技术可用来构造非结构化点的结构。对于四维及以上的数据,需要进行多元可视化。在使用标准可视化技术之前,必须将数据映射到三维。并行坐标技术也可用于可视化多变量数据。

建模算法从数据中提取几何结构,降低数据的复杂性或创建几何。空间提取选择位于空间指定区域内的数据集结构和相关数据属性。子抽样通过选择每n个数据点来减少数据。一个相关的技术,数据屏蔽,选择每n个单元格。数据集的子集也可以是

图9-54随机点集二维Delaunay三角剖分点和边用球面符号和管突出显示(DelMesh.tcl)。只显示了生成三角测量的管道。

使用阈值选择,该阈值选择位于标量值范围内的单元格或点。探测在一组点上重新采样数据。探针生成一个数据集,该数据集具有探针的拓扑结构和来自被探测数据集的数据值。在某些系统上,生成三角形条带可以减少存储需求并提高呈现速度。如果数据集有多个不相连的结构,则连接算法可以唯一地识别这些分离的结构。对于没有定义顶点法线的多边形数据,法线生成算法可以计算这些值,这些值适合通过Gouraud或Phong着色进行插值。抽取(Decimation)是另一种数据缩减技术,它删除“平坦”区域中的三角形,并用新的三角形填充产生的空白。非结构化点带来了挑战,因为数据没有拓扑结构。飞溅表示数据中的每个点具有统一的采样,并使用隐式建模技术积累这些飞溅。三角测量技术直接从非结构化点构建拓扑结构。

高级算法多维可视化技术专注于每个点有许多标量数据值的数据。平行坐标是一种有趣的方法,它沿着平行轴绘制数据点的标量值。观察者寻找代表每个点数据的线之间的趋势和关系。

纹理算法使用纹理坐标和纹理映射来选择或突出显示数据集的部分。纹理阈值根据标量值分配纹理坐标。标量值和纹理映射决定如何渲染单元格或单元格的一部分。布尔纹理将这一概念扩展到2D和3D。精心设计的布尔纹理映射允许用隐式曲面组合“裁剪”几何图形。纹理也可以用来动画矢量场。

9.7参考书目

立方体分割是一个有趣的算法,因为它提出了可能性[Cline88]。点原语的渲染和操作非常简单。这种简单性可以用于构建加速图形板、执行3D编辑或构建并行可视化算法。

许多绘图和可视化系统广泛使用地毯图。地毯图相对容易表示和渲染。通常使用2D绘图技术(即忽略灯光和透视效果)。查看[Wang90]以获得渲染地毯图的更多信息。

近年来出现了一些功能强大的矢量可视化技术。这些技术包括流曲面[Hultquist92]、流多边形[Schroeder91]、矢量场拓扑[Helman91] [Globus91]、流球[Brill94]和涡度可视化[Banks94]。流球技术是一种结合隐式建模技术的最新技术。您可能还希望看到参考文献[Crawfis92] [vanWijk93]和[Max94]。这些描述了体绘制和矢量可视化的其他高级技术,这些主题在本文中没有很好地涵盖。

一些抽象而美丽的可视化图像是由于Delmarcelle和Hesselink [Delmarcelle93]。他们对超流线的渲染反映了张量场潜在的美丽和复杂性。

多边形约简是一个相对较新的研究领域。SIGGRAPH ' 92标志着这一主题的两篇论文的发表引起了人们的兴趣[Schroeder92a] [Turk92]。从那时起,许多有价值的技术已经出版。就结果质量而言,最好的技术之一是由[Hoppe93]给出的,尽管它在时间和空间上受到限制,因为它基于形式优化技术。其他有趣的方法包括[Hinker93]和[Rossignac93]。一个有前途的研究领域是多分辨率分析,其中小波分解用于在模型中构建多层细节[Eck95]。该领域的最新工作强调了3D三角形网格的渐进传输[Hoppe96],改进的误差测量[Garland97],以及修改网格拓扑结构的算法[Popovic97] [Schroeder97]。最近有一本关于该技术的广泛书籍,包括地形简化的专门方法[Luebke02]。

三角形条生成是一种有效的技术,可以显著提高渲染速度和减少数据处理。[Evans96]的参考文献描述了其他三角形条生成算法,并提出了一些迄今为止最有效的技术。

使用纹理进行可视化是相对未开发的。这部分是由于大多数图形软件和硬件缺乏纹理支持。现在这种情况正在改变,因为越来越多的供应商支持纹理和软件系统(如OpenGL)为纹理提供API。这里重要的参考文献包括布尔纹理[Lorensen93]和曲面卷积技术[Cabral93] [Stalling95]。

随着该领域的成熟和遇到更复杂的数据,非结构化或无组织的点可视化可能在可视化中发挥突出作用。Nielson等人在这一领域进行了重要的研究[Nielson91]。

多维可视化是可视化研究的另一个重要焦点[Bergeron89] [Mihalisin90]。许多真实世界的数据既是非结构化的,又是多维的。这包括财务数据库、营销统计和多维优化。处理这类数据对于未来在理解和应用方面取得进展非常重要。Feiner [Feiner90]提出了一种结合虚拟现实技术的简单投影方法。[Inselberg87]引入了平行坐标。这些技术已被证明对许多类型的视觉分析是强大的。

9.8参考资料

[bans94]张晓明,王晓明。湍流中的涡管:识别,表示,重建在94年的《可视化学报》上。第132-139页,IEEE计算机协会出版社,洛斯阿拉米托斯,加州,1994年。

[文献文献]李志强。多维数据可视化的参考模型在89年的欧洲制图论文集上。第393-399页,北荷兰,阿姆斯特丹,1989年。

[鲍耶尔81]李文杰。计算狄利克雷镶嵌计算机杂志。24(2): 162 - 166年,1981年。

[j.i ssn . 014]李国强。罗德里安,杰钦,S. V.克里缅科。流球技术的流动可视化。在94年的《可视化学报》上。第225-231页,IEEE计算机协会出版社,洛斯阿拉米托斯,加州,1994年。

[卡布拉尔。用线积分卷积成像矢量场。在SIGGRAPH ' 93, pp. 263-270, Addison-Wesley, Reading, MA, 1993。

[Cline88] H. E. Cline, W. E. Lorensen, S. Ludke, C. R. Crawford,和B. C. Teeter,“三维层析成像的两种算法”。医学物理学。15(3): 320-327, 1988年6月。

[Crawfis92] R, Crawfis and N. Max。三维矢量场的直接体积可视化1992年体可视化研讨会论文集。第55-60页,ACM Siggraph,纽约,1992年。

[陈国强,李国强,李国强,等。“用超流线可视化二阶张量场”IEEE计算机图形学与应用。13(4):男性,1993年。

[Eck95]李志强,李志强,李志强。任意网格的多分辨率分析在议事录SIGGRAPH ' 95。第173-182页,Addison-Wesley, Reading, MA, 1995年8月。382先进的算法[j]。“三维阿尔法形状。”计算机图形学学报。13:43-72,1994。

[埃文斯96]李国强,李国强。“优化三角形条的快速渲染。”《视觉学报》9年6期。第319-326页,IEEE计算机协会出版社,Los Alamitos, CA, 1996。

[Feiner90]李志强。《世界中的世界:探索n维虚拟世界的隐喻》在会议论文集UIST ' 90 (ACM Symp。用户界面软件)。第76-83页,1990年10月。

[加兰97]李国强。“使用二次误差度量的表面简化”在议事录SIGGRAPH ' 97。第209-216页,计算机协会,纽约,1997年8月。

[黄志刚,李志刚。三维矢量场拓扑可视化工具在《可视化学报》91年。第33-40页,IEEE计算机协会出版社,Los Alamitos, CA, 1991。

[He96]何涛,洪丽丽,王世峰。“受控拓扑简化。”IEEE可视化与计算机图形汇刊。2(2): 171-184, 1996年6月。

[Helman91]李国强。流体流动中矢量场拓扑的可视化。IEEE计算机图形学与应用。11(3): 36-46, 1991年。

[Hinker93]李国强。“几何优化。”在《可视化学报》93年。第189-195页,IEEE计算机协会出版社,加州洛斯阿拉米托斯,1993年10月。

[hope93]李志强,李志强,李志强,等。“网格优化。”93年SIGGRAPH学报。1993年8月,第19-26页。

[Hoppe96]霍普。“渐进网格”。在学报SIGGRAPH ' 96。第96-108页,计算机协会,纽约,1996年8月。

[胡尔奎斯特,李国强。在稳定的三维向量场中构造流面在《可视化学报》92年。第171-178页,IEEE计算机协会出版社,Los Alamitos, CA, 1992。

[Inselberg87]丁姆斯代尔。多维几何可视化的平行坐标计算机图形学1987年(计算机图形学国际会议录' 87)。第25-44页,SpringerVerlag, 1987。

[刘志刚,刘志刚,等。n维三角剖分的性质计算机辅助几何设计。3:231 - 246, 1986。

[罗伦森93]李志强。“布尔纹理的几何裁剪。《可视化学报》93年。第268-274页,IEEE计算机协会出版社,加州洛斯阿拉米托斯出版社,1993年10月。

[刘志刚,李志刚,李志刚,等。3D图形的细节级别。摩根·考夫曼2002年。ISBN 1-55860-838-9。[Max94]李国强,李国强。在轮廓曲面附近可视化三维矢量场。在94年的《可视化学报》上。第248-255页,IEEE计算机协会出版社,洛斯阿拉米托斯,加州,1994年。

[j]李志强,李志强。n维晶格上标量场的可视化在《可视化学报》90年。第255-262页,IEEE计算机协会出版社,加州洛斯阿拉米托斯,1990年10月。

[Nielson91]李国强,李国强。分散多元数据的可视化与建模IEEE计算机图形学与应用。11(3): 47-55, 1991年。

[Popovic97]波波维奇。“进行式单纯复合体。”在议事录SIGGRAPH ' 97。第217-224页,协会。《计算机》,1997年8月,纽约。

[中国科学院科学院学报,2001]。用于渲染复杂场景的多分辨率3D逼近。《计算机图形学建模:方法与应用》。B. Falcidieno和T. Kunii编著。, Springer-Verlag Berlin, 1993年版,第455-465页。

[刘志刚,李志刚。流多边形:一种三维矢量场可视化技术在《可视化学报》91年。第126-132页,IEEE计算机协会出版社,加州洛斯阿拉米托斯,1991年10月。

[施罗德992]李国强,李国强。“三角网格抽取。”计算机图形学(SIGGRAPH ' 92)。26(2): 65-70, 1992年8月。

[施罗德,罗伦森,G.蒙塔纳罗,C.沃尔普。]Visage:面向对象的科学可视化系统在《可视化学报》92年。第219-226页,IEEE计算机协会出版社,加州洛斯阿拉米托斯,1992年10月。

[Schroeder, W. Lorensen, S. Linthicum,“隐式模型的扫面和体积”。在94年的《可视化学报》上。第40-45页,IEEE计算机协会出版社,Los Alamitos, CA, 1994年10月。

[施罗德97]李文杰。一种拓扑修正的渐进抽取算法。在《可视化学报》97年。IEEE计算机协会出版社,加州洛斯阿拉米托斯,1997年10月。

[Stalling95] D.失速和h . c。海格。快速独立的线积分卷积1995年SIGGRAPH学报。第249-256页,Addison-Wesley, Reading, MA, 1995。

[土耳其92]李国强。多边形曲面的重新平铺计算机图形学(SIGGRAPH ' 92)。26(2): 55-64, 1992年7月。

[vanWijk93] J. J. vanWijk。“表面颗粒流动可视化”。计算机图形学与应用,13(4):18-24,1993。王志强,王志强,等。基于算法的算法优化[j]。投影网格表面的能见度测定。IEEE计算机图形学与应用。10(4): 1990年第36 -。

[沃森81]杜德华。计算n维Delaunay镶嵌与Voronoi多面体的应用计算机杂志。24(2): 167 - 172年,1981年。

[刘文杰,李文杰,李文杰,等。离散二元和多元数据的Shepard度量插值方法数学。广告样稿。32:253 - 264, 1978。

[亚姆罗;马丁。]“矢量场动画与纹理贴图。”计算机图形学与应用,15(2):22-24,1995。

9.9运动

9.1描述一种使分割立方体适应其他3D单元格类型的方法。您的方法是否适用于1D和2D单元格?

9.2讨论用点表示曲面与用多边形表示曲面的优缺点。

9.3流带可以通过以下两种方法构造:i)将两条相邻的流线与一个曲面连接,或ii)在流线上放置一个带,并根据流向涡量向量将曲面定向。讨论结果可视化中的差异。

9.4编写以下程序来可视化燃烧室中的速度流。

a)使用vtkProbeFilter和vtkHedgeHog。

b)使用vtkProbeFilter和vtkstreamlined。

c)使用vtkProbeFilter和vtkWarpVector。

d)使用vtkProbeFilter和vtkVectorNorm。

e)使用vtkProbeFilter和vtkVectorDot。

9.5描述一种使用任意数据集提取几何图形的方法。

9.6过滤器vtkPolyDataNormals通常与过滤器vtkSmoothPolyData和vtkContourFilter结合使用,以生成光滑的等值面。

a)编写一个类,将这三个过滤器合并为一个过滤器。你能消除中间存储吗?

b) vtkSmoothPolyData在等值面上引入了多少误差?你能想出一个减少误差的办法吗?

c) vtkMarchingCubes和vtkPolyDataNormals创建的表面法线有什么区别?

9.7假设我们有一个数据库,包括利率R、月供P、月收入I和晚交天数l。

a)如果都是定期抽样,你会如何可视化这些数据?

b)如果所有数据都是不规则采样,列出三种可视化方法。

9.8为什么你认为三角形条通常比一般多边形渲染得快?

9.9本章中描述的法线生成技术创建一致定向的表面法线。

a)法线指向封闭曲面的内部还是外部?

b)描述一种技术,使法线指向封闭曲面外。

c)在渲染之前,表面法线可以用来消除可见三角形吗?

9.10描述一种对一个单元进行部分阈值的技术(即,在必要时切割一个单元以满足阈值标准)。可以使用类似于移动立方体的方法吗?

9.11类vtkRendererSource允许我们使用渲染的图像作为纹理映射(或图像数据集)。写一个程序来构造迭代纹理,也就是由重复图像组成的纹理。使用纹理坐标可以生成相同的图像吗?

9.12描述你如何修改抽取算法来处理一般多边形。

9.13本文中的几个例子(例如,deciFran。tcl和deciHawa。tcl)使用类vtkDecimate。修改这些示例以使用拓扑修改渐进抽取算法(在vtkDecimatePro中实现)。你还能减少多少呢?

本书为英文翻译而来,供学习vtk.js的人参考。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值