王 利,向 陽
(武漢理工大學 能源與動力工程學院,湖北 武漢 430063)
Virtools中的透視變換和逆透視變換方法
王 利,向 陽
(武漢理工大學 能源與動力工程學院,湖北 武漢 430063)
Virtools開發的虛擬現實項目中,涉及采用鼠標控制虛擬空間物體移動的操作,而Virtools自帶的BB無法滿足需求,需要采用VSL語言編寫控制程序代碼,而程序的核心就涉及透視變換和逆透視變換的原理。文章簡述了透視變換和逆透視變換的基本原理,并演示了Virtools中程序實現的方法。
Virtools;透視變換;逆透視變換
Virtools是法國達索公司推出的一款三維虛擬現實開發軟件,已經被廣泛地應用到了游戲開發、工業仿真和虛擬教學培訓等領域。目前市場上進行虛擬現實開發的軟件平臺有許多種,如Unity3D等,這些軟件平臺需要開發者有很好的軟件編程語言基礎,如C#、Java等,而Virtools與其他開發軟件平臺最大的不同之處在于,Virtools不需要使用者編寫代碼,而是按照一定的邏輯關系,將一些具有特性功能的Building Blocks(簡稱BB),采用拖放的方式,放置到特定對象(Object)或者角色(Character)的腳本(Script)編輯區域,并用連線將這些BB按照一定的動作邏輯關系連接起來,從而形成一個完整的虛擬交互功能。當開發的項目需要更加復雜的功能,而BB實現過于繁雜時,Virtools提供了VSL腳本語言和SDK開發包。通過結合BB,VSL腳本語言和SDK開發包,可以更方便和出色地完成項目的工作?;谝陨系膬烖c,Virtools在理論教學和實踐教學中得到了廣泛的應用。
Virtools虛擬現實平臺因其開發的便利性而在高校的虛擬實踐教學中得到了廣泛的應用。錢琨等[1]基于Virtools構建了虛擬的數字設備與裝備,用于完成技能鑒定、考核和聯系的需要;岳青松等[2]基于Virtools開發了水電機組的虛擬拆裝操作系統用于培訓檢修人員的專業技能;王盼盼[3]基于Virtools開發了虛擬測繪系統用于教學實踐中。戚曉利等[4]基于Virtools開發了輥式破碎機虛擬實驗教學平臺;陳浩[5]等基于Virtools開發了機械裝備的虛擬拆卸平臺用于生產培訓。在類似這些項目中,常常需要通過電腦的鼠標來操控虛擬現實作品中的物體,鼠標光標在二維屏幕平面上移動,而物體處在三維坐標系表示的虛擬空間中,要實現二維的鼠標移動來拖拽三維空間物體運動。而在Virtools平臺中,沒有現成BB可用,要實現鼠標點選操作虛擬三維空間物體移動的功能,要采用Virtools的編程語言VSL寫程序代碼,在程序的開發過程中需要運用透視變換和逆透視變換技術。
透視變換的原理就是通過一系列的轉換,將虛擬三維空間中的物體,形成一個二維的畫面顯示在屏幕上。通過人從窗口看屋外風景的例子來描述其透視變換過程為:假設處在房間內的某人通過窗戶上的玻璃來觀察外面的風景如圖1所示。如果將玻璃作為計算機屏幕,來臨摹窗外所看到的景物,可以得到如圖2所示的窗戶上的臨摹圖和窗外實際風景圖的對比,通過圖2可知,窗戶外邊是現實的三維世界,而窗戶玻璃上是平面圖形。三維世界的物體就這樣被映射到了二維的畫面上。通過程序來實現這樣的功能,稱為透視變換。

圖1 透視變換示例

圖2 窗戶臨摹窗外風景的對比
在虛擬現實中實現透視變換,窗外的風景相當于虛擬現實場景中的3D模型,觀察人的位置相當于虛擬三維世界中攝像機的位置,而窗戶相當于屏幕。通過三點共線原理(如圖3所示),使得虛擬三維世界中的物體與攝像機之間的連線與屏幕之間的交點,就可以得出三維空間的物體在二維屏幕上的位置。

圖3 三維空間的二維變換
逆透視變換是透視變換的逆過程,就是將屏幕上二維鼠標的運動轉換到虛擬三維世界中物體的運動。在程序中實現的基本過程是,先得到鼠標單擊點出的屏幕坐標,通過攝像機和鼠標點擊處形成一條射入虛擬場景中的射線,如果該射線與虛擬場景中的3D物體相交,則獲取該物體的信息,包括物體的名稱、交點的位置、方向及交點與攝像機之間的距離。這樣就實現了通過屏幕上二維鼠標確定虛擬現實場景中三維物體的方法。
在Virtools中有兩種透視變換方法,分別是“透視投影”和“平行投影”。透視投影中離攝像機越遠的物體投影到屏幕上后越小,距離攝像機越近的物體投影到屏幕后就越大,這很符合人類眼睛看世界的規律;而平行投影是把三維場景投影成一張平面地圖,沒有遠近大小之分。絕大多數虛擬現實項目采用的是透視投影。
在Virtools中,實現透視變換和逆透視變換,并能夠通過鼠標控制零件移動所涉及的程序指令為:GetInputManagerGuid(),它的作用是得到輸入設備的全局唯一標識符,將該標示符作為輸入參數傳給函數bc.GetMangerByGuid()就可以得到輸入設備iM標示的輸入設備。函數iM.GetMousePosition(pos2D,FALSE)中的第一個參數可以得到鼠標的位置,但是這個位置的值由第二個參數設置,如果為true,則鼠標的(0,0)是顯示器的左上角的(0,0)
位置;如果為false則鼠標的(0,0)位置是當前程序窗口的(0,0)位置。ScreenToViewpoint這個函數的功能是根據2D的屏幕坐標求一個3D的坐標,這種用法一般用在一些3D物體固定在攝影機前的位置,跟隨攝影機一起移動,該算法是以攝影機為起點,以鼠標制定的場景中某一點求一條射線。
rcx.ScreenToViewpoint(pos2D,pos3D,FALSE)就是把屏幕的2D位置轉換成3D位置的函數,第一參數使輸入一個要轉換的2D位置,比如鼠標的位置;第二個參數使一個Vector變量,當函數調用成功后,轉換的結果存儲在這個變量中;第三個變量為bool型,當其為true時,表示第一個參數的鼠標位置是以桌面左上角的(0,0)為原點的坐標位置;當其為false時,表示第一個參數的鼠標位置是以應用程序窗口左上角的(0,0)為原點的鼠標位置。
根據屏幕的2D位置得到3D位置,反過來也可以通過場景中的3D位置得到屏幕坐標,方法就是調用函數Transform即可。
[1]錢琨,譚耀洲,陳文紅.基于Virtools軟件構建的職業技能鑒定模擬考試與訓練系統[J].科技創業月刊,2016(3).
[2]岳青松,葉建波,謝紅彪,等.水電機組虛擬檢修培訓系統軟件平臺開發[J].水電與新能源,2016(1):7-11.
[3]王盼盼.基于Virtools的虛擬測繪系統的設計[J].實驗技術與管理,2015,32(3):148-151.
[4]戚曉利,許健,潘紫微.基于Virtools的虛擬實驗教學研究[J].中國信息技術教育,2015(18):72-75.
[5]陳浩,張桂香,張慶洪.基于Virtools的機械裝備虛擬拆卸系統研究[J].現代制造工程,2015(1):30-34.
10.13939/j.cnki.zgsc.2016.49.089
2014年武漢理工大學自主創新基金,船舶動力設備的虛擬拆裝(項目編號:2014-IV-156)。
王利(1977—),男,漢族,湖北武漢人,博士,講師。研究方向:振動與噪聲控制技術。