王靜 席澤敏 周超
(海軍工程大學(xué)電子工程學(xué)院,武漢 430033)
OpenGL即開放型圖形庫(open graphic library),是一個優(yōu)秀的三維圖形硬件的軟件接口,同時也是一個跨平臺、開放性的三維圖形和模型庫。在分析復(fù)雜目標的電磁散射特性時,首先建立目標的幾何模型。如果利用OpenGL會比較復(fù)雜,因為它沒有建立三維幾何模型的高級命令,要通過建立基本的幾何圖元(如點、線、面等)來實現(xiàn)。相對而言運用3DS MAX軟件建模要節(jié)約不少時間。
在電磁環(huán)境中,入射角相對于目標體的入射角度不同會引起目標不同的散射特性,因此準確判斷入射方向上目標的可見部分是散射計算的前提,即目標的遮擋面判別。OpenGL作為一種用于實時3D圖形的應(yīng)用程序編程接口(Application Programming Interface,API),提供了 155 個圖形函數(shù),可以利用這些函數(shù)來實時構(gòu)造目標模型。
計算機圖形學(xué)中介紹了復(fù)雜物體的面消隱方法主要有區(qū)域排序法、深度緩存法、掃描線算法[1]。本文利用 OpenGL的圖形功能和 VC++的編程功能,實現(xiàn)讀取3DS模型文件并設(shè)置光照入射點,利用深度緩存法(z-buffer algorithm)繪制不同入射角度時的目標模型可見部分。該算法通過借助額外的存儲空間來保存繪制過程中繪制器已經(jīng)繪制的多邊形的深度信息。所以在使用時啟用深度緩存以后還必須清空深度緩存。
表1 幾個主要塊的ID與包含信息
3DS模型文件的基本構(gòu)成單位是塊,塊包括塊頭和主體內(nèi)容,塊頭又包括塊的 ID和塊的長度,主體內(nèi)容是塊的數(shù)據(jù)信息。每一個3DS文件的開頭都是由一個ID為0x4D4D的基本塊構(gòu)成,此外還有兩種主塊:ID為3D3D的3D編輯程序塊和ID為B000的關(guān)鍵幀塊。表1所示為幾個主要塊的 ID與包含信息。下面列出幾個主要塊的ID與包含信息。
下面進行文件內(nèi)容的讀入[3]:
①首先定義讀取模型中需要設(shè)置的一系列數(shù)據(jù)結(jié)構(gòu)。
④場景初始化:創(chuàng)建窗體,初始化 OpenGL環(huán)境,設(shè)置OpenGL繪圖窗口大小,投影模式,定義視圖體,設(shè)置光源,定義視點位置、視角和視線方向。
在OpenGL中設(shè)置光源函數(shù)為glLight*()[1,2],用時需啟用光照計算,例如對于單個光源可以輸入代碼:
glEnable(GL_LIGHTING);
該函數(shù)涉及的參數(shù)包括視口位置(eye)、被視察點(at)、所期望的up方向。
⑤繪制場景:調(diào)用類CTriList中的drawGL()繪制函數(shù),通過函數(shù) glTranslatef 、glRotatef實現(xiàn)物體在坐標系中的移動和旋轉(zhuǎn)得到期望的場景顯示。
啟動深度檢測,打開深度檢測開關(guān),并設(shè)置檢測方式:
并且在完成繪圖以后,實現(xiàn)禁止深度檢測:
以艦船模型為例,使用 3DS MAX軟件建其模型如圖1所示。
圖1 3DS MAX模型
將其3DS文件讀入OpenGL,設(shè)置視口位置,開啟深度緩存,繪制場景圖。以四個入射角度為例,λ代表入射角,θ代表俯仰角,船頭方向為正方向。圖2顯示了不同入射角度船??梢姴糠诛@示。
可以通過對圖像的移動進行放大和縮小,可以清晰的顯示在固定入射角時物體的可見部分,并且可以快速的進行判別。
在進行目標電磁計算時對目標的可見部分進行判別是必不可少的一部,對于簡單的物體可以使用面自身的遮擋以及面與面的遮擋來判別,但是對于復(fù)雜的物體來說,判別的過程比較麻煩。因此,本文選用在 VC++6.0的基礎(chǔ)上使用OpenGL實現(xiàn)對3DS格式的導(dǎo)入,即可以簡化建模的過程,也可以通過OpenGL實現(xiàn)入射方向上目標可見部分的實時判別。不僅縮短了判別的工作量和時間,也適用于電磁散射計算中。
[1]李春雨等. 計算機圖形學(xué)及實用編程技術(shù)[M]. 北京航空航天大學(xué)出版社, 2009: 157-158, 271-274.
[2]Edward Angel.OpenGL編程基礎(chǔ)[M]. 北京: 清華大學(xué)出版社(2008): 75-96, 120-128.
[3]和平鴿工作室. OpenGL高級編程與可視化系統(tǒng)開發(fā)高級編程篇[M]. 中國水利水電出版社(2005):68-77.
[4]湯彬. 基于 OpenGL圖形消隱的研究[J]. 上海工程技術(shù)大學(xué)學(xué)報, 2005(3).
[5]高美真, 黃嬌青. OpenGL中的圖形變換[J]. 焦作師范高等??茖W(xué)校學(xué)報, 2006(6).
[6]潘修強. 利用OpenGL和3DS MAX構(gòu)建復(fù)雜模型[J]. 浙江工貿(mào)職業(yè)技術(shù)學(xué)院學(xué)報, 2006(12).
[7]趙衛(wèi)東, 衛(wèi)剛, 李啟炎. 在OpenGL下面消隱和線消隱的實現(xiàn)[J]. 計算機工程, 2002(6).
[8]楊東梅, 朱勝緣, 路偉成. OpenGL與 3D Studio MAX結(jié)合實現(xiàn)三維仿真[J]. 應(yīng)用科技, 2004(2).