VPython是一套簡單易用的三維圖形庫,使用它可以快速創建三維場景和動畫。和TVTK相比,它更適合於創建互動式的三維場景,而TVTK則更適合於對數據進行三維可視化。本章將通過幾個實例介紹如何使用VPython製作實時、互動式的三維動畫演示程式
基本介紹
- 軟體名稱:VPython
- 開發商:VPython
簡介,製作動畫演示,與場景互動,回響鍵盤事件,回響滑鼠事件,用界面控制場景,創建複雜模型,
簡介
VPython是一套簡單易用的三維圖形庫,使用它可以快速創建三維場景和動畫。和TVTK相比,它更適合於創建互動式的三維場景,而TVTK則更適合於對數據進行三維可視化。本章將通過幾個實例介紹如何使用VPython製作實時、互動式的三維動畫演示程式。
製作動畫演示
用VPython製作動畫的簡單之處在於:只要在一個循環體中不斷地修改場景中的各個模型以及照相機的各種屬性,即可實現動畫效果。
與場景互動
為了和場景中的物體進行互動,VPython提供了如下方便實用的功能:
- 鍵盤和滑鼠事件的處理。
- 控制項視窗和4種控制項(按鈕、滾動條、開關及選單),用於製作簡單的用戶界面。
- 繪圖視窗,用於繪製二維坐標圖。
由於篇幅受限,本書只介紹鍵盤和滑鼠事件的處理,請讀者參考VPython的文檔和演示程式來自學其他部分的內容。
回響鍵盤事件
通過場景視窗對象的kb屬性可以獲得按鍵信息。kb.keys是視窗中等待處理的鍵盤事件的個數,調用kb.getkey()可以從鍵盤事件佇列中獲取一個待處理的事件。如果佇列為空,getkey()將一直等待,直到產生鍵盤事件為止。getkey()的返回值是一個描述按鍵的字元串。下面是一個簡單的鍵盤事件測試程式,可以用它查看各個按鍵的名稱。
回響滑鼠事件
滑鼠事件和鍵盤事件類似,通過場景視窗對象的mouse屬性進行滑鼠事件的處理。滑鼠的坐標是二維視圖平面上的一個點,在三維空間中有一條直線上的點都將投影到這個位置,我們稱此直線為滑鼠射線。scene.mouse是一個mouse_object對象,下面列出它的屬性和方法。為了便於理解,右圖顯示了滑鼠射線和pos、pickpos等屬性之間的關係。
- pos:滑鼠在三維空間中的坐標,此坐標是滑鼠射線與經過點scene.center且平行於螢幕的平面的交點。
- button:描述滑鼠按鍵的字元串,值可以為None、'left'、'right'、'wheel'。此屬性只有在產生事件時才不為None。
- pick:用滑鼠選中的物體對象,與滑鼠射線相交的第一個物體。
- pickpos:滑鼠射線與pick物體的表面的交點坐標。
- camera:當前照相機的位置坐標,旋轉或縮放場景時會發生變化。
- ray:從camera到pos的單位方向矢量,也就是滑鼠射線的方向,它正好和視窗視圖垂直。滑鼠射線在三維空間中的參數方程為camera+t*ray,其中t是一個大於0的任意參數。
- alt、ctrl、shift:Alt、Ctrl、Shift三個按鍵的狀態。
- project():計算滑鼠射線與任意平面的交點,平面由表示法線方向的normal參數和表示平面上某點坐標的point參數指定。因為與螢幕平行的面的法線方向為scene. forward,所以下面語句的計算結果與scene.mouse.pos相同:
scene.mouse.project(normal=scene.forward, point=scene.center) - events:待處理的滑鼠事件的數目。
- getevent():從滑鼠事件佇列中獲取最早的滑鼠事件。如果佇列為空就一直等待事件的發生。
getevent()返回的事件對象保存事件發生時的滑鼠坐標,也具有上述的屬性和方法。除此之外,事件對象還有press、click、drag、drop、release等屬性,它們是描述滑鼠按鍵的字元串,分別是產生“按下”、“單擊”、“拖”、“放”、“鬆開”5種滑鼠事件的按鈕名稱。
用界面控制場景
VPython提供了一種控制視窗,可以放置按鈕、開關及滾動條等簡單控制項,用以實時設定場景中的物體。但是這些控制項不但功能有限,而且不是標準的界面控制項,操作起來不是很方便。本節介紹如何使用TraitsUI製作一個能控制VPython場景的界面。
VPython和TraitsUI各有自己的獨立視窗,TraitsUI界面有自己的訊息循環,而Visual視窗有自己的動畫控制和訊息處理循環。因此我們需要使用多執行緒或多進程方式,讓這兩個循環互不影響。下面是使用多執行緒實現TraitsUI控制場景的完整程式。
創建複雜模型
VPython只提供了一些簡單的立體幾何形狀,如果要創建複雜的物體,就需要用戶自己編寫程式,計算物體的多邊形格線模型數據,並使用faces()將數據轉換為模型進行顯示。
任何一個三維模型都可以用許多三角形的面來表示,對於每個三角形的每個頂點,我們需要計算如下數據:
- 頂點的坐標:三個浮點數表示的三維坐標。
- 頂點的法線方向:三個浮點數表示的三維方向矢量。
- 頂點的顏色:三個浮點數表示的紅、綠、藍顏色分量。
將保存上述數據的三個數組傳遞給faces()即可創建三維模型。對於一個有N個三角形的模型,每個數組的長度都是3*3*N,也可以傳遞一個形狀為(3*N,3)的二維數組。