第04章-VTK基础(2)

【译者:这个系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),因为时间关系。我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容。敬请期待^_^。

欢迎转载,另请转载时注明本文出处,谢谢合作!同一时候。因为译者水平有限,出错之处在所难免,欢迎指出订正!

【本小节内容相应原书的第45页至第48页】

4.2使用VTK交互器

对数据进行可视化时,通常都希望与这些数据进行交互。VTK提供多种数据交互的方法。第一种方法是使用vtkRenderWindowInteractor类,另外一种方法是通过绑定特定的事件定制自己的交互类。假设是使用解释性语言的话。还能够在程序执行时输入命令与之交互。

能够參考本章“拾取”(Picking)一节,了解怎样从屏幕上选择数据。(注意:开发者也能够选择窗体系统接口。具体内容请參考第18章。

vtkRenderWindowInteractor

与数据进行交互最简单的方法就是实例化一个vtkRenderWindowInterator对象。该类会响应一系列预先设置的事件和动作,并且也提供了重载缺省动作的方法。通过这个类能够控制渲染场景的相机和Actor,包含两种交互风格:位置敏感型(position sensitive。即joystick模式)和动作敏感型(motionsensitive,即trackball模式)。

(后面的章节会具体介绍交互风格方面的内容。)

vtkRenderWindowInterator能够响应下面的渲染窗体事件。(一个渲染窗体能够关联多个渲染器,当中渲染器绘制在渲染窗体的视口里,交互器支持一个渲染窗体拥有多个渲染器。)

  • 按键j和按键t—— joystick(位置敏感型)和trackball(动作敏感型)模式之间的切换。joystick模式下,仅仅要鼠标按下动作就持续发生;trackball模式下,鼠标按下且移动时动作才产生。
  • 按键c和按键a——相机和Actor(对象)模式之间的切换。相机模式下。鼠标事件对相机的位置和焦点起作用。对象模式下,鼠标事件作用于鼠标指针下的actor。
  • 鼠标左键—— 相机模式下绕焦点旋转相机;对象模式下绕原点旋转actor。

    旋转方向是从渲染器视口的中心指向鼠标所在的位置。joystick模式下。旋转速度取决于鼠标的位置与视口中心的距离大小。
  • 鼠标中键—— 相机模式下滚动中键能够实现相机镜头的拉伸(Pan);对象模式下中键能够平移actor。joystick模式下,镜头拉伸或平移的方由从视口中心指向鼠标所在的位置;trackball模式下。actor运动的方向与鼠标运动的方向一致。(注意:假设是两键鼠标,镜头的拉伸/对象的平移操作能够用按键<shift>+鼠标左键完毕。)
  • 鼠标右键—— 相机模式下能够实现相机镜头的拉伸(Zoom);对象模式下能够实现actor的缩放。按下鼠标右键且朝视口上半部分移动鼠标时,就是镜头的拉近/actor的放大;按下鼠标右键且朝视口的下半部分移动鼠标时,就是镜头的拉远/actor的缩小。joystick模式下。镜头拉伸的快慢或actor缩放速度取决于鼠标所在的位置与视口水平中心线的距离。
  • 按键3—— 激活或关闭渲染窗体的立体模式(stereo mode)。

    缺省情况下。会创建红-蓝立体对(red-bluestereo pairs)。对一些支持Crystal Eyes LCD立体眼镜的。必须调用方法SetStereoToCrystalEyes()实现该功能。
  • 按键e/q—— 退出应用程序。
  • 按键f—— 移动actor到光标的当前的位置。设置当前光标所在的位置为焦点,并且会以该点为旋转中心。
  • 按键p—— 运行拾取(pick)操作。渲染窗体交互器内部有一个vtkPropPicker实例,可实现拾取功能。具体内容參考本章“拾取”一节。
  • 按键r—— 沿当前视场的方向重置相机。移动相机和actor使全部的对象都可见。
  • 按键s—— 改变全部actor的显示形式为表面模型。
  • 按键u—— 调用用户自己定义方法。(在Tcl/Tk脚本程序下)一般会弹出交互窗体。能够输入命令进行交互。
  • 按键w—— 改变全部actor的显示形式为线框模型。

默认的交互风格是位置敏感型(即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}

交互风格Interactor Styles

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。具体内容请參考第十八章。

时间: 2024-10-13 06:53:44

第04章-VTK基础(2)的相关文章

第04章-VTK基础(7)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本小节内容对应原书的第83页至第87页] 4.16 动画 动画是可视化等系统的重要模块: 通过

第04章-VTK基础(5)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本小节内容对应原书的第63页至第70页] 4.11 文本标注 VTK提供了两种方法用于标注图像

第04章-VTK基础(4)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本小节内容对应原书的第52页至第63页] 4.6 控制3D Props VTK中的渲染窗口渲染

第04章-VTK基础(3)

ExecutorService 建立多线程线程池的步骤: 线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量,其他线程排队等候.一个任务执行完毕,再从队列的中取最前面的任务开始执行.若队列中没有等待进程,线程池的这一资源处于等待.当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了:否则进入等待队列. 为什么要用线程池: 1.减少了创建和

第04章-VTK基础(6)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本小节内容对应原书的第70页至第83页] 4.13 数据变换 在4.6节里的"Ass

第04章-VTK基础(1)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本小节内容对应原书的第41页至第45页] 这一章通过一系列典型的例子介绍VTK的功能.重点在于

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第04章 | 字典

第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中,键可以使字符,数字,或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每个键都是由坐标值组成的元祖 存储文件修改的次数,文件名作为键 数字电话/地址薄 函数传递值def func(x,*args,**args): 如果要建公司员工与座机号的列表,如果要获得Alice的座机只能这么找 >>> names   = ['Alice','Bob','Tom'] >>> n

xcode江湖录-第04章 风水宝地--界面生成器之StoryBoard简单示例 与 约束

第04章风水宝地--界面生成器之StoryBoard简单示例 ??如何设置转场动画?? ??如何在参与到转场动作中?? ??如何让页面跳转到自定义VC?? ??如何设置自定义跳转模式?? ??如何用StoryBoard中的VC生成对象?? 01:新建SingleViewApplication,命名为StoryBoardTest. 02:打开Main.Storyboard,如下: 03:通过Object Library选中View Controller(A controller that mana

《Python学习手册 第五版》 -第16章 函数基础

前面的章节讲解的是一些基础数据类型.基本语句使用和一些文档查看的内容,这些都是一些基础,其实还谈不上入门,只有了解了函数,才算入门 函数是编程里面使用最多的也是最基本的程序结构, 本章重点内容 1.函数 1)什么是函数? 2)为什么使用函数? 2.编写函数 1)函数的基本格式 2)定义和调用函数 3)函数的多态.局部变量 接下来针对本章重点,展开详细的说明 1.函数 1)什么是函数? 这里没有严格的定义,用通俗易懂的方式来说: 函数就是将一些语句集合在一起的组件,从而让他们能够不止一次的在程序中