VTK User\\'s Guide中文版(8)

2019-04-21 14:14

注意我们如何使用vtkAssembly的AddPart()方法来构建层次的。只要没有任意的自引用循环,集合就可以以任意深度被嵌入。注意vtkAssembly是vtkProp3D的一个子集,因此它没有属性的概念或者一个相关投射器的概念。因此,vtkAssembly的叶层次节点必须带有材料属性(颜色等)的信息,和任意的相关几何。Actors也可能被一个以上的集合使用(注意coneActor如何在集合中使用并且作为绘制器)同样,绘制器的AddActor()方法被用来把集合的顶部和绘制器联系起来;这些在集合层次中是低层的actors不需要被添加到绘制器上因为它们是递归地被绘制。

你可能要考虑如果一个以上的集合使用了一个actor,或者与一个集合混合时,如上面例子所示,如何把actor的使用与它的上下文区别开。(这在像采集那样的行为中特别重要,那里用户可能需要知道哪个vtkProp被采集和被采集的上下文。)我们随着类vtkAssemblyPath的引入解释了这个问题,它是与变换矩阵相关的vtkProps的一个有序列表,(如果有的话),在65页中仔细讲述了“采集”的细节。

类vtkVolume被用来进行体绘制。像vtkActor那样,vtkVolume继承了vtkProp3D的方法来对体进行定位和定向。vtkVolume有一个相关的属性对象,这种情况下是一个vtkVolumeProperty。请看136页的“体绘制”得到对vtkVolume使用的一个深入描述和体绘制的描述。

vtkLODProp3D

类vtkLODProp3D类似于vtkLODActor(看61页的“细节层次Actors”)它使用不同的表示来得到交互帧频。不同于vtkLODActor,vtkLODProp3D同时支持体绘制和表面绘制。这意味着你可以使用体绘制应用中的vtkLODProp3D来得到交互帧频。以下的例子展示了如何使用类。

基本上,你创建了对应一个不同的绘制复杂度的投射器,而且把投射器添加到vtkLODProp3D上。AddLOD()方法接收了体或者几何投射器,和随意地一个文理图片和属性对象。(根据你希望提供的信息对这个方法有不同的鲜明特征)。域中的最后一个值是绘制的一个估计时间。通常你把它设为0来表示没有初始的估计。这个方法返回可以用来访问适当的LOD的一个整数id。(i.e,选择一个层次或者删除它)

vtkLODProp3D测量了用来绘制每个LOD的时间而且把它们适当地排序。接着,根据绘制窗口的期望更新率,vtkLODProp3D选择了合适的层次来绘制。看162页的“使用一个vtkLODProp3D来提高效率”得到更多的信息。 4.7使用纹理

纹理投射是创建现实的,引人注目的可视化的一个强大的图象工具。2D纹理投射背后的基本思想是图象可以在绘制过程中被“糊制”到一个表面,因此创建了更丰富且更细节的图象。纹理投射需要两块信息:在VTK中是一个vtkImageData数据集(i.e,一个2D图象)的一个纹理图片;和控制一个表面上纹理定位的的纹理坐标(注意:3D纹理也是可能的,但是并不广泛地被多数绘制硬件支持。)

以上的例子(图4-5)揭示了纹理投射的使用(看VTK/ Examples/Rendering/Tcl/Tplane.tcl)。注意纹理图片(为vtkTexture类)与actor相关,而且纹理坐标来自平面(当创建平面时由

vtkPlaneSource生成纹理坐标)

很多情况下纹理坐标是不可见的,通常是因为它们不是在流水线上生成。如果你需要产生纹理坐标,参考112页的“产生纹理坐标”。同样,你应该注意到当图象硬件/库(e.g,OpenGL)只支持二维纹理图片时(e.g,128*256等等)在VTK中不为二维的纹理会被自动重新采样为二维,这在某些应用中会产生效果) 4.8采集

采集是一个通用的可视化任务。采集被用来选择数据和actors,或者询问潜在的数据值。当选择并且使用一个显示位置(i.e,像素坐标)来调用vtkAbstractPicker的Pick()方法时,进行一个采集。根据采集类类型的不同,从采集中返回的信息可能同x-y-z全局坐标一样简单,或者可能包括所有的单元ids,点ids,单元参数坐标,被采集的vtkProp实例,和/或集合路径。采集方法的语法如下。

注意采集方法需要一个绘制器。与绘制器相关的actors是采集选择的候缺者。同样,选择通常也被设定为0.0——它与z—缓冲器上的深度有关,(这个方法不直接调用。而且用户与安排采集的类vtkRender交互。这种情况下,用户通过把采集类的一个实例赋予vtkRenderWindowInteractor控制这个采集过程,我们会在以下的例子中看到)

Visualization Toolkit支持不同功能和效果的某些类型的采集者(请看图14-12,它是采集类层次的一个说明)类vtkAbstractPicker作为所有采集者的基类。它定义了一个允许用户使用GetPickPosition()方法检索采集位置(在全局坐标中)的最小API。

存在vtkAbstractPicker的三个直接类。第一个,vtkWorldPointPicker,是一个使用z—缓冲器返回x-y-z全局采集位置的快速(通常用硬件)采集类。可是,没有返回其它信息(关于被采集的vtkProp,etc)。类vtkAbstractPropPicker是vtkAbstractPicker的其它的直接子类。它定义了可以采集一个vtkProp实例的采集者的一个API。在这个类中有一些方便的方法允许返回一个采集类型的检索。这些方法的功能通过调用采集者上的GetPath()和使用IsA()方法定义类型来得到。

? GetProp()——返回被采集的vtkProp实例。如果采集了任何根本的东西,那么这个方

法会给vtkProp实例返回一个指针,否则返回NULL。

? GetProp3D()——如果采集了vtkProp3D的一个实例,返回一个指向vtkProp3D的指

针。

? GetActor2D()——如果采集了vtkActor2D的一个实例,返回一个指向vtkActor2D的

指针。

? GetActor——如果采集了vtkActor的一个实例,返回一个指向vtkActor的指针。

? GetVolume()——如果采集了vtkVolume的一个实例,返回一个指向vtkVolume的指

针。

? GetAssembly()——如果采集了vtkAssembly的一个实例,返回一个指向vtkAssembly

的指针。

? GetPropAssembly()——如果采集了vtkPropAssembly的一个实例,返回一个指向

vtkPropAssembly的指针。

小心这些方法。类(和它的子类)返回关于被采集的集合路径的顶层信息。因此如果你有一个顶层是类型vtkAssembly,叶节点是类型vtkActor的一个集合,方法GetAssembly()会返回一个NULL指针(i.e,不是vtkActor)。如果你有一个包括集合,actors,和其他Props类型的的一个复杂场景,,可以采用的最安全的方法是使用GetProp()方法来决定是否采集了任何根本的东西,接着使用GetPath()。

有vtkAbstractPropPicker的一个直接子类。vtkPropPicker使用硬件采集来决定被采集的vtkProp实例,和采集位置(在全局坐标中)。它通常比vtkPicker和它的子类快,但是不能返回关于采集了什么单元的信息,etc。警告:使用某些图象硬件(特别是低价PC板),采集操作实施地并不适当。这种情况下,你必须使用vtkAbstracPicker的一个软件版本(接下来描述的三个类中的一个)

vtkAbstracPicker的第三个子类是vtkPicker,根据它们的bounding 盒子选择vtkProp的一个基于软件的采集者。它的采集方法从相机位置发出一条光线,穿过选择点与每个Prop3D的bounding 盒子相交;当然,可能采集了一个以上的Prop3D。返回根据沿着光线的它的bounding 盒子交叉点的“最近的”Prop3D。(可以使用GetProp3Ds()方法来得到所有的bounding 盒子被交叉的Prop3D)。vtkPicker相当快但是不能产生一个单一的采集。

vtkPicker有两个可以用来检索关于更多被采集的(e.g,点ids,单元ids,etc)细节信息的子集。vtkPropPicker选择了一个点而且返回了点id和坐标。它通过从相机位置发出一条光线,穿过选择点,而且把位于容许量范围内的那些点投射到光线上。沿着它的相关actor选择离相机位置最近的被投射的点。(注意:实例变量Tolerance表达为一个绘制器窗口的对角线长度的一个片断)vtkPointPicker比vtkPicker慢但是比vtkCellPicker快。它不能总是返回一个唯一的采集是因为被调用的tolerance。

vtkCellPicker选择了一个单元而且返回关于交叉点(单元id,全局坐标,和参数单元坐标)的信息。通过发出一条光线,而且与每个actor的主要几何上的所有单元相交,决定在一个特定的tolerance范围内是否每个都与这个光线相交来进行这个操作。沿着特定光线,沿着它的相关actor选择离相机位置最近的单元(注意:实例变量Tolerance在交互计算过程中被使用,而且你可能需要用这个值进行实验来得到满意的行为。)vtkCellPicker是所有采集者中最慢的,但是提供了最多的信息。它会产生在特定的tolerance范围内的一个独特的采集。

某些事件被定义用来与采集操作相交。采集者调用优于执行采集操作的StartPickEvent。EndPickEvent在完成采集操作之后被调用。每当采集了一个actor时调用了PickEvent和actor的PickEvent。

vtkAssemblyPath

如果你要在一个场景中使用不同类型的vtkProp执行采集操作,特别是如果场景包括vtkAssembly实例,对类vtkAssemblyPath的一个理解是重要的。vtkAssemblyPath是简单的vtkAssemblyNode的一个有序列表,那里每个节点包括一个vtkProp指针,和一个可选择的

vtkMatrix4*4。列表的顺序是重要的:列表的开始表示根,或者在一个集合层次上的顶层;列表的结束表示集合层次上的一个叶节点。节点的顺序也影响相关的矩阵。每个矩阵是节点的vtkProp矩阵与前面列表中矩阵的串联。因此,对于一个给定的vtkAssemblyNode,相关的vtkMatrix4*4代表了vtkProp的位置和方向。(假设vtkProp最初没有被转换) 例子

通常,采集被vtkRenderWindowInteractor自动地安排(使用48页的“使用VTK交互者”得到更多关于交互者的信息)例如,当压下p键时,vtkRenderWindowInteractor用vtkPropPicker的内部实例调用一个采集。你可以接着向vtkRenderWindowInteractor要求它的采集者,而且收集你需要的信息。你也可以为vtkRenderWindowInteractor确定一个特定的vtkAbstracPicker实例来使用,如以下脚本所示。一个例子数据集合的结果如图4-6。这个例子的脚本可以在VTK/ Examples/Annotation/Tcl/annotatePick.tcl)中找到。

这个例子使用一个vtkTextMapper在屏幕上绘制采集的world坐标(看71页的“Annotation”得到更多信息)。注意我们登记 EndPickEvent在采集发生后执行setup调整。当采集完成时,配置这个方法来调用annotatePick()程序。 4.9vtkCoordinate和Coordinate系统

Visualization Toolkit支持不同的坐标系统,而且类vtkCoordinate安排了它们之间的变换。被支持的坐标系统如下。

? DISPLAY——(绘制)窗口中的x-y像素值。(注意vtkRenderWindow是vtkWindow的

一个子类)原点是左下角(对于以下描述的所有2D坐标系统是对的)


VTK User\\'s Guide中文版(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:数学分析十三章讲义

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: