亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于OpenGL的三維動畫課件的設(shè)計與制作

        2014-08-11 14:40:13張三川
        陜西開放大學(xué)學(xué)報 2014年2期
        關(guān)鍵詞:三維動畫紋理光源

        張三川

        (陜西廣播電視大學(xué) 圖書館,陜西 西安 710119)

        【遠程教育】

        基于OpenGL的三維動畫課件的設(shè)計與制作

        張三川

        (陜西廣播電視大學(xué) 圖書館,陜西 西安 710119)

        在對OpenGL的工作原理和工作方式進行分析的基礎(chǔ)上,以3D太陽系模型課件為例,探索基于OpenGL技術(shù)的三維動畫課件的設(shè)計和制作技術(shù),較好地解決了3D模型的2D渲染、物體的轉(zhuǎn)動以及轉(zhuǎn)動軌跡、3D模型的遠近視角等問題。

        OpenGL;三維動畫;渲染;光照;紋理映射;透視矩陣;課件

        引言

        三維動畫能夠逼真地模擬現(xiàn)實環(huán)境,創(chuàng)造常規(guī)拍攝所無法實現(xiàn)的場景和事件,出色展現(xiàn)從微觀世界到宏觀世界,從真實空間到想象空間的各種景象,使人產(chǎn)生視覺沖擊,給人以身臨其境、耳目一新之感。三維動畫被廣泛應(yīng)用于教育、科研、醫(yī)學(xué)、軍事、娛樂等諸多領(lǐng)域。在教育上,動畫可以激活學(xué)習(xí)興趣,實現(xiàn)對抽象和復(fù)雜概念的深層理解,深受師生的喜愛,因此在課件中廣泛應(yīng)用。

        OpenGL是SGI公司開發(fā)的一套高性能的圖形處理庫,它是圖形硬件的軟件界面,是程序員管理這些圖形硬件的橋梁。OpenGL處理圖形具有高實時性、大計算量的特點。通過OpenGL可以創(chuàng)建交互式的應(yīng)用程序,實現(xiàn)具有逼真效果的三維圖形。OpenGL已被認為是高性能圖形和交互式視景處理的標準,目前包括ATT公司UNIX軟件實驗室、IBM公司、DEC公司、SUN公司、HP公司、Microsoft公司和SGI公司在內(nèi)的幾家在計算機市場占領(lǐng)導(dǎo)地位的大公司,都采用了OpenGL圖形標準。包括微軟在內(nèi)的許多著名公司提供的編譯平臺,如Visual C++6.0、C++ Builder、VB等開發(fā)工具,都將OpenGL作為一個重要的模塊擴展進來,從而大大增強了這些編譯平臺的圖形處理能力。

        本文以3D太陽系模型課件為例,在Visual C++6.0使用OpenGL技術(shù),探索三維動畫課件的設(shè)計和制作方法,嘗試解決3D模型的2D渲染、物體的轉(zhuǎn)動以及轉(zhuǎn)動軌跡、3D模型的遠近視角等問題。

        一、 OpenGL軟件

        (一)OpenGL簡介

        OpenGL是一個高性能的圖形開發(fā)軟件包,約有120個函數(shù),分別包含在標準庫(OpenGL.lib)、實用庫(glu.lib)和輔助庫(glaux.lib)中。開發(fā)者可以利用這些函數(shù)來構(gòu)造景物模型、進行三維圖形交互軟件的開發(fā)。OpenGL是作為一種新型的接口來設(shè)計的,其與硬件無關(guān)的特性使它可以在不同的硬件平臺上實現(xiàn)。為了實現(xiàn)這一跨平臺性能,OpenGL沒有設(shè)置執(zhí)行窗口任務(wù)或獲取用戶輸入的命令,程序員必須通過所使用的窗口系統(tǒng)來控制正在使用的特定硬件。作為底層的平臺,OpenGL也不提供具體三維物體模型的高級命令, OpenGL的程序員必須用一系列的點、線、面來組合成自己想要的模型。雖然有著像微軟的direx這些產(chǎn)品的競爭,但OpenGL 仍然在不斷發(fā)展進步中。在渲染質(zhì)量上,OpenGL作為三維圖形設(shè)計領(lǐng)域的工業(yè)標準,在圖象渲染方面有很大優(yōu)勢,常常使用在對圖象要求較高的領(lǐng)域。而Direx由于計算速度快,則更多的應(yīng)用于游戲制作。OpenGL被設(shè)計成獨立于硬件、獨立于窗口系統(tǒng),能夠運行在各種操作系統(tǒng)的各種計算機上,以及客戶/服務(wù)器模式。它低端應(yīng)用上的主要競爭對手是MS-Direct三維,該圖形庫是以COM接口形式提供的,所以較為復(fù)雜,穩(wěn)定性差,另外微軟公司擁有該庫版權(quán),目前只在Windows平臺上可用。

        (二)OpenGL工作流程

        OpenGL的基本工作流程見圖1。

        圖1 OpenGL基本工作流程

        處理由左側(cè)開始,首先根據(jù)基本圖形單元建立景物模型,并且對所建立的模型進行數(shù)學(xué)描述(OpenGL 把點、線、多邊形、圖像和位圖都作為基本圖形單元)。數(shù)據(jù)可以通過流程立即執(zhí)行這些命令;或者組織到一個“顯示列表”后再執(zhí)行它們?!案黜旤c操作及圖元集” 階段主要是處理OpenGL 的幾何圖元——點、線段和多邊形。“光柵化”生成了一系列的幀緩沖區(qū)地址和相應(yīng)的用于描述點、線段或多邊形的二維值。在這些步驟的執(zhí)行過程中, OpenGL 可能執(zhí)行其他的一些操作,例如自動消隱處理等。另外,景物光柵化之后被送入幀緩沖器之前還可以根據(jù)需要對象素數(shù)據(jù)進行操作[1]。

        二、 基于OpenGL的三維動畫課件的實現(xiàn)技術(shù)

        (一)基本要求及技術(shù)難點

        課件要求在Visual C++6.0的平臺下,用OpenGL函數(shù)庫完成太陽系靜態(tài)和動態(tài)模型的建立。要求用pageUp/Down來控制遠近視角,用上,下,左,右鍵來控制視角的上下左右移動,用L鍵來控制太陽光源的啟用和關(guān)閉。要求模型應(yīng)能在一定程度上反映太陽系中各個天體的大小、位置,以及運動速度的關(guān)系。

        在課件設(shè)計中,存在以下技術(shù)難點:球體的建立,大小、位置的確定;環(huán)的建立,大小、位置的確定;星空背景的建立;球體、環(huán)等物體的渲染;球體、環(huán)等物體的運動;光源的建立和物體受光照的材料屬性的定義;Windows操作系統(tǒng)下消息的捕捉和處理。

        (二)解決方案

        1.球體的建立,大小、位置的確定

        球體的建立函數(shù)有兩類,一類是OpenGL輔助庫中的函數(shù)auxWireSphere(Gldouble radius)和auxSolideSphere(Gldouble radius);另一類是OpenGL實用庫中的函數(shù)gluShpere(GLUquadricObj *qobj,Gldouble radius,Glint slices,Glint stacks)。這里選后者。

        gluShpere函數(shù)在以當前坐標原點為球心,半徑為radius,經(jīng)線緯線條數(shù)分別為slices 和stacks繪制一個球體。如果紋理運算被打開,則按照特定算法將紋理貼圖繪制在球體上。

        gluShpere函數(shù)中的GLUquadricObj型的二次曲面對象由函數(shù)GLUquadricObj* gluNewQuadric(void )函數(shù)創(chuàng)建。該函數(shù)返回創(chuàng)建對象的指針。如果返回的是NUL,則說明內(nèi)存不足。創(chuàng)建的二次曲面使用完后,要用void gluDeletQuadric(GLUquadricObj* obj)函數(shù)將它刪除。

        2.環(huán)的建立及其大小、位置的確定

        環(huán)可以通過OpenGL實用庫中的gluPartialDisk(GLUquadricObj * qobj,GLdouble innerRadius,GLdouble outerRadius,GLint slices,GLint loops,GLdouble startAngle,GLdouble sweepAngle)函數(shù)實現(xiàn)。這個函數(shù)返回一個部分圓片(可以是扇型,圓環(huán)或者這兩者的結(jié)合),這個部分圓片圓心位于當前坐標原點,圓片位于z=0平面內(nèi)。qobj是二次曲面對象。innerRadius和outerRadius分別確定這個部分圓的內(nèi)半徑和外半徑,在這兩個參數(shù)下,圓被切割成環(huán)(特殊地,當內(nèi)半徑為0時,這個圓環(huán)就是一個整圓)。slices為這個圓的邊數(shù)(因為實際上,OpenGL中的每一條曲線,每一個曲面都是由多條直線,多個平面相連接而近似的,而這里slices和前述球體的經(jīng)線slices和緯線stacks正是由程序員來定義近似的程度的)。startAngle和sweepAngle是用來將圓切割成扇型,這兩個參數(shù)確定了扇型的起始角度和終止角度。如果紋理映射運算被激活,則會按照特定算法來將貼圖覆蓋在這個部分圓上。由于本設(shè)計中用到此函數(shù)是為了繪制行星的光環(huán)和小行星帶,是環(huán)型而不是扇型,因此最后兩個參數(shù)分別設(shè)置為0和360。

        3.星空背景的建立

        作為整個浩瀚宇宙的一部分,太陽系位于無數(shù)天體之中。因此這個太陽系模型必須要在無數(shù)星星的背景下建立。這個背景應(yīng)在所有太陽系星體之后,而不能擋在某個星體或者某些星體之前。解決這樣的方法將用到深度緩存。深度緩存中的深度測試將把所有位于視點更近的物體顯示出來,而更遠的被擋住的物體將不顯示出來,這符合人們的視覺習(xí)慣。

        如果要利用深度緩存作為解決方法,需要將背景繪制得比所有的星體更遠。而在這里,遇到另一個問題,那就是如果將背景設(shè)置的足夠遠而滿足深度測試,就會因為太遠而看不清楚作為背景的圖片中的內(nèi)容,而只是非常模糊的一片,甚至于根本看不見背景(因為距離視點太遠的緣故)。

        解決方法是:既然深度測試是根據(jù)深度緩存來進行的,而深度緩存又叫做z緩存,它是記錄現(xiàn)有畫面中每一個象素的距離視點的距離的。我們可以在視點不遠處繪制背景。這時,深度緩存記錄的是這個作為背景的圖象中每個象素距視點的距離。在繪制其他圖形時,可以人為的將深度緩存清空,而不去清空屏幕的內(nèi)容。這時,深度緩存每個象素點的距離被改為“無限遠”,他們將位于所有后繪制的圖形之后。而這樣的背景不會再因為太遠而看不清或看不見。

        背景繪制即是繪制一個大的矩形,由紋理映射貼上具有星空背景的位圖。繪制矩形的一組函數(shù)如下:

        glBegin(GL_QUADS);

        glTexCoord2f(0.0f,0.0f); glVertex3f(-20.0f,-20.0f,-10.0f);

        glTexCoord2f(2.0f,0.0f); glVertex3f(20.0f,-20.0f,-10.0f);

        glTexCoord2f(2.0f,2.0f); glVertex3f(20.0f,20.0f,-10.0f);

        glTexCoord2f(0.0f,2.0f); glVertex3f(-20.0f,20.0f,-10.0f);

        glEnd();

        glBegin和glEnd之間是OpenGL繪制以點確定形狀的圖形的方式,所有能以點來確定其形狀的簡單圖形都繪制在這兩個函數(shù)中。glBegin所帶參數(shù)用于通知OpenGL想要繪制什么形狀的圖形(如線段、三角形、矩形、相連的線段群、三角形群等等)。glVertex*( GLType x,GLType y,GLType z,GLType w)用于通知OpenGL這些點所在的坐標。x/y/z/w這些參數(shù)的個數(shù)是2,3或者4。用來指定點所在的坐標。定義頂點的顏色,法向量和紋理映射時要和這個函數(shù)一起調(diào)用。如果開啟了紋理運算,則可以用glTexCoord*()來控制這個圖形上的紋理貼圖。

        4.球體、環(huán)等物的渲染

        渲染是圖形編程中不可或缺的一步。如果沒有了渲染這一步,所有繪制出來的圖形將枯燥和呆板,人們見到的僅僅是一個個單一顏色的堆放,失去了真實感。

        紋理映射對不同的OpenGL對象有不同的影射方式。在這里僅針對須用到的影射方式加以解釋。對于由頂點確定的圖形,在確定其頂點時確定其紋理坐標,由glTexCoord*()來指定。對于實用庫中的二次曲面函數(shù),由于它是由實用庫對標準庫函數(shù)調(diào)用而產(chǎn)生的函數(shù),由實用庫對其紋理影射方式進行了規(guī)定,不再需要程序員自己指定影射方式。于是只需要提供紋理映射所需位圖,把紋理影射交給OpenGL實用庫完成。

        在紋理映射之前需要將作為紋理的位圖讀入內(nèi)存,再調(diào)用gluBuild2Dmipmaps(GLenum target,GLint components,GLint width,GLint height,GLenum format,GLenum type,const void * data)生成需要的紋理,激活紋理運算glEnable(GL_TEXTURE_2D)。這時就可以在需要的地方貼圖了。

        5.球體、環(huán)等物體的運動[2]

        由于各個天體的運動規(guī)律大致相同,只是圓周運動的線速度,角速度以及自轉(zhuǎn)角速度不同,即是參數(shù)不同。這里以地球的繪制為例:

        glRotatef(angleEarthRevolution,0.0f,0.0f,1.0f);

        glTranslatef(radiusEarthRevolution,0.0f,0.0f);

        glRotatef(-angleEarthRevolution,0.0f,0.0f,1.0f);

        glPushMatrix();

        glRotatef(angleEarth,0.0f,0.0f,1.0f);

        GLUquadricObj *earth;

        (3)呼吸道護理:護理人員應(yīng)密切關(guān)注患兒呼吸,因患兒氣管細弱,在幫助患兒吸痰時,應(yīng)使用直徑較小,材質(zhì)柔軟的吸管,動作應(yīng)放輕柔,不可過重,同時,應(yīng)注意調(diào)整負壓,保持用時在15s之內(nèi),以免損害粘膜,防止出現(xiàn)呼吸暫停的現(xiàn)象。

        glBindTexture(GL_TEXTURE_2D,texture[3]);

        earth=gluNewQuadric();

        gluQuadricNormals(earth,GLU_SMOOTH);

        gluQuadricTexture(earth,GL_TRUE);

        gluQuadricOrientation(earth,GLU_OUTSIDE);

        gluQuadricDrawStyle(earth,GLU_FILL);

        gluSphere(earth,radiusEarth,25,25);

        gluDeleteQuadric(earth);

        最后,計算下一時刻各個天體的運動參數(shù),然后在下一次程序調(diào)用此函數(shù)時作為各個天體的轉(zhuǎn)動參數(shù)。

        6.光源的建立和物體受光照的材料屬性的定義

        光照是太陽系中一個重要的部分,以太陽為中心的點光源是太陽系的唯一光源。光照的結(jié)果是各個星球不是漆黑一片,也有了諸如日月食等自然現(xiàn)象。

        以太陽為中心的點光源向四周放射漫射光,其他各個星球正對太陽的一面因光照而明亮,背對太陽的一面因無光照而黑暗。光照的建立很簡單,但要注意以下幾點:①點光源位于太陽內(nèi)部,也即太陽實際上是背面(內(nèi)部)受光照,而正面(外部)背對著光源。在激活光照的情況下,太陽的正面(外部)因為背對著光源而暗淡。這并不是我們想要的結(jié)果,我們希望太陽的外部明亮。解決的方法是,設(shè)立太陽的光照材質(zhì),讓太陽表面發(fā)光;②在激活光照的情況下,星空背景將因為處于“無窮遠”而受不到光照而顯得暗淡。解決的方法和上面一樣:設(shè)置星空的光照材質(zhì)為自己發(fā)光;③小行星帶和某些行星的光環(huán)因為所在面平行于光源光線而接受不到光源發(fā)出的光,因而也是暗淡無光。而實際上,小行星帶能接受太陽的光照的。為了模擬真實情況,也用上面的方法來解決這個問題。

        OpenGL中的光照分為兩種:一種是位于無窮遠處的平行光(用來模擬地球上受太陽光照是的情形,或者光源足夠遠時物體受光照的情形);另一種是上面提到的點光源。光由坐標系中某一點向四周放射,不同遠近的物體,甚至物體的不同部位都會反射不同的光照強度。

        有了光照,還需要定義每個物體的光照材質(zhì)。比如我們總不希望看到一個光滑的銀色金屬球和一本書對于同一個光源返回的是同樣的光。于是還需要定義光源發(fā)出的光中漫射光,鏡面反射光,環(huán)境光的強度和成分。用這些參數(shù)和物體的材質(zhì)中對應(yīng)環(huán)境顏色,散射顏色,鏡面反射顏色參數(shù)作相應(yīng)的運算來決定最終物體的反射光。

        建立光源將用glLight*( GLenum light,GLenum pname,TYPE param) 函數(shù)。定義物體的光照材質(zhì)將用glMaterial*( Glenum face,Glenum pname,TYPE param)函數(shù),它用于定義光照計算的當前材料屬性。材質(zhì)的環(huán)境顏色,散射顏色和鏡面反射顏色分別與光源的環(huán)境顏色,散射顏色和鏡面反射運算得到物體最終表現(xiàn)出來的顏色。

        三、 結(jié)束語

        本文采用OpenGL軟件包開發(fā)工具,在Visual C++ MFC環(huán)境下完成了3D太陽系模型課件的設(shè)計和制作。課件的運行情況見圖2.

        圖2 課件運行截圖

        [1]李保杰,馬明棟. OpenG實現(xiàn)三維可視化工作流程[J].四川理工學(xué)院學(xué)報(自然科學(xué)版),2005,18(3):54-58.

        [2]劉琪.基于OpenGL的三維景觀動態(tài)仿真[J].武漢工程大學(xué)學(xué)報,2011,33(7):108-110.

        [責(zé)任編輯 王愛萍]

        2014-04-06

        張三川(1956— ), 西安市人,陜西廣播電視大學(xué)圖書館高級工程師。

        G436

        A

        1008-4649(2014)02-0031-05

        猜你喜歡
        三維動畫紋理光源
        論三維動畫特效數(shù)字模擬真實性與藝術(shù)性的結(jié)合
        河北畫報(2021年2期)2021-05-25 02:07:28
        中國水墨畫在三維動畫設(shè)計中的應(yīng)用
        河北畫報(2021年2期)2021-05-25 02:06:42
        基于BM3D的復(fù)雜紋理區(qū)域圖像去噪
        軟件(2020年3期)2020-04-20 01:45:18
        《光源與照明》征訂啟事
        光源與照明(2019年3期)2019-06-15 09:21:04
        使用紋理疊加添加藝術(shù)畫特效
        TEXTURE ON TEXTURE質(zhì)地上的紋理
        Coco薇(2017年8期)2017-08-03 15:23:38
        綠色光源
        消除凹凸紋理有妙招!
        Coco薇(2015年5期)2016-03-29 23:22:15
        讓三維動畫走進幼兒語言教學(xué)
        科技連載:LED 引領(lǐng)第三次照明革命——與傳統(tǒng)照明的對比(一)
        久久精品国产69国产精品亚洲| 亚洲中文字幕在线爆乳| 国产内射视频在线播放| 亚洲一区二区三区重口另类| 国产成人无码综合亚洲日韩| 丰满爆乳一区二区三区| 99热这里只有精品久久6| 亚洲精品中文字幕不卡| 免费国产a国产片高清网站| 欧美成人一区二区三区在线观看| 国产欧美亚洲精品第二区首页| 女优av性天堂网男人天堂| 又粗又黄又猛又爽大片app| 天堂网www在线资源| 日本最新一区二区三区免费看| 风韵人妻丰满熟妇老熟| 国产无遮挡又爽又刺激的视频老师| 欧美末成年videos在线观看| 熟女人妻中文字幕一区| 丰满少妇在线播放bd| 少妇丰满大乳被男人揉捏视频| 久久无码精品精品古装毛片| 性色av一区二区三区四区久久| 亚洲av综合色区无码一区| 欧美日韩亚洲tv不卡久久| 日韩精品久久久中文字幕人妻| 亚洲av熟女传媒国产一区二区| 少妇性俱乐部纵欲狂欢电影| 日本55丰满熟妇厨房伦| 中文字幕乱码亚洲无线| 日本人妻免费一区二区三区| 久久精品国产视频在热| 麻豆变态另类视频在线观看| 日本一区二区三区一级片| 乱人伦中文视频在线| 中文无码成人免费视频在线观看| 国产一区二区三区蜜桃av| 在线观看一级黄片天堂| 日本高清色倩视频在线观看| 国产精品不卡无码AV在线播放| 人妻中文字幕日韩av|