• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      SharpGL三維建模技術實現(xiàn)

      2017-06-20 22:57:17王曉松徐妍田董煒劉志強胡夢濤
      軟件導刊 2017年4期
      關鍵詞:三維建模

      王曉松+徐妍+田董煒+劉志強+胡夢濤

      摘要:目前沒有在C#中開發(fā)OpenGL的標準,在.NET Framework中也沒有OpenGL API接口。為此,研究了在C#中聯(lián)合SharpGL編寫三維建模算法,闡述了三維建模關鍵步驟,并且實例化例子。相比較C++,在動態(tài)鏈接庫SharpGL.dll支持下,在C#中進行SharpGL三維建模代碼可讀性強,開發(fā)變得更簡潔,程序可移植性佳。

      關鍵詞:SharpGL;C#;動態(tài)鏈接庫;三維建模

      中圖分類號:TP317.4

      文獻標識碼:A

      文章編號:16727800(2017)004020503

      0引言

      SharpGL是進行三維顯示的函數(shù)庫,其運行環(huán)境與平臺無關,能在Windows、Linux及Mac OS等操作系統(tǒng)上運行,故其在硬件、窗口及操作系統(tǒng)方面是相互獨立的,SharpGL能不依賴于任何硬件或操作系統(tǒng)即可運行。SharpGL本身只定義了一個標準,因此只要符合定義標準的函數(shù)庫,都可以稱為SharpGL標準函數(shù)庫。ATT、UNIX軟件實驗室、IBM等著名企業(yè)都采用OpenGL標準。SharpGL標準定義的函數(shù)庫分為4個部分:SharpGL核心庫、SharpGL實用庫、SharpGL輔助庫、SharpGL工具庫。SharpGL函數(shù)庫是一個實時渲染函數(shù)庫,能夠在短時間進行實時交互繪制。DirectX與其相似,但只能在Windows操作系統(tǒng)上執(zhí)行。 C#是微軟公司早在2000年就開始推出的一種高級編程語言,這種高級編程語言運行在.NET CLR環(huán)境上,并基于.NET Framework框架創(chuàng)作。C#是從C與C++語言派生出的,吸收了C與C++的優(yōu)點,并彌補了C與C++的缺點,從而產(chǎn)生功能強大、類型安全、更簡單的面向?qū)ο笳Z言。C#代碼框架具有面向?qū)ο蟆⒁妙惖雀拍?,幾乎囊括所有軟件開發(fā)與工程研究的最新成果。相比較C與C++而言,C#具有語法簡單易學、配置與調(diào)制簡單、程序開發(fā)周期短等優(yōu)點,廣泛應用于當今工程開發(fā)。本文將C#和SharpGL聯(lián)合,開發(fā)三維物體模型程序以提高效率。

      1SharpGL函數(shù)庫

      1.1SharpGL核心庫

      SharpGL動態(tài)鏈接庫——核心庫包含約115個可以被調(diào)用的函數(shù),統(tǒng)一將函數(shù)名的前綴命名為gl。核心庫函數(shù)用于常規(guī)圖形處理,應用范圍較廣。同一個功能函數(shù)輸入不同類型的參數(shù),從基本的115個函數(shù)中派生出來的函數(shù)表達式約有300個。

      1.2SharpGL實用庫

      SharpGL動態(tài)鏈接庫——實用庫包含約43個可調(diào)用函數(shù),統(tǒng)一將函數(shù)名的前綴命名為glu。SharpGL提供了豐富的繪圖函數(shù)命令,但所有圖形繪制都由點、線、面元素組合而成。glu函數(shù)通過調(diào)用核心庫函數(shù),為軟件開發(fā)提供了相對簡單的用法,可實現(xiàn)較為復雜的操作[1]。

      1.3SharpGL輔助庫

      SharpGL動態(tài)鏈接庫——輔助庫包含約31個可調(diào)用函數(shù),統(tǒng)一將函數(shù)名的前綴命名為aux。輔助庫函數(shù)提供面向?qū)ο蟮臄?shù)據(jù)輸入輸出處理、窗口操作以及繪制一些簡單的三維物體。

      〗1.4SharpGL工具庫

      SharpGL動態(tài)鏈接庫——工具庫包含約30個可調(diào)用函數(shù),統(tǒng)一將函數(shù)名的前綴命名為glut。glut是不依賴于任何操作系統(tǒng)平臺的SharpGL函數(shù)庫,用途是隱藏不同操作系統(tǒng)接口難題。工具庫函數(shù)以glut開頭,提供更為復雜的繪圖功能[2]。由于glut中的面向?qū)ο蟠翱诠芾砗瘮?shù)不依賴任何運行環(huán)境,因此SharpGL中的工具庫可以在各種操作系統(tǒng)中執(zhí)行命令[3]。

      2SharpGL建模環(huán)境創(chuàng)建

      2.1添加SharpGL引用

      在Visual Studio 2012中建立C#應用程序過程很簡單:在Visual Studio 2012編譯器環(huán)境中選擇新建項目——Visual C#--Windows窗體應用程序,輸入項目名稱與解決方案名稱,然后保存在適當路徑位置,點擊確定,就成功創(chuàng)建了WindowsForms應用程序。此時Visual Studio 2012會根據(jù)上一步的輸入,自動創(chuàng)建一個程序命名空間、一個窗體組建 (Form1)以及程序的主入口函數(shù) Main(string[] args)。 到此,Visual Studio 2012只是創(chuàng)建了應用程序主體,即編譯環(huán)境,使用SharpGL還必須添加SharpGL的動態(tài)鏈接庫引用。在C#中,引用是通過using關鍵字實現(xiàn)的,在編寫代碼窗口上部輸入代碼: using SharpGL; 至此,SharpGL的動態(tài)鏈接庫引用工作完成,下一步工作就可使用SharpGL函數(shù)繪制三維物體模型了。

      2.2創(chuàng)建SharpGL設備環(huán)境

      使用SharpGL相關代碼開發(fā)三維物體模型時,必須先建立繪制設備環(huán)境。先拖拉一個可視化組件,用于顯示三維模型繪制。在Visual Studio 2012項目名稱中添加一個組件,命名為SharpGLControl,然后為創(chuàng)建的組件類進行對象實例化,編寫如下代碼:

      // Get the SharpGL object. SharpGL gl = SharpGLControl.SharpGL;

      為了在SharpGLControl對象組件上繪制三維物體模型,必須先進行初始化設置,這一點與其它程序語言不同。SharpGLControl加載如下:

      //Clear the color and depth buffer. gl.Clear(SharpGL.GL_COLOR_BUFFER_BIT | SharpGL.GL_DEPTH_BUFFER_BIT); //Load the identity matrix. gl.LoadIdentity();

      2.3建立SharpGL繪制環(huán)境

      由于SharpGL直接使用繪制環(huán)境,與設備環(huán)境沒有關聯(lián)。因此,還需要建立一個SharpGL繪制環(huán)境,否則SharpGL函數(shù)不能調(diào)用。在SharpGLControl_SharpGLDraw中定義了繪制環(huán)境相關函數(shù),無需重寫這個函數(shù)就能直接調(diào)用。由于SharpGLControl_SharpGLDraw是由SharpGL類派生出來的,因而它具有Control類的全部屬性和功能。 SharpGL具有多種函數(shù),繪制環(huán)境如下:

      // Get the SharpGL object. SharpGL gl = SharpGLControl.SharpGL; //Set the projection matrix. gl.MatrixMode(SharpGL.GL_PROJECTION); //Load the identity. gl.LoadIdentity(); //Create a perspective transformation. gl.Perspective(60.0f,(double)Width / (double)Height,0.01,100.0); //Use the 'look at' helper function to position and aim the camera. gl.LookAt(-5,5,-5,0,0,0,0,1,0); //Set the modelview matrix. gl.MatrixMode(SharpGL.GL_MODELVIEW);

      通過以上步驟操作,SharpGL繪制環(huán)境創(chuàng)建工作就全部完成,在這個程序代碼環(huán)境中即可進行三維建模。SharpGL中創(chuàng)建的所有三維物體模型,如三維建筑物、家具、山峰等,都是用頂點描述的,因此三維物體模型繪制操作都可針對每個特征點進行計算,然后通過內(nèi)核矩陣函數(shù)進行光柵化形成二維像素。SharpGL的另一個核心模塊是矩陣算法變換,就是把三維物體模型轉(zhuǎn)換為二維圖像。

      3三維建模算法

      隨著計算機技術的不斷進步,在圖像、VR、游戲系統(tǒng)、醫(yī)療系統(tǒng)等領域構造和使用的模型越來越復雜、越來越精細。這些復雜的物體模型,不但對計算機的處理速度以及存儲容量提出了更高要求,而且成為實時繪制物體模型、通信傳輸?shù)钠款i,因此物體模型簡化研究成為非常重要的科研課題。物體模型簡化指在保持原有模型基本不畸變的條件下,采用適當?shù)暮瘮?shù)算法減少該物體模型的三角面數(shù)、邊數(shù)、頂點數(shù)[3]。 三維物體模型因其表面凹凸不平,呈現(xiàn)一種連續(xù)變化的曲面,這種曲面無法用平面地圖確切表示。單元三角形是三維物體模型的基本組建單元圖,為真實表現(xiàn)三維物體模型,每個單元三角形需要包括3個頂點和單元三角形的法向量,以此確定一個最小單位表面,不管多么復雜的三維物體模型都可以化解成多個單元三角形組合。對于同一物體,三維物體模型上的單元三角形并非獨立存在,而是所有單元三角形都是相互關聯(lián)的,這些關聯(lián)信息主要體現(xiàn)在以下兩方面:①鄰接關系即共邊與共頂點;②同一個單元三角形,法向量相等、法向量共面。通過上述單元三角形之間的聯(lián)系進行分類,即可組成不同的三維曲面模型。 三維物體模型三角網(wǎng)算法可通過兩個步驟實現(xiàn):①在三維物體模型包含的所有點云數(shù)據(jù)中搜索符合單元三角形條件的點,建立單元三角形;②判斷搜索到的單元三角形是否有共邊關系,如果滿足條件,就將單元三角形添加到三維物體模型的表面,如果沒有則進行其它搜索。 SharpGL算法類定義如下:

      public class Vertex public class Triangle ...... public class Mesh public void Compute(List set)

      三維物體模型的噪點數(shù)據(jù),必須去除點云數(shù)據(jù)的離群孤立點,編寫相關算法,設定除噪閾值。閾值參數(shù)為噪聲點閾值,小于這個值的點會刪除,否則就參與計算。 其它相關定義如下: 定義1:三維物體模型中任意兩個單元三角形共邊,則稱這兩個單元三角形相鄰; 定義2:三維物體模型中任意兩個單元三角形共頂點,則稱這兩個單元三角形相接; 定義3:如果存在一組單元三角形具有相接關系,且兩個單元三角形法向量相等,則這一組單元三角形在同一平面上; 定義4:如果存在一組單元三角形具有相接關系,且兩個單元三角形的法向量處于某個平面上,則這組單元三角形在同一個柱面上。

      4建模關鍵環(huán)節(jié)

      4.1SharpGL渲染流程

      在使用SharpGL繪制過程中,需要完成的加載任務有:設置各種緩存,如顏色、深度等,加載場景物體表面貼膜紋理,設置光照與陰影模式,建立景物顯示列表、圖像質(zhì)量和材料性質(zhì)等[4]。SharpGL渲染步驟如下: ①輸入三維物體模型要渲染的點的云數(shù)據(jù)等相關信息;②設置攝像頭的位置和視角,調(diào)整視覺角度,把三維物體模型安置到三維場景合適的位置;③設置投影光照位置、方向、顏色、類型等屬性; ④設置三維物體模型顏色、紋理貼圖等材質(zhì)參數(shù); ⑤將上述三維信息轉(zhuǎn)化為二維圖像。 SharpGL另一個重要模塊是三維矩陣模塊,據(jù)此進行三維物體模型的移動、旋轉(zhuǎn)和縮放。

      4.2紋理映射

      對三維物體模型進行渲染,為了得到現(xiàn)實感效果,常用技術是模型表面貼圖。通過紋理貼圖,可使三維物體模型顏色不再是單一色彩,而是具有各種風格。 三維物體模型貼圖原理:給每個三維物體模型頂點對應一個二維圖形坐標,這樣在顯示三維物體模型頂點時可采用二維圖像上相應像素的顏色值。三維物體模型位于三維空間,每個頂點的坐標是(x,y,z)三個分量,而二維圖像位于二維空間,每個坐標是(u,v)兩個分量,每個坐標稱為頂點的紋理坐標[5]。三維物體模型制作時是沒有紋理坐標的,需要經(jīng)過專門的參數(shù)化過程來生成紋理坐標。如果一個三維物體模型沒有紋理坐標就無法使用紋理貼圖技術來渲染物體模型表面,因此,不是每個三維物體模型都可以顯示紋理貼圖,必須先生成紋理坐標才可進行貼圖渲染。三維物體模型的紋理坐標對應的是二維空間像素位置,而不是像素的具體顏色,因此同一個三維物體模型只要更換貼圖圖像,就可顯示不同的渲染效果。

      4.3SharpGL三維坐標變換

      SharpGL三維物體模型變換和二維變換類似,其實質(zhì)就是在二維變換的基礎上增加z坐標值得到。三維物體模型基本變換有模型平移、旋轉(zhuǎn)、比例縮放、切錯、對稱等。對于三維空間坐標系,需要采用齊次坐標系,其數(shù)學變換矩陣是4×4階矩陣。三維物體模型平移變換,指物體模型在空間坐標系中沿著指定方向移動一段距離而形狀和大小保持不變的過程。平移變換作用在點上,向量沒有位置屬性變化,因此向量的平移對變換沒有意義。已知三維坐標系中一個點的坐標是P(x,y,z),沿X軸、Y軸、Z軸方向分別平移tx、ty、tz后,得到新的坐標P'(x',y',z')的函數(shù)表達式為:

      三維物體模型空間旋轉(zhuǎn)變換是個復雜的數(shù)學矩陣模型變化,通常認為物體模型繞某軸逆時針方向旋轉(zhuǎn)時角度為正,順時針方向旋轉(zhuǎn)時角度為負。三維物體模型作旋轉(zhuǎn)變換時,需要兩個必不可少的條件,即旋轉(zhuǎn)軸和旋轉(zhuǎn)角度。旋轉(zhuǎn)前后三維物體模型的大小和形狀沒有變化,變化的只是空間點的位置坐標。其中繞坐標軸旋轉(zhuǎn)變換是最簡單的變換,當三維物體模型繞某一坐標軸旋轉(zhuǎn)時,物體模型上各點在此軸的坐標值不變,而在另兩個坐標軸組成的坐標面上的坐標相當于一個二維的旋轉(zhuǎn)變換[6]。筆者使用三維數(shù)據(jù),最終形成三維物體模型顯示結果如圖1所示。5結語

      本文闡述了在C#中實現(xiàn)SharpGL三維物體建模的幾個關鍵步驟。從最終成型結果可知,在動態(tài)鏈接庫SharpGL.dll支持下,使用C#進行SharpGL三維物體建??刹僮餍詮姟⒋a簡潔易讀。與C++比較,C#省去了很多工作,譬如像素格式設置、設備環(huán)境、繪制環(huán)境的激活與去活、前后臺緩存交換等,本文方法僅僅需要考慮的是如何在三維建模關鍵步驟中組織好SharpGL函數(shù)調(diào)用命令。

      參考文獻:

      [1]蔡振鋒,密長林,王榮華,等.基于OpenGL的地下管線三維緩沖分析算法研究及應用[J].山東國土資源,2016(9):6064.[2]高士娟,毛先成,張寶一,等.基于平面地質(zhì)圖的地質(zhì)體三維建模[J].地質(zhì)找礦論叢,2015(5):594601.

      [3]閔芳,張志先,楊功廷.基于OpenGL的三維建筑可視化研究與仿真[J].現(xiàn)代電子技術,2016(2):7881.

      [4]李春林,曹宇,朱德華,等.激光加工工藝軟件的三維圖形層次化拾取方法[J].激光,2016(7):5861.

      [5]田明銀,蘭一麟濤.基于分形算法的三維地形可視化應用[J].電子設計工程,2016(14):2026.

      [6]董鴻鵬,姜本清,方偉.基于OpenGL的三維模型渲染技術研究[J].艦船電子工程,2015(10):114128.

      [7]劉韜.基于OpenGL噴泉粒子系統(tǒng)設計與實現(xiàn)[J].科技視界,2016(11):287288.

      [8]梁春艷,李志雄,蘇清茂.六自由度機器人3D建模仿真研究[J].西南科技大學學報,2016(2):8186.

      (責任編輯:杜能鋼)

      猜你喜歡
      三維建模
      增強現(xiàn)實技術在幼兒立體書研發(fā)中的應用
      軟件導刊(2016年12期)2017-01-21 15:49:59
      maya教學中存在的問題及解決對策
      東方教育(2016年21期)2017-01-17 21:11:27
      3D虛擬仿真技術在體育館購票系統(tǒng)開發(fā)中的應用研究
      農(nóng)用風力發(fā)電機葉片設計
      數(shù)控仿真系統(tǒng)三維建模技術研究
      垂直軸風力發(fā)電機葉片建模與研究農(nóng)用
      基于GIS的網(wǎng)絡三維系統(tǒng)的構建及應用
      淺談BIM產(chǎn)業(yè)鏈項目在互聯(lián)網(wǎng)時代的應用研究
      商(2016年30期)2016-11-09 20:12:58
      三維建模技術在家畜器官建模中的應用
      科技視界(2016年16期)2016-06-29 18:34:41
      航空發(fā)動機三維工作演示系統(tǒng)設計
      科技視界(2016年16期)2016-06-29 17:22:46
      宣汉县| 清丰县| 乐至县| 安丘市| 宜宾县| 修水县| 彰化县| 香河县| 尉氏县| 邵武市| 乌鲁木齐市| 平阴县| 榕江县| 房山区| 宁都县| 建湖县| 广东省| 左权县| 沂南县| 淮北市| 浦县| 太原市| 灵寿县| 太仆寺旗| 密山市| 洮南市| 建昌县| 邯郸市| 元朗区| 斗六市| 香格里拉县| 西畴县| 钟山县| 韩城市| 陆丰市| 江油市| 灌南县| 阳高县| 东兴市| 博湖县| 崇阳县|