王傳喜,趙 剛
(四川大學(xué) 電子信息學(xué)院,四川 成都 610064)
視點(diǎn)是計(jì)算機(jī)圖形學(xué)中的概念,作用類似于攝像機(jī)的鏡頭或者人的眼睛。視點(diǎn)控制的過程,實(shí)質(zhì)上就是模型視圖變換的過程。視點(diǎn)控制包括控制視點(diǎn)位置和控制視點(diǎn)方向,其中視點(diǎn)的位置決定了視點(diǎn)與觀察者之間的距離,視點(diǎn)的方向決定了觀察對(duì)象是否可見。在觀察運(yùn)動(dòng)物體的時(shí)候,為了有充分的時(shí)間觀察它,就需要視點(diǎn)的速度和物體運(yùn)動(dòng)的速度相同。
在Vega環(huán)境中底層化了4種視點(diǎn)定位模式,分別是動(dòng)態(tài)定位視點(diǎn)模式 (Motion Model)、束縛定位視點(diǎn)模式(Tether)、導(dǎo)航路徑定位視點(diǎn)模式(Path Navigator)、手動(dòng)定位視點(diǎn)模式(Manual)[1]。其中束縛定位視點(diǎn)模式包括跟隨束縛、固定束縛、旋轉(zhuǎn)束縛3種模式;Vega環(huán)境中視點(diǎn)控制的過程,類似于人眼觀察環(huán)境的過程。如果視點(diǎn)控制不合理,即使三維模型很精、仿真系統(tǒng)的功能很完備,同樣導(dǎo)致三維視景仿真的效果不佳。
在三維視景仿真的高性能軟件Vega平臺(tái)上,文獻(xiàn)針對(duì)視點(diǎn)的研究有兩類:一是通過調(diào)節(jié)視角觀察一個(gè)靜止的物體[2],另一種是僅僅用Lynx編輯視點(diǎn)[3]。對(duì)用Lynx編輯ADF文件、Vega API編程、外部輸入設(shè)備等,聯(lián)合實(shí)時(shí)動(dòng)態(tài)控制視點(diǎn)的文獻(xiàn)沒有闡述清楚。文中正是基于手動(dòng)定位視點(diǎn)模式,設(shè)置合理的算法,通過Vega API編程和鍵盤聯(lián)合實(shí)時(shí)動(dòng)態(tài)控制視點(diǎn)的。
將運(yùn)動(dòng)的物體A的坐標(biāo)記為A點(diǎn),將運(yùn)動(dòng)的物體B的坐標(biāo)記為B點(diǎn),將線段AB的中點(diǎn)記為M點(diǎn),且M點(diǎn)是焦點(diǎn)。為了實(shí)時(shí)觀察到兩個(gè)運(yùn)動(dòng)物體的全過程,需要合理的設(shè)置視點(diǎn),因此采用延長(zhǎng)BA到C點(diǎn),線段AC的長(zhǎng)度為dAC,設(shè)視點(diǎn)和C點(diǎn)的高度值相同,即視點(diǎn)和C點(diǎn)在同一水平面上,作CN垂直與CB,使線段NC的距離為dNC,則N點(diǎn)的三維坐標(biāo)就是視點(diǎn)的三維坐標(biāo)。其視點(diǎn)與物體空間位置關(guān)系如圖1所示。
圖1 視點(diǎn)與物體空間位置關(guān)系圖Fig.1 Spatial location diagram of the viewpoint and objects
C點(diǎn)和N點(diǎn)都在Z0=z的平面內(nèi),則N(xN,yN,zN),其中:
則N(xN,yN,zN)就是需要定位的視點(diǎn)。
利用上述視點(diǎn)控制算法,在三維視景仿真平臺(tái)Vega上,用Lynx編輯好ADF文件,通過實(shí)時(shí)獲取運(yùn)動(dòng)物體A和運(yùn)動(dòng)物體B的坐標(biāo),調(diào)用視點(diǎn)控制的算法實(shí)時(shí)計(jì)算出視點(diǎn)和焦點(diǎn)坐標(biāo),利用Vega API編程就可以實(shí)時(shí)觀察動(dòng)態(tài)運(yùn)動(dòng)物體A和運(yùn)動(dòng)物體B運(yùn)動(dòng)的全過程、且可以通過鍵盤動(dòng)態(tài)調(diào)節(jié)視點(diǎn)。在編寫Vega程序之前,應(yīng)該清楚Vega程序架構(gòu)和主要執(zhí)行順序等。其系統(tǒng)工作流程圖如圖2所示。
運(yùn)行Vega應(yīng)用程序前,需對(duì)各種參數(shù)初始化,運(yùn)行期間保持參數(shù)的不斷更新。各種參數(shù)都存放在ADF文件中,Lynx界面實(shí)質(zhì)是用來編輯ADF文件的[4]。將需要用的模塊中的特定參數(shù)進(jìn)行修改,其他的參數(shù)使用Lynx界面提供的缺省值。主要配置為:將兩個(gè)運(yùn)動(dòng)體模型、地景模型加入到場(chǎng)景中,設(shè)置運(yùn)動(dòng)模型的運(yùn)動(dòng)模式,利用路徑工具(Path Tool)添加運(yùn)動(dòng)體運(yùn)動(dòng)的導(dǎo)航路徑,將場(chǎng)景運(yùn)動(dòng)體的定位方法設(shè)置成路徑導(dǎo)航。為了滿足實(shí)時(shí)改變觀察者位置的要求,將視點(diǎn)定位方式設(shè)置成手動(dòng)。
圖2 系統(tǒng)工作流程圖Fig.2 Flow chart of the system operation
Vega提供了完整的C語言應(yīng)用程序接口API和豐富的函數(shù)庫(kù)。在用視點(diǎn)模塊設(shè)計(jì)和操作視點(diǎn)時(shí),Vega也提供了相應(yīng)的類和函數(shù)。用Lynx編輯ADF文件,并解算出視點(diǎn)和焦點(diǎn)的位置信息后,在VC6.0的環(huán)境中,調(diào)用Vega API開發(fā)庫(kù)函數(shù)實(shí)現(xiàn)視點(diǎn)調(diào)節(jié)的功能。利用Vega實(shí)時(shí)的獲取兩個(gè)運(yùn)動(dòng)體的位置信息,并通過視點(diǎn)控制算法計(jì)算出焦點(diǎn)M和視點(diǎn)N的三維坐標(biāo)。視點(diǎn)定位方法是視點(diǎn)相對(duì)于運(yùn)動(dòng)體A相對(duì)靜止,因此視點(diǎn)定位采用相對(duì)于本機(jī)的手動(dòng)STATIC視點(diǎn),并使視點(diǎn)始終注視焦點(diǎn)。兩個(gè)運(yùn)動(dòng)體在運(yùn)動(dòng)的過程中,它們的坐標(biāo)位置是不斷變化、持續(xù)更新的,引起焦點(diǎn)也是實(shí)時(shí)變化的。通過Vega API函數(shù)調(diào)節(jié)視點(diǎn)的關(guān)鍵代碼如下:
pos0=vgNewPos();
//新建一個(gè)三維位置
vgPosVec(pos0,xobs,yobs,zobs,0,0,0);
//對(duì)三維位置賦值
vgProp(obs,VGOBS_TETHERSTATE,VGOBS_STATIC);
//設(shè)定視點(diǎn)的定位方式為手動(dòng)定位
vgPos(obs,pos0);
//將三維位置信息傳遞給視點(diǎn)
vgPosVec(pos0,xmiddle,ymiddle,zmiddle,0,0,0);
//設(shè)定焦點(diǎn)的三維位置信息
vgProp(obs,VGOBS_LOOKAT_TARGET,VGOBS_L_POS);
/
/設(shè)定視點(diǎn)的屬性是觀察具體的三維坐標(biāo)點(diǎn)
vgObservLookatPos(obs,pos0);
//設(shè)定視點(diǎn)觀察的是焦點(diǎn)信息
在三維實(shí)時(shí)視景仿真系統(tǒng)中,為了獲得最佳的觀察效果,需要對(duì)視點(diǎn)調(diào)試算法中的dAC和dNC的大小實(shí)時(shí)動(dòng)態(tài)的調(diào)節(jié)。在三維視景仿真中,習(xí)慣并普遍流行用鍵盤控制運(yùn)動(dòng)這種操作方式。因此采用鍵盤實(shí)時(shí)調(diào)節(jié)dAC和dNC的大小,協(xié)同控制視點(diǎn)的方法。 其中 keyInput(vgWindow*win)[5]函數(shù)用于響應(yīng)所有的鍵盤事件,實(shí)際上處理鍵盤的函數(shù)是vgGetWinKey(vgWindow*win),此函數(shù)返回被按下鍵的相應(yīng)的ASCII碼整數(shù)值[6],*win代表指向Vega窗口的指針。幀循環(huán)中加入鍵盤輸入事件,就可以通過鍵盤動(dòng)態(tài)調(diào)節(jié)視點(diǎn)相對(duì)于運(yùn)動(dòng)體A的相對(duì)位置,優(yōu)化三維視景仿真系統(tǒng)中的視點(diǎn)調(diào)節(jié),增加沉浸感。其按鍵協(xié)同調(diào)節(jié)視點(diǎn)的定義如表1所示。
表1 按鍵協(xié)同調(diào)節(jié)視點(diǎn)的定義Tab.1 Definition of keyboard collaborative control viewpoint
在Vega視景仿真平臺(tái)上,以飛機(jī)為例,通過實(shí)時(shí)動(dòng)態(tài)的控制視點(diǎn),實(shí)時(shí)逼真的再現(xiàn)了飛機(jī)B從遠(yuǎn)方逐漸向飛機(jī)A接近的全過程,且可以通過鍵盤實(shí)時(shí)動(dòng)態(tài)調(diào)節(jié)視點(diǎn),仿真效果良好。飛機(jī)A與飛機(jī)B的距離是698 m的仿真圖如圖3所示。飛機(jī)A與飛機(jī)B的距離是172 m的仿真圖如圖4所示。
圖3 兩架飛機(jī)距離是698 m的仿真圖Fig.3 Distance of two plane:698 meter
文中在三維視景仿真的高性能軟件Vega平臺(tái)上,深入研究視點(diǎn)控制的基本原理,建立了三維數(shù)學(xué)模型,提出了用向量解算動(dòng)態(tài)的視點(diǎn)和焦點(diǎn)位置的方法,借助Vega API編程和外部輸入設(shè)備,實(shí)現(xiàn)了實(shí)時(shí)動(dòng)態(tài)觀察兩個(gè)物體運(yùn)動(dòng)的全過程,并且可以用鍵盤協(xié)同控制視點(diǎn),驗(yàn)證了視點(diǎn)控制算法的正確性、有效性,提高了三維實(shí)時(shí)視景仿真直觀性、靈活性、可控性,增強(qiáng)了視景仿真的真實(shí)性、實(shí)時(shí)性和交互性。本項(xiàng)視點(diǎn)控制的研究具備較好的通用性,對(duì)于某些對(duì)視點(diǎn)要求較高的三維視景開發(fā)系統(tǒng)有較大的推廣價(jià)值,對(duì)于基于底層的OpenGL視景仿真開發(fā)也有一定的借鑒意義。
圖4 兩架飛機(jī)距離是172 m的仿真圖Fig.4 Distance of two plane:172 meter
[1]龔卓蓉.Lynx圖形界面[M].北京:國(guó)防工業(yè)出版社,2002.
[2]陳亮,歐陽清,劉志強(qiáng).虛擬艦船艙室的無遮擋顯示研究[J].艦船電子工程,2010(1):156-159.
CHEN Liang,OU YANG-qing,LIU Zhi-qiang.Research on accessibility show in the virtual Scene of a cabin[J].Ship Electronic Engineering,2010(1):156-159.
[3]宋志明,康鳳舉.視景仿真的關(guān)鍵技術(shù)[J].計(jì)算機(jī)應(yīng)用,2004(5):67-68.
SONG Zhi-ming,KANG Feng-ju.Key techniques in scene simulation[J].Computer Applications,2004(5):67-68.
[4]MultiGen-Paradigm Inc.Lynx User s Guide(Version 3.7)[M].Dallas:MultiGenPar-adigm Inc,2001.
[5] MultiGen-Paradigm Inc. Vega Programmers Guide(Version3.7)[M].Dallas:MultiGenPar-adigm,Inc,2001.
[6]王乘,李利軍,周均清,等.Vega實(shí)時(shí)三維視景仿真技術(shù)[M].武漢:華中科技大學(xué)出版社,2005.