![基于opengl的三維交互查看器的設計與實現(xiàn)_第1頁](http://file4.renrendoc.com/view/282cad9aa03783185c5cc305daf8e9c3/282cad9aa03783185c5cc305daf8e9c31.gif)
![基于opengl的三維交互查看器的設計與實現(xiàn)_第2頁](http://file4.renrendoc.com/view/282cad9aa03783185c5cc305daf8e9c3/282cad9aa03783185c5cc305daf8e9c32.gif)
![基于opengl的三維交互查看器的設計與實現(xiàn)_第3頁](http://file4.renrendoc.com/view/282cad9aa03783185c5cc305daf8e9c3/282cad9aa03783185c5cc305daf8e9c33.gif)
![基于opengl的三維交互查看器的設計與實現(xiàn)_第4頁](http://file4.renrendoc.com/view/282cad9aa03783185c5cc305daf8e9c3/282cad9aa03783185c5cc305daf8e9c34.gif)
![基于opengl的三維交互查看器的設計與實現(xiàn)_第5頁](http://file4.renrendoc.com/view/282cad9aa03783185c5cc305daf8e9c3/282cad9aa03783185c5cc305daf8e9c35.gif)
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
基于opengl的三維交互查看器的設計與實現(xiàn)
3d是由autodek設計的一種3d模型數據交換格式。由于信息的豐富性,隨著3dst等應用的普及,道德文件的三維模型逐漸成為實際的三維模型數據交換的標準。當sd文件格式中的3d文件信息交換時,需要打開和掃描各種大型軟件,以打開和顯示三維圖像文件。此外,3d信息的交流以及大規(guī)模三維互動廣告的顯示是非常不方便的?;诖耍疚难芯苛?d文件格式,開發(fā)了小型易學的3d文件訪習器。探測器采用vs2005作為引擎,在研究sd文件格式時,讀取文件中的網格、紋理等信息,并利用opengl進行網格模型的顯示和紋理圖像文件,以實現(xiàn)三維交互驗證。13chunk格式3DS文件是一種二進制數據文件.chunk(塊)是3DS文件的基本構成單位.每一個chunk包括一個頭和一個主體.chunk的頭又由兩部分組成:一個字長的ID(索引號),一個雙字長的chunk長度.ID表示chunk的含義,chunk的長度以字節(jié)為單位并包括頭的長度.數據的存儲采用Intel方式,即高位放在后面,低位放在前面.3DS包含有上千個chunk,它們構成了一個復雜但靈活的文件系統(tǒng).然而至今為止,沒有任何一個官方的文件完全說明3DS的文件格式,即具體指出每一個塊的ID和其含義,還有許多未知的塊.不過chunk是以塊為單位,各chunk是相互嵌套的,在讀取的時候可以采用switchcase條件判斷語句就能跳過不關心的或未知的chunk.對于本文的三維互動宣傳展示通用的三維展示查看器,需要讀取的chunk包含以下方面:(1)材質塊0xA000,定義了使用于物體上的材質的屬性,包括Ambient,Diffuse等分量,還定義了該材質所使用的紋理;(2)紋理塊0xA300,定義該紋理的文件名,需要注意的是它不包含路徑;(3)網格頂點列表塊0x4110,兩個字節(jié)表示該物體頂點數目的量,后面緊跟著該物體頂點列表,需要注意的是只用兩個字節(jié)表示頂點數目,最多只能有65535個頂點,多于這個的要進行拆分;(4)網格面信息塊0x4120,用來記錄網格對象中所有面的信息.采用紀錄定點索引的方式———記錄該頂點在頂點列表中所處的位置.它還包含其它子塊,如面材質塊0x4130等;(5)面材質塊0x4130,描述了哪些材質被使用和使用這種材質的面;(6)紋理坐標數據映射列表塊0x4140,組織方式跟頂點列表的類似;(7)位置變換矩陣塊0x4160.2信息塊的讀取根據上文的分析與3DS固有的包含嵌套結構,本系統(tǒng)在讀取的時候采用VS2005為開發(fā)工具,利用C++的switchcase分支結構遞歸尋找到需要讀取的信息塊,然后對各具體的信息塊內容進行讀取.2.1已經讀取字節(jié)數的判斷定義如下CHUNK結構:typedefstructstr_CHUNK{unsignedshortid;//chunk的IDunsignedintlength;//chunk的長度unsignedintcount;//記錄已經讀取的字節(jié)數用于判斷該塊是否讀取完畢structstr_CHUNK(){count=0;//設定count的初始值};}CHUNK;根據CHUNK結構對數據的組織方式讀取各個塊的頭信息.對于同級的信息塊,借助switchcase語句判斷id值確定當前讀取的是哪一個chunk塊信息.對于不同級別的chunk,則根據各個chunk之間所具有的包含關系,采用遞歸的方法進行遍歷.父級的chunk塊長度length是各個子級length之和.通過記錄已經讀取的字節(jié)數count與頭信息的chunk的長度length進行對比判斷,當count與頭信息的chunk的長度length相等時,這個塊的內容讀取完畢,遞歸返回.2.2生成網格基本信息通過上文的遞歸算法和switchcase判斷語句定位到具體的塊位置后,需要根據各個塊對信息內容的不同組織方式進行具體內容的讀取.下文以網格和紋理數據信息的讀取為例說明信息的讀取流程和數據的管理方法.(1)利用上文的遞歸算法,文件會定位到材質信息塊EDIT_MATERIAL(0xAFFF)與網格信息塊ED-IT_OBJECT(0x4000)的同級首地址處.采用switchcase語句按順序判別,首先讀取的是EDIT_MATERIAL信息塊的內容.在EDIT_MATERIAL(0xAFFF)中記錄了模型的所有材質信息,其中包含在材質塊0xA000中記錄的材質名稱和在紋理塊0xA300中記錄的紋理貼圖名稱.本文采用如下結構記錄所讀取的材質信息和紋理名稱.typedefstructstr_material{CStringmaterialname;//材質名稱CStringimagename;//材質下對應的紋理貼圖的文件名稱boolimageIsOpen;//紋理圖是否有效存在intmaterialfaceIndexNum;//這一材質所對應的面片數unsignedshort*materialfaceIndex;//記錄這個材質所對應的面片str_material(){materialfaceIndex=NULL;}~str_material(){if(materialfaceIndex!=NULL)SAFE_DELETE_ARRAY(materialfaceIndex);}}materialinfo;其中materialname記錄MAT_NAME01(0xA000)中的內容,imagename記錄MAT_TEXTURE(0xA300)中的貼圖文件名.而materialfaceIndexNum和materialfaceIndex記錄的是在面材質塊0x4130中材質所對應的面片個數和面片索引號.按文件順序讀取結構體中需要記錄的信息并賦值給相對應的結構體變量,從而把需要的材質信息都儲存到結構數組列表中.(2)EDIT_OBJECT塊的子塊OBJ_TRIMESH(0x4100)中記錄著網格的各種信息.首先讀取到的是OBJ_TRIMESH(0x4100)的子塊TRI_VERTEXL(0x4110).在TRI_VERTEXL(0x4110)中,兩個字節(jié)表示該物體頂點數目的量,后面緊跟著該物體頂點列表.頂點由三個坐標分量組成,每一個坐標分量長度與float型變量的長度一致.因此本文按原有的頂點次序進行頂點坐標值的讀取.而網格頂點的個數不定,并且在一個塊中最多只能存儲65535個頂點,因此為了有效的利用內存空間和方便最終網格的整體拼合采用數據鏈表的方式進行頂點的記錄管理.鏈表結構如下:typedefstructstr_3DSVerNode{floatcoord;//頂點坐標值structstr_3DSVerNode*next;//指向下一鏈表節(jié)點地址}str3DSVerNode;(3)由三個頂點組成網格的三角面片.而3DS的網格面信息塊0x4120中記錄著三個頂點的在TRI_VERTEXL(0x4110)中的順序號,并記錄每個面片所對應的材質.所以首先按順序讀取面片三個頂點的順序索引號.順序號讀取完之后,判斷所讀取的字節(jié)數與頭信息中記錄的字節(jié)數是否一致,如果不一致則還通過子塊0x4130記錄有每個面所對應的材質信息,否則結束這個塊的讀取.每一個材質為一個子塊,記錄材質的名稱和使用材質面片的順序索引號.本文利用如下結構進行面信息內容的記錄typedefstructstr_3DSFaceNode{intverticeId;//頂點的索引號intMeteralId;//面片所對應的材質structstr_3DSFaceNode*next;}str3DSFaceNode;(4)如果有紋理的模型則在TRI_MAPPINGCOORS(0x4140)中記錄與頂點相匹配的紋理映射值.紋理映射值的讀取和數據的組織方法與頂點的一樣.采用的結構為:(5)讀取放置方位信息塊,對讀取的頂點進行坐標變換操作.(6)利用下面的兩個結構,對讀取的網格信息和進行整理,把材質信息轉成面片所對應的貼圖號,實現(xiàn)數據的統(tǒng)一管理.根據str3DSFaceNode中記錄的頂點索引號,把str3DSVerNode中的頂點坐標值轉到str_3DSVerAndTexNode的coord中,并判斷這一頂點是否有相匹配的str3DSTextureNode紋理映射值,如果有則開辟str_3DSAndTexNode存儲空間進行紋理映射值和紋理圖ID號的標記.structstr_3DSAndTexNode{floattexcoord;//紋理映射坐標longtexid;//采用的紋理圖號};structstr_3DSVerAndTexNode{floatcoord;//面的頂點坐標str_3DSAndTexNode*pTex;//指向紋理信息節(jié)點地址structstr_3DSVerAndTexNode(){pTex=NULL;}};3基于開放gl的運動方程通過上文方法獲取了三維模型的構造信息,作為三維模型的查看器還需要把這些構造信息通過屏幕顯示出三維模型,并需要提供交互的瀏覽操作功能.OpenGL是一種強大的三維圖形開發(fā)工具,是圖形硬件的軟件接口,獨立于操作系統(tǒng)和硬件環(huán)境,具有高度的可移植性和非??斓乃俣?并且OpenGL提供了VisualC++的開發(fā)接口,在VS2005中能夠直接執(zhí)行OpenGL的圖像處理指令,因此本文借助OpenGL進行網格三維模型的顯示、紋理貼圖以及集成入人機交互操作功能.3.1帶虛線的線架模式在逆向工程操作中,對于從3DS文件中讀取的網格模型的顯示方式要求多樣,如不帶消隱的線架模式、不可見部位用虛線表示的線架模式、帶消隱的線架模式、帶邊線的三角網格模式和不帶邊線的三角網格模式等.其中以不可見部位用虛線表示的線架模式的模型繪制最具代表性,因此本文以其為例進行3DS文件模型顯示流程的說明.具體流程如下:首先添加OpenGL的連接庫opengl321lib、glu321lib、glaux1lib和包含文件頭#include<gl\gl1h>、#include<gl\glu1h>、#include<gl\glaux1h>,在OnInitialUpdate()函數中實現(xiàn)繪圖前的初始化工作.用OnCreate()、OnSize()、OnDestroy()函數分別響應WM_CREAT、WM_DE-STROY、WM_SIZE消息,并重載OnDraw函數.接著進行虛線表示的線架模型的繪制.具體的繪制過程包含以下三個步驟:(1)設置消隱使能、深度緩存值和消隱比較方式,并對Z深度緩存進行消除.開啟glEnable(GL_POLY-GON_OFFSET_FILL)和設置glPolygonOffset(1.0f,1.0f),接著在緩存中以GL_TRIANGLES方式空繪制在3DSVerAndTexNode結構鏈表中的所有三角面片.從而獲得各三角面片的Z緩存深度值.(2)關閉深度測試設置glDepthMask(GL_FALSE),應用虛線模式glPushAttrib(GL_LINE_BIT),設置線寬glLineWidth(1.0),用GL_LINES方式進行所有網格面片三邊的繪制.(3)開啟深度測試glDepthMask(GL_TRUE),設置比較模式glDepthFunc(GL_LEQUAL),判斷三角形的各邊的Z深度值是否是最淺的,如果是則用實線重繪制以覆蓋在(2)中繪制的虛線,否則跳過不繪制而保留虛線.從而繪制得到帶虛線的線架模式.3.2glgl提高紋理的生成和插值3DS文件經常包含紋理信息.本文根據讀取到的貼圖圖像文件、紋理圖像所對應的三角面片以及三角面片角點的紋理映射坐標值,采用OpenGL的接口函數實現(xiàn)在三維網格模型上進行紋理貼圖.實現(xiàn)的具體流程步驟為:(1)通過上文文件讀取的方法有得到的貼圖文件名imagename,為圖像文件分配內存空間m_pImageMemory,并打開保存在硬盤上的imagename圖像文件,標記貼圖號m_uiTextureId.利用glGenTextures(1,@uiTextureId)創(chuàng)建紋理對象和glBindTexture(GL_TEXTURE_2D,uiTextureId)綁定紋理對象.(2)采用OpenGL的GL_MODULATE貼圖模式,實現(xiàn)根據當前的光照系統(tǒng)調整物體的色彩和明暗.(3)利用glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)和glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR)進行線性內部插值紋理濾波的設置.(4)利用gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,ImageWidth,ImageHeight,GL_RGB,GL_UN-SIGNED_BYTE,m_pImageMemory)自動生成多貼圖紋理,實現(xiàn)根據繪制圖形的大小來決定采用的紋理等級或者在不同的紋理等級之間進行線性內插.(5)完成上面的設置,在繪制每個頂點之前用glTexCoor
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度減肥健身器材銷售與服務合同
- 2025年度環(huán)境工程資料收集與評估合同范本
- 2025年度新型城鎮(zhèn)化建設安裝施工總承包合同
- 貴州2025年貴州省自然資源廳事業(yè)單位招聘14人筆試歷年參考題庫附帶答案詳解
- 邯鄲2024年河北邯鄲廣平縣招聘警務輔助崗位工作人員58人筆試歷年參考題庫附帶答案詳解
- 衡水2025年河北衡水職業(yè)技術學院招聘人事代理工作人員25人筆試歷年參考題庫附帶答案詳解
- 綿陽2024年四川省綿陽第一中學第三批招聘教師3人筆試歷年參考題庫附帶答案詳解
- 滁州安徽滁州天長市水利局機關綜合服務中心選調工作人員筆試歷年參考題庫附帶答案詳解
- 山西省卓越聯(lián)盟2024-2025學年高三下學期2月開學質量檢測試題 地理 含答案
- 喹吖啶酮類項目融資計劃書
- YY/T 1792-2021熒光免疫層析分析儀
- GB/T 32691-2016汽車空調電磁離合器
- 染廠公司簡介(4個范本)
- 鐵路工程概預算-工程經濟管理培訓-課件
- 面部激素依賴性皮炎的管理課件
- 智慧環(huán)衛(wèi)項目建設方案
- 人民醫(yī)院醫(yī)共體財務管理部工作手冊
- 高三日語一輪復習之自謙語句型課件
- YYT 0325-2022 一次性使用無菌導尿管
- 馬克思主義基本原理教案:第一章+教案
- 重走長征路卡通思維導圖
評論
0/150
提交評論