張翔宇++蔡文齋++劉劍鋒
摘 要該天線仿真工程需要制作一款監(jiān)控軟件,當(dāng)設(shè)備運(yùn)行時(shí)能夠在計(jì)算機(jī)屏幕上展現(xiàn)出簡(jiǎn)單的3D動(dòng)畫效果。使用Delphi開發(fā)工具設(shè)計(jì)并制作了該軟件。利用新版工具中的firemonkey技術(shù)實(shí)現(xiàn)了動(dòng)畫效果。利用布局組件技術(shù)設(shè)計(jì)了3D界面上2D組件顯示效果。使用光及光源材質(zhì),照相機(jī)控件、3D模型等一系列組件渲染出3D圖形,使用動(dòng)畫組件施作用于3D模型,通過網(wǎng)絡(luò)數(shù)據(jù)讀取得到另外計(jì)算機(jī)傳來的輸入數(shù)據(jù)。當(dāng)程序發(fā)生變化后驅(qū)動(dòng)3D模型運(yùn)動(dòng),最終制作出實(shí)用的工程3D動(dòng)畫軟件。
【關(guān)鍵詞】仿真測(cè)試 照相機(jī) 材質(zhì)源 3D模型 網(wǎng)絡(luò)通信
要求開發(fā)一套天線仿真訓(xùn)練系統(tǒng),訓(xùn)練操作員操作真實(shí)設(shè)備的能力。要求制作出與原測(cè)控設(shè)備外形一樣的全套仿真系統(tǒng)。某承研單位負(fù)責(zé)地面天線類設(shè)備的全套研發(fā),其中某功能要求能在某臺(tái)計(jì)算機(jī)上制作出具有3D效果的天線3D動(dòng)畫。分析了該種需求后,開發(fā)組成員討論各實(shí)現(xiàn)途徑。經(jīng)查詢各種資料,常用的3D類開發(fā)軟件開發(fā)方法為:微軟的Direct Draw技術(shù)、Delphi開發(fā)工具的第三方組件類DelphiX技術(shù)、Delphi開發(fā)工具之GLScence庫(kù)技術(shù)、虛擬現(xiàn)實(shí)開發(fā)工具unity 3D技術(shù)。一般3D類開發(fā)需要學(xué)習(xí)的相關(guān)知識(shí)較多,程序員短期內(nèi)很難達(dá)到正式開發(fā)的技術(shù)水平,工程任務(wù)緊,短期內(nèi)較難完成工程任務(wù)。
1 網(wǎng)絡(luò)通信問題
通過分析Rad Studio新版工具,firemonkey技術(shù)已從XE2版本處于不斷完善中,雖然這方面資料不多,查電子文檔發(fā)現(xiàn)英文版例子看起來開發(fā)一個(gè)簡(jiǎn)單的3D動(dòng)畫類軟件較之其它開發(fā)工具要便捷。于是決定使用該技術(shù)實(shí)現(xiàn)工程項(xiàng)目中3D展示需求。firemonkey技術(shù)是Embarcadero公司推向全球的跨平臺(tái)的開發(fā)技術(shù),使用Delphi或C++builder開發(fā)Android、OS X、IOS、Windows平臺(tái)下任何應(yīng)用軟件。新版XE10.2.1已支持LINUX開發(fā)。工程中的需求轉(zhuǎn)化為軟件需求后需要解決兩個(gè)問題:網(wǎng)絡(luò)通信和3D展示。
firemonkey下的很多組件屬性特性已同平時(shí)2D下的開發(fā)組件特性不大一樣。需要按例子認(rèn)真試驗(yàn)。工程用3D展示主要設(shè)計(jì)思路為:由天線控制計(jì)算機(jī)通過網(wǎng)絡(luò)接口傳來天線實(shí)時(shí)位置信息:方位、俯仰值,在3D展示進(jìn)程(另外獨(dú)立軟件)收網(wǎng)絡(luò)數(shù)據(jù)完成3D展示。Firemonkey技術(shù)下的網(wǎng)絡(luò)通信不同于一般的windows 網(wǎng)絡(luò)編程,最好使用該工具軟件下的組件開發(fā),這樣編程既簡(jiǎn)單有快捷,在3D進(jìn)程中,使用indy(Internet direct socked)UDP服務(wù)器組件實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)收。indy組件庫(kù)是開源組織提供的全套網(wǎng)絡(luò)組件庫(kù)。該組件庫(kù)提供了幾十個(gè)網(wǎng)絡(luò)組件,支持各種網(wǎng)絡(luò)協(xié)議通信,indy庫(kù)已經(jīng)內(nèi)嵌在Rad Studio 開發(fā)工具中。網(wǎng)絡(luò)通訊部分開發(fā)與2D開發(fā)相當(dāng)。重載IdUDPServer1組件的服務(wù)器讀函數(shù)。IdUDPServer1組件需要設(shè)置DefaultPort參數(shù),設(shè)置該參數(shù)數(shù)值后,再將網(wǎng)絡(luò)組件Active激活,則網(wǎng)絡(luò)服務(wù)器已處于自動(dòng)收狀態(tài),該組件是基于線程通信的,一旦網(wǎng)絡(luò)上有數(shù)據(jù)到來,則該組件的procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
const AData: TIdBytes; ABinding: TIdSocketHandle)函數(shù)(回調(diào)函數(shù))則自動(dòng)讀到數(shù)據(jù)并放置于AData緩沖區(qū),ABinding中可以得到發(fā)送方的地址, 開發(fā)者是看不到真正網(wǎng)絡(luò)讀語句的,從緩沖區(qū)直接取數(shù)據(jù)即可。
從網(wǎng)絡(luò)AData緩沖區(qū)復(fù)制內(nèi)容到自己的緩沖區(qū)是不能夠使用CopyMemory函數(shù)的,該函數(shù)屬于Win32API,在該處是無法使用的,只有使用循環(huán)賦值語句。從內(nèi)存數(shù)據(jù)到浮點(diǎn)數(shù)的轉(zhuǎn)換使用Delphi的內(nèi)存對(duì)齊技術(shù),在聲明中寫為
Var
B4:Array[0..3] of Byte;
F:single absolute b4;
則表示浮點(diǎn)數(shù)f與內(nèi)存B4共享同一內(nèi)存空間。將從網(wǎng)絡(luò)緩沖區(qū)傳來的數(shù)據(jù)Data首先傳給B4,則f中直接得到浮點(diǎn)數(shù)f。這與C語言的聯(lián)合是一樣的,使用了該技術(shù)后,則3D進(jìn)程就得到了天線控制機(jī)傳來的方位、俯仰變量值了。
2 3D效果展示
建立3D工程,建立后應(yīng)用界面就是一個(gè)3D類窗中,在XE10開發(fā)工具中,直接拖Firemonker組件到該界面,注意,這不同于2D界面設(shè)計(jì),當(dāng)首次使用界面可視組件放置在窗口時(shí)你可能有時(shí)看不到。第一個(gè)需要解決的問題是,怎樣在3D界面中設(shè)計(jì)出2D界面。拖一個(gè)Layer3D組件,設(shè)置投影效果為Projection=screen,這時(shí)Layer3D會(huì)出現(xiàn)一個(gè)白色的邊框,將對(duì)齊方式設(shè)為MostRight,此時(shí)你的窗口右側(cè)即出現(xiàn)一個(gè)2D組件容器區(qū),這樣2D組件就有了一個(gè)容器,界面中其它2D組件就可以放置在該容器上了。注意3D Form中是放不進(jìn)2D組件的。
3D圖形在界面上要顯示需要以下幾個(gè)要素:
一個(gè)或多臺(tái)照相機(jī)組件,
一個(gè)或者多個(gè)光源組件(光源分方向,點(diǎn)光源、聚光燈),
材質(zhì)源組件,材質(zhì)源分為顏色材質(zhì)源,紋理材質(zhì)源,光材質(zhì)源
3D模型組件(基本的3D模型在Rad Studio開發(fā)工具已具備,比如TCube等),復(fù)雜的3D模型需要使用3D Max,Maya等工具制作,或者從AutoCAD軟件中導(dǎo)入,該工程中天線模型我們是從結(jié)構(gòu)研究室的AutoCAD軟件直接導(dǎo)入的*.obj文件,3D模型文件有很多種格式各不相同,但可借助3D模型轉(zhuǎn)換軟件互相轉(zhuǎn)換。當(dāng)導(dǎo)入界面后,你會(huì)發(fā)現(xiàn)有時(shí)看不見,將放大比例放大,調(diào)整燈光方向,調(diào)整照相機(jī)角度將會(huì)最終看到該3D物體,在3D世界,人眼看到的東西實(shí)際是照相機(jī)鏡頭看到的東西,所以適當(dāng)調(diào)節(jié)光,照相機(jī)、材質(zhì)才能看到3D效果。選中3D模型組件,調(diào)整位置與旋轉(zhuǎn)參數(shù)(全是三維向量)會(huì)發(fā)現(xiàn)3D模型在運(yùn)動(dòng),簡(jiǎn)單的3D動(dòng)畫效果就制作出來了,用一組變化的網(wǎng)絡(luò)數(shù)據(jù)注入數(shù)據(jù),觀察3D接收程序執(zhí)行的效果,發(fā)現(xiàn)天線運(yùn)動(dòng)并不是想象的形式,終查證分析,可能問題出在坐標(biāo)系統(tǒng)中,網(wǎng)絡(luò)傳來的是極坐標(biāo)值(A、E),而轉(zhuǎn)動(dòng)參數(shù)為三維向量(x、y、z),這樣顯然是給不出正確的結(jié)果的。一想到要進(jìn)行坐標(biāo)轉(zhuǎn)換,又需要很多試驗(yàn)要做,很多參數(shù)不知道怎么確定。只有另辟思路了,天線3D模型旋轉(zhuǎn)在真實(shí)世界中是天線頭安裝在一個(gè)底座上,方位負(fù)責(zé)水平運(yùn)動(dòng),俯仰負(fù)責(zé)垂直運(yùn)動(dòng),只要想出一種方法,將這兩種運(yùn)動(dòng)分離就可能出現(xiàn)預(yù)期效果。
3d動(dòng)畫制作是較復(fù)雜的,要作出象Unity 3D一樣的效果需要學(xué)習(xí)的知識(shí)較多,但制作一個(gè)簡(jiǎn)單的動(dòng)畫對(duì)Rad Studio工具而言并非難事,動(dòng)畫表現(xiàn)有兩大類,一類為照相機(jī)動(dòng),一類為3D模型在動(dòng),運(yùn)動(dòng)又分為位置和旋轉(zhuǎn),在開發(fā)工具內(nèi)這些運(yùn)動(dòng)參數(shù)表現(xiàn)為向量(x,y,z),動(dòng)畫可以使用兩種方式實(shí)現(xiàn),一種你自己控制時(shí)序改變向量值,一種方法為使用動(dòng)畫組件定制動(dòng)作即可。該開發(fā)工具已經(jīng)內(nèi)置了動(dòng)畫組件,驅(qū)動(dòng)一個(gè)簡(jiǎn)單的3D模型運(yùn)動(dòng)幾乎使用很少代碼就可實(shí)現(xiàn),在試驗(yàn)階段,作者試用了BitmapAnimation1,ColorAnimation1,TFloatAnimation,GradientAnimation1等等動(dòng)畫組件制作了許多例子程序,發(fā)現(xiàn)TFloatAnimation功能強(qiáng)勁,一般的各種動(dòng)態(tài)方式都支持(PropertyName),在3D界面中放置一個(gè)TCube組件,在該組件的depth屬性值內(nèi)右擊鼠標(biāo)產(chǎn)生一個(gè)TFloatAnimation,在TFloatAnimation的屬性頁定制動(dòng)畫參數(shù)并激活,你沒有寫一句代碼,簡(jiǎn)單的動(dòng)畫就制作完成了。
3 3D模型定位
查資料后,發(fā)現(xiàn)Dummy組件有可能會(huì)達(dá)到目的。Dummy是個(gè)虛擬3D模型,英文字面上為仿制品,經(jīng)試驗(yàn),將Dummy作為Model3D1的父組件。組件父子關(guān)系的建立與關(guān)聯(lián),使用開發(fā)工具中的Structure頁面直接拖動(dòng),呼出界面,使用鼠標(biāo)拖動(dòng)方式,改變組件之間的隸屬關(guān)系,子組件位于父組件的下一層,如圖2所示。
將model3d組件放置在Dummy組件上后,發(fā)現(xiàn)光材質(zhì)源又不起作用了,再試驗(yàn),發(fā)現(xiàn)材質(zhì)源只能作用于mesh(網(wǎng)格),再加一個(gè)mesh組件,在Form 創(chuàng)建時(shí)加
procedure TForm1.Form3DCreate(Sender: TObject);
var
Mesh : TMesh;
begin
for Mesh in Model3D1.MeshCollection do
Mesh.MaterialSource := LightMaterialSource1;
Mesh:=Mesh1;
這樣3D模型才被賦予了材質(zhì)。這樣在運(yùn)動(dòng)時(shí)天線模型在不同位置光照是不同的,渲染效果才能夠出現(xiàn),在該工程項(xiàng)目中,天線3D模型的運(yùn)動(dòng)是受另外計(jì)算機(jī)控制的[6],在網(wǎng)絡(luò)收函數(shù)內(nèi),分別旋轉(zhuǎn)Dummy和Model3D組件則達(dá)到工程制作目的,不使用動(dòng)畫組件一樣可以達(dá)到效果。
4 其它設(shè)計(jì)
為了使3D效果展示部分獨(dú)立于監(jiān)控程序本身,需要設(shè)計(jì)網(wǎng)絡(luò)配置端口為變量,軟件執(zhí)行后,如果改變?cè)搮?shù)則網(wǎng)絡(luò)重新激活。為了觀察從天線控制機(jī)傳來的數(shù)據(jù)變化,又設(shè)計(jì)了值顯示組件TMemo,定時(shí)清除時(shí)鐘,否則使用TMemo組件顯示讀取到的數(shù)值時(shí)如果運(yùn)行時(shí)間過長(zhǎng)將會(huì)超出內(nèi)存,定時(shí)清除,是一種保護(hù)性設(shè)計(jì)。
5 結(jié)束語
firemonkey技術(shù)是近年引入的新技術(shù),雖然在Delphi開發(fā)工具中仿佛與VCL基礎(chǔ)庫(kù)一樣提供了面向?qū)ο蟮母咝ЫM件,但底層已由開發(fā)公司全部重寫,支持多平臺(tái)開發(fā)。原Borland公司經(jīng)典的Delphi曾經(jīng)給業(yè)界Windows應(yīng)用程序開發(fā)帶來過驚喜,使用新版Rad Studio后,制作3D類簡(jiǎn)單應(yīng)用項(xiàng)目同樣使人感到新意滿滿,所見即所得的開發(fā)方式使程序員節(jié)約了許多時(shí)間,較之其它3D開發(fā)技術(shù)入門門檻不太高。文中以一個(gè)具體工程項(xiàng)目為例演示了3D相關(guān)開發(fā)技術(shù),望對(duì)讀者有益。
參考文獻(xiàn)
[1]王艷平.Windows網(wǎng)絡(luò)與通信程序設(shè)計(jì)(第2版)[M].人民郵電出版社,2009(01):203-210.
[2](美)Jeffrey Richter著.王書洪,劉光明譯.Windows高級(jí)編程指南[M].清華大學(xué)出版社,1999:263-269.
[3](美)拉西諾維奇等著,深入解析Windows操作系統(tǒng)(第5版·英文版)[M].人民郵電出版社,2009(09):161-170.
[4]周愛民著.Delphi源代碼分析[M].電子工業(yè)出版社,2004(09):193-205.
[5]Rad Studio Topics.Embarcadero Rad studio 10.2 Help system (2017).http://www.Embarcadero.com
[6]蘇春曉,王鵬等.基于網(wǎng)絡(luò)的數(shù)字示波器遠(yuǎn)程集中軟件平臺(tái)[J].太赫茲科學(xué)與電子信息學(xué)報(bào),2014,12(06):884-889.
[7](美)Scott Myrers,侯捷譯 More Effctive c++ 55個(gè)改善編程與設(shè)計(jì)的有效方法[M].北京工業(yè)出版社,2017(04):151-158.
作者簡(jiǎn)介
張翔宇(1983-),河北省秦皇島市人。碩士學(xué)位。工程師。主要研究方向?yàn)檫b感信息接收與處理、計(jì)算機(jī)仿真等。
蔡文齋(1962-),陜西省西安市人。工程碩士。高級(jí)工程師。主要研究方向?yàn)楹教鞙y(cè)控工程開發(fā)研究、工程控制類應(yīng)用開發(fā)研究,軟件測(cè)試等。
劉劍鋒(1972-),黑龍江省綏化市人。博士學(xué)歷。高級(jí)工程師。主要研究方向?yàn)檫b感信息接收與處理、系統(tǒng)仿真。
作者單位
1.北京市遙感信息研究所 北京市 100011
2.中國(guó)電子科技集團(tuán)公司第39研究所 陜西省西安市 710065