葛雙全,孟德壯
(中國工程物理研究院計算機(jī)應(yīng)用研究所,四川 綿陽 621900)
地球外層空間環(huán)境的特殊性是人類從事空間活動和認(rèn)知空間環(huán)境變化規(guī)律的主要障礙,可視化仿真技術(shù)的發(fā)展為改變這一狀況提供了契機(jī)??梢暬抡婕夹g(shù)采用圖形或圖像的方式實現(xiàn)空間和時間數(shù)據(jù)的視覺化,將可視化仿真技術(shù)應(yīng)用于空間科學(xué)研究與工程實施領(lǐng)域,一方面能夠通過可視化的形式表示空間環(huán)境,直觀展現(xiàn)其分布狀況、運(yùn)行規(guī)律及動態(tài)特性,另一方面可仿真空間科學(xué)研究活動,為空間科學(xué)研究提供支持[1]。
行星際空間環(huán)境可視化需求多樣,既有厘米級的飛行器載荷高精度動作仿真,也有星際飛行運(yùn)動仿真。根據(jù)不同的空間仿真設(shè)計,觀察者在同一虛擬場景內(nèi)既可能需要觀測仿真對象相對位置關(guān)系,又要清晰地觀察飛行器載荷動作行為。因此,設(shè)計適用于滿足視點在大尺度星際空間快速運(yùn)動條件下的控制算法具有重要意義。
行星際飛行仿真的大尺度包含兩方面含義:太陽系距離尺度變化巨大;仿真對象模型本身尺度變化巨大。對于前者而言,水星是離太陽最近的行星,其距離太陽約為5791萬千米,海王星是離太陽最遠(yuǎn)的行星,其距離太陽約為45億千米,飛行器載荷動作則為分米級或厘米級。對于后者而言,太陽直徑約為70萬千米,而飛行器大小通常只有數(shù)米,各仿真對象模型大小存在很大的數(shù)量級差。
行星際飛行仿真研究對象包括空間環(huán)境、行星及其衛(wèi)星、飛行器及其載荷等,各仿真對象空間關(guān)系復(fù)雜。太陽對飛行器和行星的光照、飛行器對地覆蓋等計算都受制于仿真對象之間的相對位置關(guān)系,而針對各仿真對象相對位置關(guān)系的描述基于統(tǒng)一的空間坐標(biāo)體系,如行星運(yùn)動仿真通常在日心黃道坐標(biāo)系下描述各行星的運(yùn)動軌跡;飛行器運(yùn)動仿真通常在該飛行器所屬行星的慣性坐標(biāo)系下描述該飛行器運(yùn)動;發(fā)射飛行器通常在地球固定坐標(biāo)系下描述其發(fā)射活動;描述飛行器及其載荷則通常采用軌道坐標(biāo)系及飛行器本體坐標(biāo)系。
相對于行星之間的距離,行星本身尺度可以忽略不計,太陽系內(nèi)部空間基本可認(rèn)為空無一物。在行星際飛行仿真場景中,當(dāng)希望觀測星際運(yùn)動軌跡時,就不得不將視點置于離太陽很遠(yuǎn)的位置。當(dāng)希望了解飛行器狀態(tài)時,又必須將視點移動到飛行器本身或其附近。另外,在如此浩瀚的空間范圍內(nèi),由于缺乏參展物,觀察者將難以根據(jù)周圍環(huán)境判斷視點所處的空間位置,從整體上感知仿真對象的分布情況。
空間坐標(biāo)體系用于描述仿真對象在太陽系空間的位置關(guān)系,是行星際飛行仿真系統(tǒng)的運(yùn)行基礎(chǔ)。從空間環(huán)境要素分析來看,對地球空間環(huán)境的研究幾乎都是以地球為中心來研究空間環(huán)境對人類生產(chǎn)活動的影響。但由于星際飛行涉及大量的行星間相對位置關(guān)系、飛行器及其載荷與行星(主要是太陽和地球)的相對位置關(guān)系等,因此構(gòu)建行星際飛行仿真坐標(biāo)系統(tǒng)必須以日心黃道坐標(biāo)系統(tǒng)為基準(zhǔn)。考慮到行星際飛行仿真所涉及的各種試驗場景和仿真對象,坐標(biāo)系統(tǒng)包括飛行器軌道坐標(biāo)系、本體坐標(biāo)系、地球固定坐標(biāo)系、發(fā)射場坐標(biāo)系、地球慣性坐標(biāo)系、地球黃道坐標(biāo)系、日心黃道坐標(biāo)系、太陽慣性坐標(biāo)系、太陽固定坐標(biāo)系等[2-4]。圖1所示為行星際飛行仿真坐標(biāo)體系。
圖1 行星際飛行仿真坐標(biāo)體系
視點是觀察者查看虛擬場景的接口,OpenGL將視點抽象為觀察者,觀察者將許多模擬的元素聚合在一起觀測。每個觀察者都有各自關(guān)聯(lián)的場景、通道和環(huán)境。
觀察者也是場景中的活動物體,所以它也有移動、旋轉(zhuǎn)等改變位置的操作,觀察者可以掛接到任一場景節(jié)點下。由于坐標(biāo)變換矩陣的累加性,觀察者的直接父節(jié)點和間接父節(jié)點的改變都會對觀察者的位置產(chǎn)生影響。觀察者坐標(biāo)定義采用右手坐標(biāo)系,視點位于坐標(biāo)的原點,視點正前方為正Y軸,X軸正方向朝右,Z軸正朝上。通過控制觀察者所處的坐標(biāo)空間和觀察者的位置和姿態(tài),就可以決定空間仿真場景提供給觀察者的視覺信息。
3.3.1 從三維空間到二維屏幕
渲染管道用于描述OpenGL一系列繪制過程[5-6],是三維空間對象從世界坐標(biāo)系到屏幕坐標(biāo)系的基本流程,即從三維空間到二維屏幕,其渲染流程如圖2所示。
圖2 OpenGl渲染管線
頂點數(shù)據(jù)通常是指三維空間中的物體的坐標(biāo)、法線向量等,這些數(shù)據(jù)可以保存在顯示列表中,也可以直接進(jìn)行處理。求值器根據(jù)頂點數(shù)據(jù)計算表面法線、紋理坐標(biāo)、顏色以及空間坐標(biāo)值,基于頂點的操作首先對單個頂點進(jìn)行操作,然后把頂點裝配成為圖元。像素操作將內(nèi)存中的像素數(shù)據(jù)轉(zhuǎn)換成圖形硬件支持的數(shù)據(jù)格式,如果像素數(shù)據(jù)是從幀緩沖區(qū)中讀取的,就對其進(jìn)行縮放、平移、映射和截取。經(jīng)過處理后的頂點數(shù)據(jù)和像素數(shù)據(jù)通過光柵化轉(zhuǎn)換為片段,片段對應(yīng)于幀緩沖區(qū)中的一個像素,具有各自的演示和深度值。對這些片段進(jìn)行顏色計算、紋理應(yīng)用、片段測試等,最后,片段會被繪制到適當(dāng)?shù)木彌_區(qū),顯示設(shè)備從緩沖區(qū)讀取數(shù)據(jù)并顯示到屏幕上。
3.3.2 算法描述
3.3.2.1 問題描述
行星際飛行仿真需要考慮空間環(huán)境整體比例縮放、行星比例縮放、飛行器比例縮放、軌道高度自定義、飛行器軸向運(yùn)動比例縮放、飛行器載荷運(yùn)動等多種仿真演示要素。如果單獨考慮每一種顯示要素,不同的飛行仿真場景可在一定程度上增加仿真演示的靈活性,但這同時會帶來另外的問題,如果需要模擬設(shè)計多種飛行仿真場,則相同的仿真演示要素在不同的場景中可能沖突。如果行星或飛行器比例縮放,那么在近距離觀察飛行器運(yùn)動時,飛行器可能發(fā)生碰撞;如果行星或飛行器比例不縮放,則在飛行器大范圍機(jī)動時,飛行器可能小到看不見。如果飛行器運(yùn)行軌道不改變,同樣,相對于地球而言,飛行器極?。蝗绻淖冿w行器運(yùn)行軌道高度,則飛行器上的某些載荷(如相機(jī))的視場可能捕獲不到目標(biāo)。
3.3.2.2 設(shè)計約束
為簡化行星際飛行仿真演示復(fù)雜度,在不影響仿真演示效果的前提下,列出算法設(shè)計約束如下:
1)空間仿真場景模擬以日心黃道坐標(biāo)系為基準(zhǔn);
2)星空背景基于耶魯星表中3000余顆星的位置和亮度繪制,每顆在遠(yuǎn)裁減面內(nèi)的星都用相同大小的白色的點繪制,并根據(jù)其相對亮度調(diào)整透明度。
3)行星采用球體貼紋理實現(xiàn),球體半徑為真實行星半徑大小,地球大氣層高度為大氣層實際高度。
4)太陽僅考慮位置的正確性,其大小保持不變,采用球體貼紋理實現(xiàn)。
3.3.2.3 比例歸一化
大尺度行星際飛行仿真演示算法設(shè)計的核心思想就是對所有的演示要素按照真實比例1:1繪制,即對空間距離、仿真對象模型、軌道、載荷等顯示要素不予縮放。
1:1繪制可以解決絕大部分仿真演示問題,例如成像對象不能進(jìn)入相機(jī)視場、近距離觀察飛行器,飛行器會發(fā)生碰撞、飛行器運(yùn)動失真等等??傊行请H飛行仿真按照仿真對象實際的距離和大小實現(xiàn),這可以避免不同的試驗程序自定義調(diào)整不同的顯示要素。
設(shè)計約束的第3)項可以解決行星際的“合理性”顯示問題。對于太陽的顯示僅考慮其位置,太陽在三維太空中的位置將被準(zhǔn)確的投影到屏幕上合適的位置。太陽的顯示通過透明紋理貼圖實現(xiàn),大小保持不變,這與常識吻合。
3.3.2.4 最小視距與最大視距
最小視距的定義:最小視距首先是一個長度量,標(biāo)示仿真對象在三維空間中的位置與視點之間的距離,其次,該距離是仿真對象從三維空間投影到二維屏幕上,且能夠被觀察者感知的最小距離。圖3表示了視點與最小視距的關(guān)系。從定義可知,最小視距是一個被人為感知的長度量,不同的人可能具有不同的最小視距,即同樣大小的物體在同樣的位置,然后投影到屏幕上,不同的人可能感覺大小不一樣。最小視距從定義上講是一個三維空間中的長度量,但觀察者在二維屏幕上能夠感知的是一個二維區(qū)域的大小,即屏幕上有多少個像素表示該仿真對象。根據(jù)OpenGL透視原理,當(dāng)物體投影到屏幕后,有的會認(rèn)為1個像素時對應(yīng)該物體的最小視距,有的會認(rèn)為4個像素表現(xiàn)該物體時對應(yīng)該物體的最小視距。
圖3 視點與最小視距
最小視距雖然由觀察者確定,但最小視距本身由OpenGL根據(jù)透視原理和渲染流程自動計算。
視點總是被綁定在空間坐標(biāo)層次結(jié)構(gòu)樹的某個坐標(biāo)系下。同樣,各個仿真對象也在各自的坐標(biāo)體系下運(yùn)行,因此,總是可以精確的計算出各個仿真對象到視點的距離。
最大視距的定義:觀察者認(rèn)為仿真對象投影到二維屏幕上的物體不能再小(大小保持)時仿真對象距離視點的距離。最大視距同樣是一個長度量,表示三維空間中的對象距離視點的距離。如果仿真對象大于最大視距,繼續(xù)遠(yuǎn)離視點,此時需要放大對象顯示比例(完全抵消OpenGL透視比例),使其隨著距離的增大,在二維屏幕上的投影面積不變。圖4表示最小視距與最大視距空間位置關(guān)系。
圖4 最小視距與最大視距
3.3.2.5 放大最小視距外的仿真對象
1:1繪制不能解決的問題是在大尺度空間仿真場景中,飛行器做大范圍機(jī)動時,用戶需要了解飛行器當(dāng)前的位置,但遠(yuǎn)處的飛行器已經(jīng)超出了可見范圍。
需要計算出仿真對象的最小視距,如果仿真對象在最小視距內(nèi)(也就是說仿真對象可見),則由OpenGL根據(jù)透視原理自動計算仿真對象的大小。但如果觀察者認(rèn)為仿真對象已不可見(或者說,在屏幕上的投影不能再小),此時,如果仿真對象再遠(yuǎn)離視點,就需要放大仿真對象的顯示比例,以滿足仿真對象的可視需求。
例如:當(dāng)飛行器機(jī)動到距離視點2km遠(yuǎn)處,此時用戶認(rèn)為飛行器需要人工干預(yù)放大飛行器比例,則2km就是該飛行器的最小視距。假如飛行器在2km處對應(yīng)在屏幕上顯示為25個像素(5×5),當(dāng)飛行器繼續(xù)遠(yuǎn)離直至距離視點10km,在OpenGL透視機(jī)制的作用下,此時飛行器在屏幕上顯示為4個像素(2×2),如果用戶認(rèn)為4個像素是滿足仿真對象可視需求的最小投影,則10km就是該飛行器的最大視距。如果視點與飛行器距離大于最小視距,需要對飛行器的顯示比例進(jìn)行適當(dāng)放大,但不能大于25個像素(以避免造成距離視點越遠(yuǎn),物體反而變大的情況)。如果視點與飛行器距離大于最大視距,則需對飛行器顯示比例充分放大,使其在屏幕上的投影面積始終保持在4個像素大小。
(1)
當(dāng)視距大于最大視距時,該段直線為α×d,分段函數(shù)可描述為如下公式
(2)
圖5 對象縮放比例與視距直線連接關(guān)系
如圖6所示,如果不考慮分段,從單一公式描述,則可知連續(xù)平滑曲線在f′(dmin)=0,f′(dmax)=α,飛行器縮放比例實為問題:
H(x0)=f(x0),H′(x0)=f′(x0)
H(x1)=f(x1),H′(x1)=f′(x1)
的解。根據(jù)三次Hermite插值定理,飛行器縮放比例可如下式表示
(3)
其中x0=dmin,x1=dmax,f(x0)=1,f′(x0)=0,f(x1)=α×dmax,f′(x1)=a。
綜上:
(4)
圖6 仿真對象縮放比例與視距平滑連接關(guān)系
在實際使用過程中,需要首先確定dmin、dmax和α值,再根據(jù)視距實時按照式(4)確定各仿真對象的縮放比例。
根據(jù)上述算法,基于開源圖形引擎OpenSceneGraph[7-8]及osgEarth[9-10]開發(fā)了地月運(yùn)動仿真系統(tǒng),圖7左邊表示太陽系各行星運(yùn)行軌跡,右邊是地球在赤道坐標(biāo)系與黃道坐標(biāo)系網(wǎng)格下的運(yùn)動仿真,用戶能夠在行星及其衛(wèi)星之間切換視點并拉近觀察太陽、月球及各行星狀態(tài)。圖8左邊表示飛行器地月運(yùn)動軌跡,右邊則是將視點綁定到飛行器上,通過交互控制貼近觀察飛行器某載荷的開蓋過程(藍(lán)色橢圓圈內(nèi))。
本文分析了行星際飛行仿真特征,基于視覺透視原理和視點控制機(jī)制設(shè)計了一種行星際飛行仿真視點運(yùn)動控制算法。當(dāng)仿真對象與視點的距離小于最小視距時,由OpenGL透視機(jī)制自動控制投射到顯示屏幕上的各空間仿真對象的大??;當(dāng)視距大于最小視距但小于最大視距時,部分抵消OpenGL透視機(jī)制所帶來的比例縮小值,當(dāng)視距大于最大視距時,則全部抵消OpenGL透視機(jī)制帶來的比例縮小值。另外,在大尺度空間場景仿真過程中,當(dāng)需要了解細(xì)節(jié)時(如觀察載荷運(yùn)動),可采用多觀察者方式[11]等形式輔助助實現(xiàn)。
圖7 日心黃道坐標(biāo)系下的行星運(yùn)動仿真
圖8 飛行器地月運(yùn)動仿真