标签:vtk vtk users guide vtk用户指南 tcl vtk中文
对数据进行可视化时,通常都希望与这些数据进行交互,VTK提供多种数据交互的方法。第一种方法是使用vtkRenderWindowInteractor类,第二种方法是通过绑定特定的事件定制自己的交互类。如果是使用解释性语言的话,还可以在程序运行时输入命令与之交互。可以参考本章“拾取”(Picking)一节,了解如何从屏幕上选择数据。(注意:开发人员也可以选择窗口系统接口,详细内容请参考第18章。)
与数据进行交互最简单的方法就是实例化一个vtkRenderWindowInterator对象。该类会响应一系列预先设置的事件和动作,而且也提供了重载缺省动作的方法。通过这个类可以控制渲染场景的相机和Actor,包括两种交互风格:位置敏感型(position sensitive,即joystick模式)和动作敏感型(motionsensitive,即trackball模式)。(后面的章节会详细介绍交互风格方面的内容。)
vtkRenderWindowInterator可以响应以下的渲染窗口事件。(一个渲染窗口可以关联多个渲染器,其中渲染器绘制在渲染窗口的视口里,交互器支持一个渲染窗口拥有多个渲染器。)
默认的交互风格是位置敏感型(即joystick模式),也就是说,只要鼠标按下就可以持续控制相机或actor以及渲染器。如果不喜欢这种缺省风格,你可以替换或者创建自己的交互风格。(参考第十八章了解有关编写交互风格的内容。)
vtkRenderWindowInteraction还有其他一些有用的特性。调用LightFollowCameraOn()方法(默认的行为)可以使相机位置和焦点与光源的位置和焦点同步(即创建“headlight”)。当然,也可以调用LightFollowCameraOff()关闭该功能。响应“u”键的回调函数可以通过AddObserver(UserEvent)方法进行设置。也可以设置一些与拾取有关的方法。AddObserver(StartPickEvent)定义了拾取之前调用的方法,而AddObserver(EndPickEvent)定义的是拾取完成后调用的方法。(详细内容可参考第三章“用户事件、观察者及命令模式”一节。)同样,你也可以实例化一个vtkAbstractPicker子类的对象,通过vtkRenderWindowInteractor里的方法SetPicker()设置拾取类型。(参考本章“拾取”一节。)
针对某一个Prop如果你想在交互速度与渲染质量方面取得平衡,可以通过交互器里的方法SetDesiredUpdateRate()设置期望的帧更新速率(Desiredframe rate)。正常情况下,这些会自动进行处理的。(当鼠标处于活动状态时,期望渲染帧率(Desired update rate)会提高;当鼠标松开时,期望渲染帧率会降回原来的值。)参考本章的“Level-Of-DetailActors”,“vtkLODProp3D”以及第七章“体绘制”方面的内容,了解更多的关于Prop以及与之相关联的mapper是如何调整渲染风格以达到期望的帧更新速率的。
前面已经介绍了vtkRenderWindowInteractor的使用方法,现摘要如下:
vtkRenderWindowInteractoriren iren SetRenderWindow renWin iren AddObserver UserEvent {wm deiconify.vtkInteract}
VTK有两种不同的方法可以控制交互风格。第一种是使用vtkInteractorStyle的子类,可以是VTK自带的或者是你自行编写的类。第二种是添加Observer监听vtkRenderWindowInteractor里的事件,定义一系列回调函数(或命令)来实现交互。(注意:3D Widget是另外一种与渲染场景中的数据进行交互的更加复杂的方式,可以参考本章的“3D Widget”一节了解更多的信息。)
vtkInteractorStyle. 类vtkRenderWindowInteractor可以支持不同的交互风格。交互时键入“t”或者“j”可以在trackball和joystick两种交互模式之间切换(见前面的内容)。vtkRenderWindowInteractor可以将特定的窗口系统事件(如鼠标按下,鼠标移动,键盘事件等)转换成MouseMoveEvent, StartEvent等VTK事件。(参考第三章“用户事件、观察者及命令模式”一节。)不同的交互风格可以监听特定的事件,然后执行与之相关联的动作。通过vtkRenderWindowInteractor::SetInteractorStyle()方法可以设置不同的交互风格,比如:
vtkInteractorStyleFlightfightStyle vtkRenderWindowInteractoriren iren SetInteractorStyle flightStyle
注意:实例化vtkRenderWindowInteractor后,实际上就是实例化一个与特定的窗口系统相关的交互器实例,例如, UNIX系统下,当建立一个vtkRenderWindowInteractor实例时,实际上建立的是vtkXRenderWindowInteractor实例,而Windows系统下就是建立一个vtkWin32RenderWindowInteractor实例。
添加vtkRenderWindowInteractorObservers. 虽然VTK里已经有大量的交互风格可供使用,但你也可根据应用程序的需要自行定制其他的交互风格。C++里做法一般是从vtkInteractorStyle派生出子类(参考第十八章“vtkRenderWindowInteraction Style”的内容),但对于解释性语言(如Tcl, Python或Java)来说,这样做就比较困难。对于这些解释性语言,最简单的方法就是使用Observer来绑定特定的事件进行交互(参考第三章“用户事件、观察者及命令模式”一节)。这种绑定适用于VTK支持的任何语言,包括C++,Tcl, Python和Java,VTK/Examples/GUI/Tcl/CustomInteraction.tcl这个Tcl例子看到这种用法。下面的代码就是从这个例子摘抄出来的,看看这种绑定是如何进行的。
vtkRenderWindowInteractoriren irenSetInteractorStyle "" irenSetRenderWindow renWin #Add the observers to watch for particular events. These invoke #Tcl procedures. setRotating 0 setPanning 0 setZooming 0 irenAddObserver LeftButtonPressEvent {global Rotating; set Rotating 1} irenAddObserver LeftButtonReleaseEvent {global Rotating; set Rotating 0} irenAddObserver MiddleButtonPressEvent {global Panning; set Panning 1} irenAddObserver MiddleButtonReleaseEvent {global Panning; set Panning 0} irenAddObserver RightButtonPressEvent {global Zooming; set Zooming 1} irenAddObserver RightButtonReleaseEvent {global Zooming; set Zooming 0} irenAddObserver MouseMoveEvent MouseMove irenAddObserver KeyPressEvent Keypress procMouseMove {} { … set xypos [iren GetEventPosition] set x [lindex $xypos 0] set y [lindex $xypos 1] ... } procKeypress {} { set key [iren GetKeySym] if { $key == "e" } { vtkCommand DeleteAllObjects exit } … }
这个例子关键的一步是调用SetInteractorStyle(“”)方法关闭缺省的交互风格,然后加入关联适当的Tcl过程的Observer来监听特定的事件。
这个例子是一个简单的介绍如何加入事件绑定的Tcl脚本程序,如果你想使用Tcl/Tk创建完整的包含用户图形界面的应用程序,可以使用类vtkTkRenderWidget,详细内容请参考第十八章。
标签:vtk vtk users guide vtk用户指南 tcl vtk中文
原文地址:http://blog.csdn.net/www_doling_net/article/details/29651377