《電子技術應用》
您所在的位置:首頁 > 其他 > 設計應用 > 基于OpenGL構建的飛行仿真系統
基于OpenGL構建的飛行仿真系統
趙 穎1,唐紹軍2,李中華3
總后勤部后勤科學研究所,北京100071
摘要: 介紹了在Windows系統平臺及Visual C++ 6.0的MFC基礎類庫環境下,采用OpenGL技術與串口通信技術實現的飛行仿真系統的設計思想與程序實現方法。
Abstract:
Key words :

摘  要: 介紹了在Windows系統平臺及Visual C++ 6.0的MFC基礎類庫環境下,采用OpenGL技術與串口通信技術實現的飛行仿真系統的設計思想與程序實現方法。
關鍵詞: 虛擬現實  OpenGL  六維鼠標  串行口

  虛擬現實是一種創建和體驗虛擬世界的計算機系統。利用虛擬現實技術,計算機可以產生一個三維的虛擬環境,通過人的視覺、觸覺等作用于人[1]。 用戶以客觀世界的實際動作或以人類熟悉的方式操作虛擬系統,從而實現立體交互,使人產生身臨其境的感覺。虛擬現實系統一般由輸入設備、輸出設備、虛擬環境生成器和高性能的計算機系統四大部分構成。
  目前,OpenGL在虛擬現實領域是功能較強,最具發展前途的實現工具。OpenGL是美國高級圖形和高性能計算機系統公司(SGI)所開發的三維圖形庫,在當前已經成為事實上的高性能圖形和交互式視景處理的標準[2]。OpenGL是一個獨立的工作平臺,用它編寫的程序可以在不同的硬件平臺(如工作站或個人微機)中使用,也可以在多種操作系統(如Windows系列、OS/2等)下運行。
  經過近幾年來的發展,虛擬現實技術及設備被很多領域應用,而飛行仿真是最重要的應用領域之一。本文所研究的飛行仿真系統采用新型六維控制器(六自由度鼠標)作為輸入設備,監視器作為輸出設備,以OpenGL作虛擬環境生成器,構成一套高性能計算機處理系統來實現高度仿真的飛行模擬器運動。
1  構建應用程序框架
  應用Visual C++ 6.0建立一個基于MFC的應用程序框架,并將VC庫文件opengl32.lib、glu32.lib和glaux.lib包含在應用程序中。
  為使OpenGL函數庫的調用有效,首先應設置渲染窗口。OpenGL的渲染處理完全不同于Windows的圖形設備接口GDI。要使Windows的窗口格式為OpenGL所接受,需進行下列設置。
1.1 建立圖形操作描述表
  OpenGL作圖窗口必須設置為WM_CLIPSIBLINGS和WM_CLIPCHILDREN風格。
  在Windows98/2000系統下,窗口程序首先要處理設備描述表(Device Contexts,DC),它包括若干在窗口上如何顯示圖形的信息。而在OpenGL程序中,必須創建圖形操作描述表(Rending Context,RC),這是DC中專用于OpenGL的一種。但是RC不同于其他的DC,它只需要一個句柄就可以任意調用OpenGL函數,而其他DC調用每個GDI函數時都需要一個句柄。
  使用時先通過wglCreateContext()函數創建一個RC,然后調用wglMakeCurrent()函數啟動它,就可在所定義的窗口內調用OpenGL函數繪制飛行器了。
  m_pDC=new CClientDC(this);
  hrc=wglCreateContext(m_pDC->GetSafeHdc( ));
  wglMakeCurrent(m_pDC->GetSafeHdc( ),hrc);
1.2 設置像素格式
  像素格式指定設備的繪圖屬性,包括繪圖界面的顏色表示模式、顏色位數、累積緩存區、深度緩存區和模板緩存區的位數。每個OpenGL顯示設備都支持某一特定的像素格式。像素格式用PIXELFORMATDESCRIPTOR結構來表示,通過設置這一結構的成員值使之支持OpenGL。建立了圖形操作描述表并初始化PIXELFORMATDESCRIPTOR結構后,應以此結構為變量調用ChoosePixelFormat( )函數為設備描述表選擇像素格式,最后調用SetPixelFormat( )將其設置為當前像素格式。
  int pixelformat;
  pixelformat=ChoosePixelFormat(m_pDC->GetSafeHdc( ),&pfd);
  SetPixelFormat(m_pDC->GetSafeHdc( ),pixelformat,&pfd);
2  繪制場景
2.1 準備工作

  開始繪制場景之前,需要用背景顏色刷新顯存。飛行器在天空的背景中飛行,因此應將清除顏色緩沖區的顏色設為淡藍色,然后刷新顏色緩沖區和深度緩沖區。
  glClearColor(0.75,0.75,1.0,1.0);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  準備工作還要考慮計算機屏幕是二維的,要用它顯示逼真的三維物體就要用到圖形變換技術。同時程序還要保證,當用戶隨意改變窗口大小時,飛行器不會變形失真。因此需要定義初始的坐標變換。視圖類的OnSize事件對這些問題進行處理。
2.2 設置光照效果
  創建三維立體的場景時,添加光線效果對于飛行器的真實感非常重要。OpenGL的光照模型將光照成分劃分為四個獨立的部分:發射光、環境光、散射光和鏡面反射光。OpenGL獨立計算這四種光照成分,然后將其結果疊加,從而得到最終的效果。
 設置光照應分二步進行。首先使用glLightfv( )函數設置光源的屬性和值,創建系統光源。本文定義了四個GLfloat數組sunposition、suncolor、sunambient和sunspecular,分別作為光源位置、光源的散射光亮度、環境光亮度和鏡面反射光亮度的屬性值。然后用glEnable(GL_LIGHTING)啟動OpenGL的光照處理功能。再用glEnable(GL_LIGHT0)打開設置的光源。
3  繪制飛行器
  飛行器是一個較為復雜的三維圖形對象,它需要使用二次曲面和多邊形鑲嵌工具來創作,并通過OpenGL的紋理映射技術給飛行器穿上漂亮的外衣。
3.1 飛行器構造原理
  按照組成飛行器對象的幾何形體的特點,可將飛行器構造用二次曲面(quadric)和多邊形(polygon)表示。具體來說,機頭用錐形表示;機體是柱形;尾部的發動機用錐形的柱體來表示;飛行器的頂棚可以用一個拉長的球體來表示,把球體的透明度設為0.65,使之具有玻璃的效果,這些部分是二次曲面。例如機體繪制命令為:
  gluCylinder(quadric,0.25,0.25,3.5,20,2);
  而機翼和機尾的各個部分都是多邊形的,應使用多邊形鑲嵌工具來繪制。例如機尾繪制命令為:
  gluTessBeginPolygon(tess,NULL);
  gluTessBeginContour(tess);
  for (i=0;i<6;i ++)
       gluTessVertex(tess,tail[i],tail[i]);
  gluTessEndContour(tess);
  gluTessEndPolygon(tess);
3.2 程序實現方法
  程序實現應用了顯示列表技術。OpenGL的顯示列表是事先存儲的用于稍后執行的一組OpenGL命令序列。分析了飛行器的幾何形體構造、設置完繪制命令并進行紋理貼圖美化飛行器外表后,就可將各個部分的構造程序代碼編輯到顯示列表里存儲起來了。
  F16Body=glGenLists(1);
  glNewList(F16Body,GL_COMPILE);
  最后調用函數glEndList( ),標志一個顯示列表的結束。
  在視圖類的DrawScene( )事件的適當位置用函數glCall-
List(F16Body)調用顯示列表,從而按照預先定義的順序執行飛行器模型的繪制。
4  六維鼠標控制的飛行仿真系統總體設計
4.1 六維鼠標的工作原理
  現實中飛行器是可以進行三維移動以及三維旋轉運動的,因此在飛行仿真系統中就需要一種可以實現上述運動模式的輸入控制設備。這里選擇了一種新型并聯結構六維控制器,即六維鼠標。
  該六維鼠標基于力控制原理,通過集成A/D轉換器的動態應變儀與計算機的COM1口(串行口1)相連,采用串行通信機制。操作者握住鼠標,向所要移動或轉動的方向用力,鼠標將受到的六維力傳遞到內部的微型六維力敏感元件,接著通過鼠標內部機制生成與該力成正比的電壓信號,并將電壓信號放大后采集進計算機,利用力Jacobian矩陣求出鼠標受到的空間作用力情況[3]。六維鼠標的控制系統軟件實現將三個力分量分別乘以某個大于零的系數,生成飛行器作空間直線運動的位移分量,從而控制仿真系統中飛行器的平移運動;將三個力矩分量經過一定算法的變換后產生飛行器繞X、Y、Z三個坐標軸轉動的角位移,從而控制飛行器的旋轉運動, 在算法中應用到了六維鼠標的標定矩陣G6×6。具體變換算法請查閱文獻3。圖1描述了六維鼠標的工作原理流程。

4.2 仿真系統總體設計
  六維鼠標和計算機之間采用串口通信,所以在程序設計中選用了MSComm控件。該控件通過串行端口傳送和接收數據,從而為應用程序實現串行通信功能[4]。MSComm控件將通信的大部分底層操作都封裝在控件內部,應用程序只需獲取和設置相應的控件屬性即可,簡化了編程的復雜度。在Visual C++ 6.0中使用該控件的基本流程如圖2所示。


  本仿真系統中當控件插入工程后,應將串口初始化及打開命令放在視圖類的OnCreate()事件中。在應用程序建立時就打開串口,準備接收鼠標數據。
  應用MSComm控件的OnComm( )事件作為對六維鼠標輸入數據的響應事件,并在事件處理中實現對飛行器的運動控制。首先檢測串口的GetCommEvent( )事件,如果該事件返回值為2,表示接收緩沖區內的字符數達到Rthreshold值,發生接收事件(comEvReceive)。接下來編寫接收數據的過程,實現將鼠標傳輸的數據轉化為三個平移分量(Xp、Yp、Zp)和三個旋轉分量(Xr、Yr、Zr)。將Xp、Yp、Zp、Xr、Yr、Zr六個控制變量傳遞給DrawScene( )函數,在飛行器繪制之前修改視景坐標系,從而控制飛行器的運動。
  glTranslatef(Xp,0.0f,0.0f);
  glTranslatef(0.0f,Yp/10,0.0f);
  glTranslatef(0.0f,0.0f,-Zp);
  glRotated(Xr-37,1.0,0.0,0.0);
  glRotated(Yr-7,0.0,1.0,0.0);
  glRotated(Zr-2,0.0,0.0,1.0);
  glCallList(F16Body);
       系統總體實現流程如圖3所示。


5  結  論
  本文所開發的飛行器仿真系統使用Visual C++ 6.0作為軟件平臺,應用OpenGL來開發具有六維運動能力的飛行模擬器和高度真實感的三維地形,以六維鼠標作為飛行器的控制輸入設備,通過串行通信機制控制計算機中的仿真系統。用戶通過給六維鼠標施加不同方向、不同大小的力來自由控制系統中飛行模擬器的運動,實現飛行器在虛擬地形環境中的三維移動和三維轉動,從而實現對真實世界中飛行器運動的仿真。
參考文獻
1   毛玉姣,王梅,陳遠.虛擬現實技術及其應用.圖書情報知識,1997;(4)
2   戴達強,姜曉彤,朱欣華.OpenGL在圖形仿真系統中的應用.現代電子技術,2001;(9)
3   趙現朝,金振林.六維鼠標中力矩與轉角轉換的一種新方法.  計算機工程,2002;(7)
4   李現勇.Visual C++串口通信技術與工程實踐.北京:人民郵電出版社,2002

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: h视频在线免费看 | 国产成人涩涩涩视频在线观看免费 | 国产高清免费在线观看 | 国外破处高清视频 | 国产成人免费网站app下载 | 99r精品视频 | 日本不卡一二三区 | 天天摸天天看天天做天天爽 | 婷婷国产天堂久久综合五月 | 门事件精品视频在线观看 | 欧美在线日韩在线 | 四虎永久影院永久影库 | 欧美激情亚洲精品日韩1区2区 | a级毛片视频免费观看 | 2019天堂精品视频在线观看 | 欧美夫妻生活网 | 国产日韩免费视频 | 成人亚洲性情网站www在线观看 | 国产传媒一区二区三区四区五区 | 草草影院在线观看视频 | 污视频网站在线观看 | 免费精品国产日韩热久久 | 国产资源精品一区二区免费 | 国产欧美日韩亚洲 | 激情网站在线 | 一级毛片大全免费播放 | 片子免费在线观看 | 欧美日韩另类在线观看视频 | 欧美性活一级视频 | 91亚洲自偷手机在线观看 | 国产精品 视频一区 二区三区 | 久久国产精品久久精品国产 | 免费视频试看 | 爱视频福利网 | 老色99久久九九精品尤物 | 久久综合狠狠综合久久97色 | 激情六月丁香婷婷四房播 | 男人综合网 | 日韩欧美亚洲每日更新网 | 欧美成人看片一区二区三区 | 国产一区二区视频在线观看 |