使用OpenGL來開發(fā)模型編輯器_第1頁
使用OpenGL來開發(fā)模型編輯器_第2頁
使用OpenGL來開發(fā)模型編輯器_第3頁
使用OpenGL來開發(fā)模型編輯器_第4頁
使用OpenGL來開發(fā)模型編輯器_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、實用文案1 前言 :在計算機圖形圖像處理中 ,由于 OpenGL 庫帶來的便利 ,使得其取得了越來越廣泛的應(yīng)用本文旨在通過一個小的應(yīng)用實例 ,介紹了 OpenGL 的基本編程思路 , 希望這些知識和經(jīng)驗?zāi)苡兄?OpenGL 的推廣。2 OpenGL 簡介 :OpenGL(Open Graphics Library) 是獨立于操作系統(tǒng)和硬件環(huán)境的三維圖形軟件庫由于其開放性和高度的可重用性,目前已成為業(yè)界標(biāo)準(zhǔn) . 很多優(yōu)秀的軟件都是以它為基礎(chǔ)開發(fā)出來的,象著名的產(chǎn)品有動畫制作軟件 3DMAX , Soft Image ,VR 軟件和 GIS 軟件等OpenGL 認(rèn)可開發(fā)人員對真實世界中的二維圖形

2、和三維幾何物體的描述,而且將這些幾何形體繪制到三維圖形加速卡的幀緩存中,可用一個簡單的工作流程圖來描述OpenGL 的工作原理,如圖 2 所示?;緢D像 像素 像素操作 光柵化 評價器 頂點操作 幾何物體 頂點 顯示列表 紋理存儲器操作 幀緩 存器標(biāo)準(zhǔn)文檔圖 2 OpenGL 工作流程2.1 OpenGL 的主要功能有 :1) 幾何建模: 在 OpenGL 中提供了繪制點 ,線 ,多邊形等基本形體的函數(shù) ,還提供了繪制 復(fù)雜三維曲線 ,曲面 (如 Bezier,Nurbs 等)和三維形體 (如球 ,錐體和多面體等) 的函數(shù) .由于 OpenGL 是以頂點為圖元 ,由點構(gòu)成線 ,由線及其拓?fù)浣Y(jié)構(gòu)

3、構(gòu)成多邊形 .所以應(yīng)用這些建模函 數(shù),可構(gòu)造出幾乎所有的三維模型。2 ) 坐標(biāo)變換:包括取景變換,模型變換,投影變換和視區(qū)變換。3 ) 顏色模式設(shè)置: RGBA 模式和顏色索引模式。4 ) 光照和材質(zhì)設(shè)置:可設(shè)置四種光,即輻射光,環(huán)境光,鏡面光和漫反射光.材質(zhì)用模型表面的反射特性表示。5 ) 圖像功能:提供像素拷貝和讀寫操作的函數(shù),還提供了反走樣,融合和霧化等,以增強圖像效果6 ) 紋理映射: OpenGL 的紋理映射功能可十分逼真地再現(xiàn)物體表面的細(xì)節(jié)。7) 實時動畫:利用 OpenGL 的雙緩存( Double Buffer )技術(shù)可獲得平滑逼真的動畫 效果。8) 交互技術(shù):方便的三維圖形交

4、互接口 (選擇,拾取 ,反饋 ),可進行人機交互操作。2.2 Win32 下 OpenGL 的運行機制 :由于 OpenGL 的作用機制是客戶 (Client )服務(wù)器( Server )機制,由客戶 (用 OpenGL 繪制圖形的應(yīng)用程序)向服務(wù)器( OpenGL 內(nèi)核)發(fā)送 OpenGL 命令,服務(wù)器則負(fù)責(zé)解釋 這些命令。在多數(shù)情況下,客戶和服務(wù)器在同一機器上運行,當(dāng)然,也可以在網(wǎng)絡(luò)環(huán)境下使 用,所以 OpenGL 具有網(wǎng)絡(luò)透明性,與在 Win32 下的圖形設(shè)備接口( GDI )把圖形函數(shù)庫 封裝在動態(tài)的連接庫 GDI32.DLL 內(nèi)一樣, OpenGL 的圖形庫也被封裝在一個動態(tài)連接庫

5、opengl32.dll 內(nèi)。從客戶應(yīng)用程序發(fā)布的對 OpenGL 函數(shù)的調(diào)用首先被 opengl32.dll 處理, 然后傳送給服務(wù)器后,被 Winsrv.dll 進一步處理,再傳給 Win32 設(shè)備驅(qū)動接口( DDI ),最 后把處理過的圖形命令送給視頻顯示驅(qū)動程序。圖 2.2 顯示了整個處理過程。客戶應(yīng)用程序OpenGL DLL Win32.DDI視頻驅(qū)動程序 OpenGL 命令圖 2.2 OpenGL 在 Windows 環(huán)境下的運行機制。 2.3 OpenGL 函數(shù)及結(jié)構(gòu) 下面以 Microsoft 的 Windows95(98) 為支撐平臺,說明 OpenGL 函數(shù)及結(jié)構(gòu)。1 )

6、OpenGL 核心函數(shù)OpenGL 核心函數(shù)有 100 多個,每個函數(shù)以 gl 開頭。這些函數(shù)是最基本的,可運行于 任何的工作平臺??捎眠@些函數(shù)創(chuàng)建二維和三維幾何形體,設(shè)置視點,建立視覺體,設(shè)置顏 色及材質(zhì),建立燈光,進行紋理映射等。2 ) OpenGL 實用庫函數(shù) OpenGL 實用庫函數(shù)以 glu 開頭。 這些函數(shù)是基于核心函數(shù) 的,提供對輔助函數(shù)特性的支持,并且執(zhí)行了核心的 OpenGL 交互,因而是比核心函數(shù)更 高一層的函數(shù),也更具有通用性。3 ) 輔助庫函數(shù) 輔助庫函數(shù)有 31 個,這些函數(shù)以 aux 開頭。主要是幫助初學(xué)者盡快 進入編程而做簡單練習(xí)之用。4 ) Windows 專用

7、函數(shù) 這些函數(shù)以 wgl 開頭,是用于連接 OpenGL 和 Windows 窗 口系統(tǒng)的。 用它們可以管理著色描述表 (Render Context) 及顯示列表 (Display List) ,擴展功 能,管理字體位圖等。5 ) Win32 API 函數(shù) 共 6 個函數(shù),用于處理像素格式及緩存。 ChoosePixelFormatDescribePixelFormat 6 ) OpenGL 結(jié) 構(gòu) 共 有 4 個 , 列 舉 如 下 : GLYPHMETRICSFLOATLAYERPLANEDESCRIPTOR PIXELFORMATDESCRIPTOR POINTFLOAT3 VC 環(huán)境

8、下的實現(xiàn) 背景 : 對三維物體進行可視化編輯,即增刪改點 ,面操作 .模型為用VRML表示的一個人頭像流程:數(shù)據(jù)準(zhǔn)備a初始化繪制環(huán)境a模型的繪制a交互操作,點和面的編輯a導(dǎo)出數(shù)據(jù)3.1 數(shù)據(jù)準(zhǔn)備1) 從指定的 VRML 文件中手工挑選出組成各個特征的點數(shù)據(jù)及面數(shù)據(jù),處理后存為 input.dat 文本文件,點由三維坐標(biāo)表示,面則統(tǒng)一為三角型面片,由三個點索引組成,格式如下:#Vertex/ 點數(shù)據(jù),點的三維坐標(biāo);#skin/ 特征名稱;0.0000 -31.9007 487.6600/ 點坐標(biāo)31.0000 -28.3430 470.464063.0000 -29.9017 455.9880#

9、facet/ 面數(shù)據(jù),相關(guān)點的索引;#skin/ 特征名稱;0 1 16/ 點的索引;1 15 1616 15 13其中特征分為( skin,tongue,teeth,ear,lip,eye,mouth,nose,eyebrow )2 )從 input.dat 文件中讀入點和面數(shù)據(jù),存入程序結(jié)構(gòu)中( PointNode,FaceNode ) 同時建立圖元(點和面)的顯示列表,為繪制模型做好準(zhǔn)備。typedef struct pt_nodechar pZT;/ 點的狀態(tài), (' V ' -有效;' I' - 無效),為后續(xù)編輯作準(zhǔn)備;double pt3;/ 點的

10、三維坐標(biāo);PointNode;typedef struct fe_nodechar fZT;面的狀態(tài)(V'-有效;I'-無效);int Pt1Index;/ 面片中第一個 Vertex 的點索引;int Pt2Index;/ 面片中第二個 Vertexint Pt3Index;/ 面片中第三個 Vertex的點索引;的點索引;FaceNode;pt2,void CDisplayView:DrawTriangle(intGLdouble pt3)&i, GLdouble pt1, GLdouble首先計算該面的法向量;i 個顯示列表;/ 創(chuàng)建三角行面片的顯示列表;Calc

11、ulateNormal(pt1,pt2,pt3,dNormal);/glNewList(i,GL_COMPILE);/ 建立第glBegin(GL_TRIANGLES);glNormal3dv(dNormal);/ 指定該面的法向量為dNormal;glVertex3dv(pt1);glVertex3dv(pt2);glVertex3dv(pt3);glEnd();glEndList();i+;void CDisplayView:DrawPoint(int &n, GLdouble pt)/ 創(chuàng)建點的顯示列表;glNewList(n,GL_COMPILE);glBegin(GL_POI

12、NTS);glVertex3dv(pt);glEnd();glEndList();n+;3.2 初始化繪制環(huán)境1)填充 PIXELFORMATDESCRIPTOR 結(jié)構(gòu)。 PIXELFORMATDESCRIPTOR pixelDesc=;/按需要填充適當(dāng)?shù)闹担? ) 設(shè)置像素格式m_GLPixelIndex = ChoosePixelFormat(hDC,&pixelDesc);/ 確定設(shè)備上下文 (DC) 所支持的像素格式中,與給定像素格式描述符最為匹配的像素格式索引值;if(m_GLPixelIndex =0)MessageBox( “ ChoosePixelFormat fail

13、ed!”);return FALSE;/ 執(zhí)行失?。f(!SetPixelFormat(hDC,m_GLPixelIndex,&pixelDesc) / 將設(shè)備上下文 (DC) 中的像素格式 return FALSE;/ 執(zhí)行失?。?設(shè)置為索引值 m_GLPixelIndex 所指定的格式;3 ) 創(chuàng)建著色描述表HWND hWnd = GetSafeHwnd();/ 得到 Windows 窗口的窗口句柄HDC hDC =:GetDC(hWnd);/ 得到設(shè)備上下文 (DC) 句柄;if(MyFunction_SetWindowPixelFormat(hDC)=FALSE)/ 測試設(shè)置

14、像素格式是否正確;return FALSE;/ 測試失敗;hglrc = wglCreateContext(hDC);/建立 hDC 所關(guān)聯(lián)的 OpenGL 繪圖上下文( RC)if(hglrc = NULL)return FALSE;/ 創(chuàng)建失敗;if(wglMakeCurrent(hDC,hglrc)=FALSE)/ 將一個指定的繪圖描述表變?yōu)檎谡{(diào)用線程return FALSE;/ 失??; 的當(dāng)前繪圖描述表。4 ) 對燈光,材質(zhì)等環(huán)境相關(guān)參數(shù)進行初始化int CDisplayView:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CView:OnC

15、reate(lpCreateStruct) = -1)return -1;glPolygonMode(GL_FRONT,GL_FILL);/ 多邊型的正面為填充模式;glPolygonMode(GL_BACK,GL_FILL);/ 多邊形的背面為填充模式;glShadeModel(GL_SMOOTH);/ 明暗模式為平滑型;glEnable(GL_DEPTH_TEST);/ 使能深度消隱;glEnable(GL_NORMALIZE);/ 使能法向量單位化;glFrontFace(GL_CW);/ 設(shè)置朝向正面的多邊型的頂點環(huán)繞方向為順時針方向;GLfloat ambientProperties

16、 =0.15f,0.15f,0.15f,1.0f;/設(shè)置環(huán)境光分量;GLfloat diffuseProperties =0.7f,0.7f,0.7f,1.0f;/ 設(shè)置漫反射光分量;GLfloat specularProperties =0.7f,0.7f,0.7f,1.0f;/ 設(shè)置鏡面反射光分量;GLfloat position = 1.0,1.0,-5.0,0.0;/設(shè)置光源位置;glClearDepth(1.0f);/ 設(shè)置深度緩沖的值為 1 ;/ 把各光分量的值賦給光源 0 ;glLightfv(GL_LIGHT0,GL_AMBIENT,ambientProperties);glL

17、ightfv(GL_LIGHT0,GL_DIFFUSE,diffuseProperties);glLightfv(GL_LIGHT0,GL_SPECULAR,specularProperties);glLightfv(GL_LIGHT0,GL_POSITION,position);glEnable(GL_LIGHTING);/ 使能照明效果;glEnable(GL_LIGHT0);/ 使能燈光 0;5 ) 場景布置為了將物體放置在場景中合適的位置,需要使用一些 OpenGL 的變換操作。 OpenGL 變換有基本變換和投影變換兩種,基本變換是對三維物體進行平移、旋轉(zhuǎn)、縮放等。投影變 換則把物體

18、從三維投影到二維。視區(qū)則決定物體的投影圖像在顯示設(shè)備中的尺寸和位置。 OpenGL 中的多數(shù)變換均對應(yīng)于相應(yīng)的變換矩陣, 可以說就是實現(xiàn)將物體的各個頂點通過各 種變換矩陣的作用映射到屏幕的過程。根據(jù)變化的類型,分為三種矩陣模式, GL_MODELVIEW 對應(yīng)于基本變換 ,GL_PROJECTION 對應(yīng)于投影變換, GL_TEXTURE 對應(yīng) 于紋理矩陣類型。具體應(yīng)用見小節(jié) 1,小節(jié) 2 。1 對幾何造型初始化void CDisplayView:InitGeometry()/x,y,z 方向的默認(rèn)旋轉(zhuǎn)角度;m_xRotate = 0.0f;m_yRotate = 0.0f;m_zRotate

19、 = 0.0f;/x,y,z 方向默認(rèn)的平移大小;m_xTrans = 0.0f;m_yTrans = -0.5f;m_zTrans = -3.5f;/x,y,z 方向默認(rèn)的縮放大?。籱_xScaling = 1.0f;m_yScaling = 1.0f;m_zScaling = 1.0f;2 設(shè)置透視投影變換和視區(qū)void DisplayView:OnSize(UINT nType, int cx, int cy)CView:OnSize(nType, cx, cy);GLint w=cx;GLint h=cy;glViewport(0,0,w,h);/ 設(shè)置視區(qū);glMatrixMode(

20、GL_PROJECTION);/ 表明下面的矩陣操作是關(guān)于投影變換矩陣的;glLoadIdentity();/ 單位陣作為當(dāng)前矩陣;gluPerspective(60.0,h/w,1.0f,128.0);/ 設(shè)置透視投影矩陣;glMatrixMode(GL_MODELVIEW);/ 表明下面的矩陣操作是關(guān)于模型 - 取景變換矩陣的glLoadIdentity();/ 同上;glPushMatrix();/ 把當(dāng)前的變換矩陣壓棧;glTranslatef(m_xTrans,m_yTrans,m_zTrans);/x,y,z 方向按給定實參值進行平移;glRotatef(m_xRotate,1.0

21、f,0.0f,0.0f);/x 軸旋轉(zhuǎn) m_xRotate 度;glRotatef(m_yRotate,0.0f,1.0f,0.0f); /y 軸旋轉(zhuǎn) m_yRotate 度;glRotatef(m_zRotate,0.0f,0.0f,1.0f); /z 軸旋轉(zhuǎn) m_zRotate 度;glScalef( m_xScaling,m_yScaling,m_zScaling ); /x,y,z 方向按給定實參值進行縮放;glPopMatrix();/ 原來的變換矩陣出棧;glDrawBuffer(GL_BACK);/ 繪制操作在后臺緩存;3.3 模型的繪制由于側(cè)重模型的編輯操作,在繪制時并未計算頂

22、點的法向量,僅僅求出了各個面片的法向量。void CDisplayView:OnPaint()CPaintDC dc(this);深度glClearColor(0.0f,0.5f,0.5f,1.0f);/ 將顯示窗口顏色設(shè)置為藍(lán)綠色;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ 用該色清除顏色,緩存;DrawScene();/ 繪制模型,即調(diào)用顯示列表;SwapBuffers(dc.m_ps.hdc);/ 當(dāng)前設(shè)備的前臺緩存和后臺緩存交換;void CDisplayView:Drawscene()for( int i = 0;i<

23、; TotalNum;i+ )glCallList(i);/ 調(diào)用顯示列表,該數(shù)據(jù)已在 2.4.1 節(jié)準(zhǔn)備完畢;3.4 點和面的編輯為了能夠編輯點和面,必須首先在顯示窗口中獲取相關(guān)數(shù)據(jù),即拾取到相應(yīng)的點和面, 然后才能對其進行正確的編輯操作。 一般的繪圖程序通常只是在屏幕上繪制場景中物體的二 維或三維靜態(tài)圖像,用戶不能對其中的圖形進行有效的交互。為了方便人機交互,往往需要 通過鼠標(biāo)等設(shè)備來選定觀察體積中的某個或某幾個圖元, 以便對其進行進一步的操作。 這種 在選擇模式下確定選中物體的操作稱為拾取操作。 選擇模式下的拾取操作通過將一個特殊的 拾取矩陣與投影矩陣相乘, 從而將繪圖操作限制在視口中鼠標(biāo)附近的一個小區(qū)域內(nèi)。 通過鼠 標(biāo)點擊來激活選擇模式, 這樣鼠標(biāo)附近繪制的物體就會被選中, 即確定了鼠標(biāo)附近所繪制的 物體名稱。1 ) 拾取數(shù)據(jù)實現(xiàn)如下:void CDisplayView:OnLButtonDown(UINT nFlags, CPoint point)/ 拾取操作有鼠標(biāo)的 LBUTTONDOWN 消息觸發(fā);glGetIntegerv(GL_VIEWPORT,viewport);/ 得到當(dāng)前的視口;w=viewport2;h=viewport3;glSelectBuffer(512,buf);/ 指定返回的選中紀(jì)錄所使用的數(shù)組

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論