《電子技術應用》
您所在的位置:首頁 > 其他 > 設計應用 > 基于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網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
久久一综合视频| 国产精品久久二区二区| 一区二区三区日韩精品| 久久精品二区| 欧美一区二区在线免费播放| 亚洲一区二区三| 一本久道久久综合婷婷鲸鱼| 亚洲美女在线视频| 亚洲免费大片| av成人激情| 日韩一级在线观看| av成人国产| 亚洲视频播放| 亚洲一区二区三区在线观看视频| 亚洲手机成人高清视频| 国产精品99久久久久久久久| 中文av一区特黄| 亚洲线精品一区二区三区八戒| 一区二区三区 在线观看视| 一本色道88久久加勒比精品| aaa亚洲精品一二三区| 亚洲深夜av| 午夜亚洲性色福利视频| 欧美专区日韩视频| 亚洲电影免费观看高清完整版在线| 免费观看国产成人| 老司机67194精品线观看| 99国产精品国产精品久久| 亚洲日本成人女熟在线观看| 亚洲日本国产| 一本大道久久a久久综合婷婷| 一本色道久久88亚洲综合88| 亚洲在线一区二区| 欧美在线播放高清精品| 久久久噜噜噜久久久| 久久久久久香蕉网| 女同性一区二区三区人了人一| 欧美成人激情视频| 欧美日韩精品在线| 国产精品视频久久一区| 国产性天天综合网| 激情久久一区| 亚洲精品国精品久久99热| 亚洲最新在线视频| 亚洲欧美一区在线| 亚洲福利在线观看| 一本一本久久| 欧美亚洲视频一区二区| 久久女同互慰一区二区三区| 免费在线观看精品| 国产精品国产三级国产aⅴ无密码| 国产视频一区在线| 亚洲精品国产无天堂网2021| 亚洲综合导航| 91久久久精品| 亚洲伊人伊色伊影伊综合网| 久久久久久久尹人综合网亚洲| 每日更新成人在线视频| 欧美日韩一二三四五区| 国产日韩精品一区二区三区| 亚洲第一福利视频| 亚洲一级二级| 亚洲激情女人| 一区二区精品国产| 欧美一区二区在线免费播放| 你懂的成人av| 国产精品一区二区三区观看| 在线观看欧美| 中文在线资源观看网站视频免费不卡| 久久精品国产第一区二区三区| 亚洲视频免费观看| 久久男人av资源网站| 欧美色欧美亚洲高清在线视频| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲国产成人不卡| 亚洲一区在线播放| 日韩视频一区二区三区在线播放| 欧美在线播放视频| 欧美日韩一区二区在线观看视频| 国内伊人久久久久久网站视频| 在线视频欧美精品| 亚洲人精品午夜在线观看| 性欧美大战久久久久久久久| 欧美精品在线免费播放| 韩国一区电影| 亚洲欧美日韩国产成人精品影院| 99国产精品视频免费观看| 久久久久久久久久久久久久一区| 欧美精品一区二区三区一线天视频 | 亚洲国产精品视频一区| 亚洲欧美一区二区激情| 中国女人久久久| 蜜桃av一区二区三区| 国产日韩久久| 亚洲午夜精品一区二区三区他趣 | 欧美在线视频全部完| 欧美视频在线观看免费网址| 亚洲国产精品嫩草影院| 久久成人精品电影| 欧美亚洲午夜视频在线观看| 欧美日韩国产美女| 亚洲第一主播视频| 亚洲福利国产精品| 久久精品在线观看| 国产精品女人久久久久久| 99精品国产在热久久下载| 亚洲精品乱码视频| 久久综合九色综合欧美狠狠| 国产欧美在线视频| 亚洲欧美精品在线| 午夜视频久久久| 欧美性猛交xxxx免费看久久久| 亚洲美女av网站| 一区二区日韩欧美| 欧美美女福利视频| 最新高清无码专区| 日韩一级欧洲| 欧美日韩第一页| 亚洲精品一区中文| 一本色道久久综合亚洲精品高清| 欧美高清在线观看| 亚洲电影在线观看| 亚洲精品乱码视频| 欧美激情影院| 亚洲精品一二区| 一区二区不卡在线视频 午夜欧美不卡'| 欧美电影免费观看高清| 亚洲人成亚洲人成在线观看| 亚洲精品一区二区三区樱花| 欧美黑人国产人伦爽爽爽| 亚洲国产一区二区三区高清| 亚洲精品视频免费观看| 欧美精品三级| 亚洲精品一区二区三区在线观看| 一本色道久久综合亚洲精品高清| 欧美日本不卡| 一区二区精品在线观看| 午夜欧美精品| 国产午夜精品视频免费不卡69堂| 欧美一区日本一区韩国一区| 久久久久久久久久久久久9999| 黄色成人在线网址| 亚洲人成人一区二区三区| 欧美国产亚洲另类动漫| 亚洲精品视频在线观看免费| 亚洲午夜精品久久久久久浪潮| 国产精品女同互慰在线看| 午夜精品久久久久久久久久久久久 | 国产自产精品| 亚洲国产欧美在线人成| 欧美国产乱视频| 99视频超级精品| 香蕉免费一区二区三区在线观看| 国产女主播一区二区三区| 久久精品青青大伊人av| 欧美69wwwcom| 99re热这里只有精品免费视频| 欧美一级二区| 一区在线免费观看| 中文一区二区在线观看| 国产精品区二区三区日本| 久久国产精品毛片| 欧美人成在线视频| 亚洲宅男天堂在线观看无病毒| 久久精品人人做人人爽| 亚洲高清视频在线| 亚洲香蕉伊综合在人在线视看| 国产精品视频网| 亚洲国产日韩欧美| 欧美日韩福利视频| 午夜久久影院| 欧美成人午夜免费视在线看片 | 日韩一本二本av| 国产精品一二一区| 亚洲激情影视| 国产精品久久77777| 久久国产精品黑丝| 欧美日韩一区视频| 欧美一区二区三区在线观看| 欧美精品91| 欧美一级大片在线观看| 久久精品99国产精品酒店日本| 亚洲福利在线观看| 亚洲欧美久久| 亚洲电影av| 香蕉久久夜色精品国产| 亚洲国产成人精品女人久久久| 亚洲免费小视频| 在线观看亚洲视频啊啊啊啊| 亚洲综合精品四区| 在线观看中文字幕不卡| 午夜国产精品视频免费体验区| 激情国产一区| 亚洲欧美视频在线观看视频| 亚洲国产高清高潮精品美女| 欧美一区二区三区在| 亚洲精品一区二区三区婷婷月| 久久亚洲美女| 亚洲嫩草精品久久| 欧美日产国产成人免费图片|