看48页的“使用VTK Interactors”)Initialize()方法开始了事件循环,和Tcl/Tk命令wm withdraw。确保解释程序配件。当应用开始时Interact不可见。
当运行脚本时,可视化流水线会执行因为绘制过程会请求数据。(窗口曝光事件会使绘制窗口绘制它自己。)只有在流水线执行以后才是关于输入数据的滤波器。如果你希望,你可以通过调用renWinRender手工执行流水线。在你运行这个例子以后,你可能尝试一些事情。首先,通过在绘制窗口中的鼠标动作使用interactor。接着,通过调用cylinders SetResolution12改变圆柱体对象的精度。你可以通过编辑这个例子然后重新执行它来作到这点,或者通过绘制窗口中的u键来产生解释程序GUI而且在那里键入命令。记住,如果你在使用Tcl interactor popup,只有请求数据后你造成的改变才可见,因此接下来用一个renWin Render命令,或者窗口中的鼠标操作来改变。 读入源对象
这个例子类似于前面的例子,只是我们读一个数据文件而不是程序化地产生数据。使用二进制STL数据格式读一个表示多边形数据的立体—平版印刷术文件(suffix。Stl)(参考图4-2和Tcl脚本VTK/Examples/Rendering/Tcl/CADPart.tcl)
注意vtkLODActor的使用。这个Actor改变了它的表达,保留了交互行为。它的默认行为是产生一个点云和线框,边界—盒轮廓代表中介和低水平表达。(看61页的Actor详细水平得到更多信息)。你可能要用一个vtkActor实例代替vtkLODActor来看看不同。
当输入文件改变和重新执行时许多读者没有意识到。例如,如果文件42400—IDGH.stl改变,流水线不会重新执行。你可以手工调用Modified()方法修改对象。这会造成滤波器
及下游部分滤波器的重新执行。
Visualization Toolkit已经限制了,嵌入建模能力。如果你想要使用VTK来编辑和操作复杂模型(e.g,由立体建模器或者建模工具创建的那些),你通常将使用一个阅读器(看185页的“阅读器”)来与数据相接。(其它的选择是输入,被用来吸收完整的场景。看189页的“重要部分”得到更多细节) 4.2使用VTK Interactors
一旦你已经显示了你的数据,你通常想要与其交互。Visualization Toolkit提供了一些方法来作到这点。第一种方法是在vtkRenderWindow中使用built。第二种方法是通过确定事件绑定创建你自己的interactor。不要忘记(如果你在使用解释语言)你可以在运行时输入命令。你也可能希望参考65页的采集来看看如何从屏幕中选择数据。(注意:开发者也可以与他们选择的windows窗口相接。看303页的“windows系统的结合”) vtkRenderWindowInteractor
与你的数据相接的最简单的方式是实例化vtkRenderWindowInteractor。这个类对应了前面定义的事件和行动的集合,而且提供了重载默认行动的一个方法。vtkRenderWindowInteractor允许你控制相机和ractors,而且提供了两种interaction风格:位置感应(i.e.. 操纵杆模式)和行动感应(i.e.. trackball模式)。
vtkRenderWindowInteractor响应了绘制窗口中的以下事件。(注意多个绘制者可以在一个绘制窗口中绘制,而且在绘制窗口中绘制进一个视点。Interactors在一个绘制窗口中支持多个绘制者).
? J键/T键—在操纵杆(位置感应)和trackball(行动感应)之间反复触发。使用操纵杆
模式,只要点击鼠标,一个动作就连续发生。使用行动感应,当点击鼠标和鼠标指针移动时,动作就发生。
? C键/A键—在相机和actor(对象)模式之间反复触发。使用相机模式,鼠标事件影响
了相机位置和焦点。使用对象模式,鼠标事件影响了鼠标指针下的actor。
? 按钮1—把相机围绕它的焦点旋转(如果是相机模式)或者把actor围绕它的原点旋转
(如果是actor模式)。旋转的方向是从绘制器视点的中心到鼠标位置。使用操纵杆模式,旋转的大小由鼠标到绘制窗口中心的距离定义。
? 按钮2—(如果是相机模式)就摇动相机或者(如果是对象模式)就平移actor。使用操
纵杆模式,摇动或者平移的方向是从视点的中心到鼠标位置。使用trackball模式,运动的方向是鼠标移动的方向。(注意:使用一个2—按钮的鼠标,摇动是定义为
? 按钮3—(如果是相机模式)就缩放相机或者(如果是对象模式)就缩放对象。如果鼠
标位置在视点的上半部分就放大/增加比例;如果鼠标位置在视点的底部就缩小比例。使用操纵杆模式,缩放的量由鼠标指针到窗口水平中心线的距离来控制。
? 3键—使绘制窗口进入或者退出立体模式。默认情况下批,创建了红—蓝立体对。某些
系统支持水晶LCD立体眼镜;你必须调用绘制窗口中的SetStereoTypeToCrystalEyes()。 ? e键—退出应用。
? f键—在光标下移向点。这样做设置了焦点,允许围绕着哪个点的旋转。
? p键—执行一个采集操作。绘制窗口interactor有一个用来采集的的vtkPropPicker内部
实例。看65页的“采集”得到更多关于采集的信息。
? r键—沿着当前的视场方向重新设置相机视场。把actors放到中间而且移动相机因此所
有的actors都是可见的。
? s键—修改所有的actors表示因此它们是表面。
? u键—调用用户—定义方法。通常,这个键会带来一个interactor因此你可以输入命令。
? w键—修改所有的actors表示因此它们是线框。
默认的交互作用模式是位置敏感的(i.e,操纵杆模式)—即,只要鼠标键按下它就一直操作相机或者actor,还有绘制器。如果你不喜欢这个默认行为,你可以改变它,或者写出自己的。(看303页的“vtkRenderWindow Interaction Style”得到更多关于你自己风格的信息。 vtkRenderWindowInteractor有其它有用的特征。调用LightFollowCameraOn()(默认的行为)使光源位置和焦点与相机位置和焦点同步(i.e,创建了一个“headlight”)。当然,这可以使用LightFollowCameraOff()关掉。对应“u”键的一个回叫信号可以使用AddObserver(用户事件)方法添加。设定相关的采集方法也是可能的。AddObserver(开始采集事件)定义了一个被称为比采集更高级的方法,而且AddObserver(结束采集事件)定义了在采集被执行完之后的一个方法。(请看28页的“用户方法,观察者,和命令”得到更多定义了用户方法的信息。)你也可以确定vtkAbstractPicker的一个子类实例通过SetPicker()方法来使用(看65页的“采集”)。
如果你在使用vtkLODActor,你可能希望通过interactor中的SetDesiredUpdateRate()来设定期望的帧频。通常,这是自动操作地(当鼠标按钮被激发时,期望的更新率被增加;当释放鼠标按钮,又返回期望的更新率。)参考61页的“Actors细节”得到更多信息。 前面我们已经看了如何使用vtkRenderWindowInteractor,这里是一个摘要。
Iteractor风格
有两种完全不同的方式来控制VTK中的交互风格。首先使用vtkInteractorStyle的一个子类,或者是系统提供的或者是你自己写的。第二个方法是直接安排事件循环。
vtkInteractorStyle.类vtkRenderWindowInteractor可以支持不同的交互风格。当你在interactor中键入“t”或者“j”键(看前面的部分)你就在trackball模式和操纵杆交互模式之间转换。工作的方式是vtkRenderWindowInteractor发送它收到的任何事件(e.g,鼠标按钮,鼠标运动,击键事件,etc)给它的风格。风格接着负责操纵事件和执行正确的行为。为了看这个风格,使用vtkRenderWindowInteractor::SetInteractorStyle()方法。例如:
(注意:当例示vtkRenderWindowInteractor时,事实上例示了一个窗口—系统特定的绘制窗口。例如,在Unix系统上实际上创建了类vtkRenderWindowInteractor,而且作为vtkRenderWindowInteractor的一个实例返回。在窗口中,例示了vtk Win32RenderWindowInteractor。)
安排时间循环。你可能希望创建你自己的事件绑定。绑定可以使用VTK支持的任何语言来安排,包括C++,Tcl,Python,和Java。(通常你会在你构建GUI的系统中做到这一点。为了得到更多关于把VTK与窗口系统相接的信息,看303页的“Windows系统的整合。)一个例子是查看Wrapping/Tcl/TkInteractor.tcl,它为Tcl/Tk定义了绑定。绑定命令是一个把配件中的事件与一个回叫信号或者函数调用相联系的一个Tcl/Tk命令。 注意绑定与vtkRenderWindowInteractor非常类似。这些绑定就像trackball interactor模式;即,直到鼠标移动时相机才改变。
4.3过滤数据
前面的例子由一个源和投射器对象组成;流水线没有滤波器。本节我们展示如何给一个流水线添加一个滤波器。
使用SetInput()和GetOutput()方法连接滤波器。例如,我们可以修改46页的“绘制源对象”的脚本来压缩组成模型的多边形。脚本如下所示。(只展示了流水线和其它的相干的对象)完整的脚本可以在VTK/Examples/Rendering/Tcl/FilterCADPart.tcl。
如你所看到的,创建一个可视化流水线是简单的。你需要根据手头的任务选择正确的类,保证相连接的滤波器的输入和输出类型是兼容的,而且设定了必要的实例变量。(当输出数据集类型与输入会接受的类型一致,或者是输入类型的一个子类时,输入和输出类型是兼容的。)可视化流水线可以包括循环,尽管一个滤波器的输出不能直接连接到它的输入。 4.4相机控制
你可能注意到在进程脚本中相机或者光源没有被例示。如果你熟悉3D图象学,你知道绘制对象必须要有相机和光源。在VTK中,如果没有直接创建相机和光源,绘制器自动例示它们。 例示相机
以下的Tcl脚本展示了如何用一个绘制器来例示和与一个相机相联系。
可以选择地,如果你希望访问一个已经存在的相机(例如,绘制器已经自动例示的一个相机),在Tcl中你可以使用
让我们来重新回顾一些我们已经介绍的相机方法。SetClippingPlane()有两个论点,沿着视平面法线到最近和最远切割平面的距离。记住在绘制过程中不在这些平面之间的所有图象元素都被删除,因此你需要保证你想要看的对象位于切割平面之间。焦点和位置(在world 坐标)实例变量控制相机的方向和位置。Compute ViewPlaneNormal()重新根据当前位置和焦点设定视平面的法线。(如果视平面的法线不垂直于视平面你可以得到一些有趣的shearing渲染效果。)对ViewUp的设定控制了相机的“上”方向。最后,Zoom()方法通过改变视角(e.g,SetViewAngle())放大对象。你也可以使用Dolly()方法来沿着视平面法线把相机移入和移出而且放大或者缩小可见的actors。