1. 程式人生 > >第04章-VTK基礎(2)

第04章-VTK基礎(2)

輸入 per 系統 相關 bsp 開發者 框模型 bject -h

【譯者:這個系列教程是以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。具體內容請參考第十八章。


第04章-VTK基礎(2)