999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

OpenGL顯示3DS模型若干問題的研究

2010-07-07 06:52:36胡平平劉建明王晶杰
圖學學報 2010年4期
關鍵詞:方法模型

胡平平, 劉建明, 王晶杰

(1. 北京信息科技大學,北京 100192;2. 國網信息通信有限公司,北京 100761)

OpenGL是一個著名的開放式三維圖形開發函數庫,它提供的函數不僅可以創建基本的 3D物體原形還能夠很方便地對 3D物體進行各種操作和變換,得到逼真的 3D顯示效果,這使它成為一個非常流行的 3D圖形瀏覽開發工具。但OpenGL卻不適于創建復雜的不規則 3D物體。3DS是Autodesk公司存儲3D模型數據的一種文件格式,許多流行的 3D建模軟件和圖形格式轉換工具都能夠生成 3D模型的 3DS文件,將OpenGL技術和3DS模型數據結合實現對3D物體的瀏覽便成為一種廣泛使用的方法。

由于3DS文件的數據格式沒有官方的正式說明文檔,盡管很多文獻[1-3]對用OpenGL讀取、顯示和控制3DS模型數據的方法進行了介紹,但都側重于OpenGL編程實現方法,只涉及了基本的靜態3DS模型數據的使用。各種資源上能夠得到的讀取3DS數據的方法基本上一樣,都沒有對動態數據進行處理,也沒有考慮數據轉換的性能。用這些方法顯示含動畫信息的3DS模型時會出現物體位置錯位的現象,即使是靜態數據,當模型復雜且數據量較大時,其處理速度常常慢到不能實用的地步。

本文從OpenGL顯示3D模型的數據處理過程出發,結合3DS文件數據的組織結構,扼要介紹了如何由3DS文件構造OpenGL顯示數據的方法。重點討論了法線向量在OpenGL顯示中的兩種應用效果和由3DS數據生成法線向量的方法,給出了一種高效的法線向量求解算法,該算法的速度比現有方法快一至兩個數量級,極大地提高了數據轉換的性能。本文還介紹了3DS模型中和動畫有關的關鍵幀數據的使用方法,解決了現有方法在顯示帶動畫信息的3DS模型時物體位置不正確的問題。

1 OpenGL和3DS數據的關系

1.1 OpenGL的數據處理過程

OpenGL顯示三維物體的一般過程是:保存當前變換矩陣、設置新的視景體和新的變換矩陣、設置每一個三維物體的數據、恢復當前變換矩陣。設置三維物體數據的過程是由一系列嵌入在glBegin()和glEnd()調用之間的OpenGL函數調用構成的,其過程如下所示:

對每一個三維物體:

若該物體沒有紋理或各面有相同紋理映射則glBegin();

對物體的每一個面:

若該面有紋理映射則設置紋理;

若該物體不同面有不同的紋理則glBegin();

設置以面為單位的面法線向量;

設置紋理或材質的顏色;

對每一個面的所有頂點:

設置以頂點為單位的頂點法線向量;

若該面有紋理則設置頂點的紋理坐標;

設置頂點坐標;

若該物體不同面有不同的紋理則glEnd();

若該物體沒有紋理或各面有相同紋理映射glEnd();

在上面的過程中,以面為單位的法線向量設置和以頂點為單位的法線向量設置是兩種不同的方式,下文將詳細介紹。如果物體沒有紋理映射或各面的紋理映射相同,則 glBegin()和 glEnd()以物體為單位,否則應該以每一個面為單位,這樣不同的面才能顯示不同的紋理。

1.2 3DS文件數據的組織結構

關于3DS文件的格式,文獻[4]和文獻[5]有較詳細的介紹,此處僅列出和OpenGL顯示數據有關部分的組織結構:

3DS文件數據:

文件版本數據(ID=0x0002);

編輯數據(ID=0x3D3D):

. 材質數據(ID=0xAFFF);

. . 材質名稱數據(ID=0xAFFF);

. . 材質顏色數據(ID=0xA010/20/30);

. . 材質紋理數據(ID=0xA300);

. 物體數據(ID=0x4000):

. 物體名稱數據;

. 物體頂點數據(ID=0x4110);

. 物體面數據(ID=0x4120);

. . 面材質數據(ID=0x4130);

. . 面材質名稱;

. . 同材質面索引數據;

. 物體轉換矩陣數據(ID=0x4160);

關鍵幀數據(ID=0xB000):

關鍵幀名稱(ID=0xB00A);

關鍵幀起止幀數據(ID=0xB008);

物體關鍵幀數據(ID=0xB002);

物體關鍵幀標識數據(ID=0xB030);

物體關鍵幀名稱和層次數據

(ID=0xB010/11);

物體關鍵幀支點坐標數據(ID=0xB013);

物體關鍵幀移動數據(ID=0xB020);

物體關鍵幀轉動數據(ID=0xB021);

物體關鍵幀縮放數據(ID=0xB022);

1.3 OpenGL顯示數據和3DS數據的關系

從上面的介紹可知,OpenGL顯示處理是以物體為單位進行的,3DS的數據則按照類型組織,對應于OpenGL中同一個物體的數據要從3DS文件中不同類型的數據獲得,具體方法是:

物體的頂點和面數據:直接來自3DS的物體頂點數據(x,y,z坐標值)和物體面數據(該面所用頂點的索引號和方向)。

物體的材質數據:由3DS物體面數據的面材質名稱數據得到材質名稱,再由該材質名稱到3DS材質數據中找到對應的材質顏色和紋理數據。而物體面數據的同材質面索引數據則指出哪些面使用這個材質。

物體的位置數據:該數據由物體頂點數據、物體轉換矩陣數據和關鍵幀數據共同決定,前兩種數據從物體數據中直接得到,后一個則來自物體對應的關鍵幀數據。具體生成方法,在本文后面介紹。

物體的法線向量數據:由上述得到的物體頂點和面數據通過計算得到,具體方法見下文。

2 OpenGL中法線向量的作用和求解方法

2.1 法向量的作用和效果

OpenGL顯示三維物體時,需要為每一個頂點設置法線向量,法線向量不僅為OpenGL光照處理確定每一個面的正反提供依據,而且還影響到物體的顯示效果[6-7]。OpenGL法向量的設置有兩種方法:以面為單位和以頂點為單位,前一種方法每個面的所有頂點使用相同的法向量,后一種方法每個面的不同頂點有不同的法向量(又稱平均法向量)。圖1和圖2是同一個3D模型用兩種法向量設置方法的顯示效果圖。

從上面的效果圖可以看出,以頂點為單位的法向量方法顯示的物體比較平滑,這也是OpenGL顯示3DS模型時最常用的方法。

圖1 法向量以面為單位的顯示效果

圖2 法向量以頂點為單位的顯示效果

2.2 現有的法向量求解方法

3DS模型并沒有直接提供OpenGL顯示用的法向量數據,這些數據要從3DS模型的面數據中求解得到。3DS模型的面是由3個頂點和一個方向碼構成的三角面片,讀入3DS模型的面數據后,首先要統一各個面的方向(必要時要根據方向碼調整3個頂點的順序),然后按特點順序由三角形的兩個邊向量的叉積求出該三角形的法向量。如果采用以面為單位的法向量方法,則構成三角形的3個頂點的法向量就是該三角形的法向量;如果采用以頂點為單位的法向量方法,由于同一個頂點可能為不同的三角形共用,此時一個頂點的法向量就是使用該頂點的所有三角形法向量的平均向量。現有的頂點法向量求解方法如下所示:

對每一個三維物體:

對物體的每一個面:

計算該面的法向量并歸一化;

對物體的每一個頂點:

在物體所有面中尋找用到該頂點的面并將該面的法向量疊加;

疊加法向量平均并歸一化后作為該頂點的法向量;

該方法在求某一個頂點的法向量時,要遍歷物體所有面的3個頂點,其運算量是:頂點數量X面數量X3,由于是先求出所有面的法向量然后再使用,因此,計算過程中還要為每一個面設置一個法向量存儲空間。

2.3 改進的法向量求解方法

3D物體模型中,一個頂點可能被多個面使用,但用到某一個頂點的面占全部面的比例往往很小。一般情況下,簡單模型的比例最大約10%,復雜大型模型的比例最大約1%,可見現有算法為求某一個頂點的法向量而遍歷所有面的處理大部分是不必要的。鑒于此,可以對頂點法向量的求解方法改進為如下所示:

對每一個三維物體:

將該物體所有頂點的法向量設置為0;

對物體的每一個面:

計算該面的法向量;

將該面的法向量疊加到該面 3個頂點的法向量中;

對物體的每一個頂點:

將頂點的法向量除以其疊加次數并歸一化;

上述新方法在求頂點的法向量時避免了對不使用該頂點的面的判斷處理,且新方法不用為每一個面設置一個法向量存儲空間,只需為每一個頂點設置一個疊加計數器變量,由于計數器變量所使用的空間只是法向量的1/6〔計數器為兩字節整數,法向量為3個浮點數,用12字節〕,而頂點的數量最多是面數量的3倍,故新方法使用的變量空間最多是現有方法的1/2。

2.4 兩種法向量求解方法的比較

新頂點法向量的求解方法在使用變量空間上至少節省一半,而計算量的節省情況則和 3D模型的具體情況有關。只有當使用每一個頂點的面的數量和面的總數量相等時,現有算法才不存在無用的處理,此時兩種算法的處理量幾乎相等,但該情況意味著每一個頂點被所有的面共用,這是不可能存在的,因此新算法的處理量總是小于現有方法。

表1是兩種處理方法對幾種典型模型的實際處理時間對比,可以看出,模型的數據量越大,尤其是頂點被共用的面的數量相對于面的總數量越小,新方法的改進效果就越明顯。對于一般模型數據,新方法的速度平均是現有方法的幾倍至幾十倍,而對大型模型,速度提高的效果非常明顯,約為幾百倍。

表1 兩種法向量求解方法的計算時間比較

3 3DS模型關鍵幀數據的使用方法

不帶動畫信息的3DS模型中各物體的頂點數據可以直接作為這些物體的實際位置坐標數據,但當3DS模型帶動畫信息時,模型中各物體的實際位置一般由頂點數據和關鍵幀數據共同決定,如果僅按頂點數據顯示物體,則模型中的物體可能會顯示在錯誤的位置上。

3DS模型中每一個物體的關鍵幀信息由物體的名稱或關鍵幀的層次結構決定。關鍵幀的層次關系是一個樹狀結構,當某一個物體是根節點或根節點的葉節點時,其位置信息僅由它自己的關鍵幀數據決定;否則該物體的位置信息要由它自己的關鍵幀數據和它所有父節點的關鍵幀數據共同決定。

3DS模型中各種關鍵幀數據塊的結構在文獻[4]和文獻[5]中有一定的介紹,但這些數據的具體含義和使用方法都沒有介紹。下面僅對與物體位置有關的關鍵幀數據含義和使用方法做一個簡單介紹,至于如何利用關鍵幀數據在OpenGL環境中顯示可以運動的3DS模型,由于篇幅所限,此處不做介紹。

3.1 物體關鍵幀數據的確定方法

3DS模型中每一個關鍵幀數據都有自己的名稱,該名稱在名稱層次塊(0xB010)中,如果其中的名稱不是“DUMMY”,則該關鍵幀數據就屬于名稱與之匹配的物體,否則,該關鍵幀數據屬于一個虛物體,該物體是一個父節點,它的實際名稱在后面的虛名稱塊(0xB011)中,而該父節點的關鍵幀數據為其所有子節點共用,它所含子節點的關鍵幀數據位于其后,由子節點關鍵幀數據的層次號決定。

在關鍵幀數據中,每一個物體的關鍵幀數據(0xB002)都有一個位于名稱層次塊(0xB010)中的層次號,層次號是由該關鍵幀的層次關系和它在關鍵幀數據中出現的位置決定的,其編排方法是:根關鍵幀的層次號為-1,其它關鍵幀的層次號由0開始遞增或保持不變。層次號保持不變,說明這些關鍵幀屬于同一個層次;層次號增加則表示該關鍵幀是上一個節點的子節點;層次號減小,則說明該關鍵幀是一個新的父節點,該節點的層次同前面與之層次號相同的節點一樣,每一個父節點之后新子節點關鍵幀的層次號就是該關鍵幀數據出現的實際位置的順序號(新子節點關鍵幀的層次號一定是一個沒有出現過的值)。以后各關鍵幀的層次號依上述規律編排,直到所有的關鍵幀數據編排完畢。

3.2 物體位置和關鍵幀數據的關系

3DS模型中物體的位置由以下數據決定:物體的頂點坐標數據(0x4110)、轉換矩陣數據(0x4160)中的源點坐標和物體關鍵幀數據中的支點坐標數據(0xB013)、移動數據(0xB020)、旋轉數據(0xB021)及縮放數據(ID=0xB022)。

3DS模型中不帶動畫信息的物體也有一幀關鍵幀數據,只不過其關鍵幀數據的支點坐標和旋轉關鍵幀數據都是0,縮放數據是1。帶動畫信息的物體則按它具有關鍵幀的多少帶有指定數量的關鍵幀數據。物體轉換矩陣數據中的源點坐標表示該物體當前位置和它被創建時原始位置的位移,該數據和物體關鍵幀數據第0幀的移動數據相同。物體的頂點坐標實際上就是由物體被創建時的初始位置和大小按照其第0幀關鍵幀數據做變換(平移、旋轉和縮放)生成的。而物體關鍵幀數據中的支點坐標則是頂點坐標表示的位置到當前位置的平移量,因此,為了顯示物體正確的當前位置,應該將物體的頂點坐標進行調整,方法是:將物體各頂點坐標減去其關鍵幀數據的支點坐標。

4 結 論

本文給出的由3DS模型數據求解頂點法向量的新方法和關鍵幀數據的使用均成功地應用到作者開發的多屏同步 3D顯示系統中,不僅實現了大型3DS模型的快速裝入和帶動畫信息的3DS模型物體位置的正確顯示,還實現了帶動畫信息的3DS模型物體的運動顯示,效果良好。

[1]趙文廣, 李仲學, 李翠平. 面向工程可視化仿真的VC++, OpenGL與3DS集成技術[J]. 北京科技大學學報, 2001, 23(6): 563-565.

[2]殷素峰, 高雪強, 楊勝強. 在 OpenGL環境下開發3DS文件瀏覽器[J]. 工程圖學學報, 2005, 26(6):22-25.

[3]尹士偉, 張光年, 郭新宇. 一種控制3DS模型的新方法的研究與實現[J]. 微計算機信息, 2007, 23(3-2):307-308.

[4]Martin van Velsen.3D-Studio File Format(.3ds) [EB/OL].http://www.the-labs.com/Blender/3dsspec.html,1998.10.5.

[5]Jeff Lewis.The Unofficial 3DStudio 3DS File Format[EB/OL].http://www.the-labs.com/Blender/3DS-details.html,1998.10.5.

[6]喬 林, 費廣正, 林 杜, 等. OpenGL程序設計[M].北京: 清華大學出版社, 2000. 194-202.

[7][美]Dave Shrieiner, Mason Woo等. OpenGL編程指南(第 4版)[M]. 鄧鄭祥譯.北京:人民郵電出版社,2005. 44-45.

猜你喜歡
方法模型
一半模型
重要模型『一線三等角』
重尾非線性自回歸模型自加權M-估計的漸近分布
學習方法
3D打印中的模型分割與打包
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
FLUKA幾何模型到CAD幾何模型轉換方法初步研究
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
主站蜘蛛池模板: 成人亚洲视频| 久久久黄色片| 亚洲无线一二三四区男男| 人妻少妇乱子伦精品无码专区毛片| 米奇精品一区二区三区| 国产精品网址在线观看你懂的| 黄色网址手机国内免费在线观看 | 国产精品亚洲欧美日韩久久| 她的性爱视频| 亚洲视屏在线观看| 亚洲综合九九| 小说区 亚洲 自拍 另类| 久久一本日韩精品中文字幕屁孩| 国外欧美一区另类中文字幕| 国产中文一区二区苍井空| 五月婷婷精品| 久草视频中文| 成人福利在线观看| 伊人网址在线| 午夜综合网| 日韩黄色精品| 一本一道波多野结衣av黑人在线| 中文成人在线视频| 夜精品a一区二区三区| 国产福利在线免费| 人人澡人人爽欧美一区| 啪啪永久免费av| 日韩欧美国产综合| 精品国产aⅴ一区二区三区| 欧美黑人欧美精品刺激| 亚洲中文字幕国产av| 午夜成人在线视频| 日本成人一区| 55夜色66夜色国产精品视频| 亚洲av无码人妻| 亚洲天堂网在线播放| 欧美一区二区三区不卡免费| 色亚洲激情综合精品无码视频| 国产精品美女自慰喷水| 天天综合色网| 中文字幕波多野不卡一区| 波多野吉衣一区二区三区av| 九色视频在线免费观看| 国产成人精品2021欧美日韩| 黄色在线不卡| 日韩小视频在线播放| 亚洲高清资源| 亚洲天堂福利视频| 欧美 亚洲 日韩 国产| 国产色伊人| 日韩毛片在线播放| 欧美激情首页| 91丝袜美腿高跟国产极品老师| 亚洲美女一级毛片| 色综合日本| 亚洲AV无码一区二区三区牲色| 亚洲最新网址| 2021最新国产精品网站| 999在线免费视频| 欧美全免费aaaaaa特黄在线| 亚洲欧美日韩色图| 极品av一区二区| 永久免费精品视频| 国产精品大尺度尺度视频| 欧美三级不卡在线观看视频| 综合色区亚洲熟妇在线| 在线观看免费国产| 亚洲欧洲一区二区三区| 99爱视频精品免视看| 女人18毛片一级毛片在线| 国产乱子伦视频在线播放| 91丝袜乱伦| 色成人综合| 黄片一区二区三区| 国产一二视频| 日本国产精品| 国产拍揄自揄精品视频网站| 国产尤物视频在线| 久热这里只有精品6| 国产午夜福利亚洲第一| 国产精品无码翘臀在线看纯欲| 日韩精品欧美国产在线|