freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于opengl粒子系統(tǒng)的噴泉模擬(編輯修改稿)

2024-12-13 17:47 本頁面
 

【文章內(nèi)容簡介】 算轉(zhuǎn)換成二維圖像并顯示或打印出來的技術(shù)。 OpenGL 就是支持這種轉(zhuǎn)換的程序庫,它源于 SGI 公司為其圖形 工作站 開發(fā)的 IRIS GL,在跨平臺移植過程中發(fā)展成為 OpenGL。 湖南大學(xué)畢業(yè)設(shè)計(jì) (論文 ) 第 7 頁 湖南大學(xué)軟件學(xué)院 OpenGL是目前用于開發(fā)可移植的、可交互的 2D 和 3D 圖形應(yīng)用程序的首選環(huán)境,也是目前應(yīng)用最廣泛的計(jì)算機(jī)圖形標(biāo)準(zhǔn)。 OpenGL 是一套的計(jì)算機(jī)圖形處理系統(tǒng),是圖形硬件的軟件接口, GL 代表圖形庫( Graphics Library)。 OpenGL 具有可移植性,任何一個 OpenGL 應(yīng)用程序無須考慮其運(yùn)行環(huán)境所在平臺與操作系統(tǒng),在任何一個遵循OpenGL標(biāo)準(zhǔn)的環(huán)境下都會產(chǎn)生相同的可視效果。 OpenGL不是一種編程語言,而是一種 API( Application Programming Interface,應(yīng)用程序編程接口)。當(dāng)我們說某個程序是基于 OpenGL的或者說它是個 OpenGL程序是,意思是說它是用某種編程語言如 C 或 C++編寫的,其中調(diào)用了一個或多個 OpenGL庫函數(shù)。作為一種 API, OpenGL遵循 C 語言的調(diào)用約定。 OpenGL主要包括三個函數(shù)庫,它們是核心庫、實(shí)用函數(shù)庫和編程輔助庫。核心庫中包含了 OpenGL最基本的命令函數(shù)。 核心庫提供了一百多個函數(shù),這些函數(shù)都以 ”gl”為前綴,用來建立各種各樣的幾何模型、進(jìn)行坐標(biāo)變換、產(chǎn)生光照效果、進(jìn)行紋理映射、產(chǎn)生霧化效果等所有的二維和三維圖形操作。 實(shí)用函數(shù)庫是比核心庫更高一層的函數(shù)庫,它提供四十多個函數(shù),這些函數(shù)都以 ”glu”為前綴。 由于 OpenGL是一個圖形標(biāo)準(zhǔn),是獨(dú)立于任何窗口系統(tǒng)或操作系統(tǒng)的,在 OpenGL中沒有提供窗口管理和消息事件響應(yīng)的函數(shù),也沒有鼠標(biāo)和鍵盤讀取 事件的功能,所以在編程輔助庫提供了一些基本的窗口管理函數(shù)、事件處理函數(shù)和簡單的事件函數(shù)。這類函數(shù)以 ”aux”作為前綴。 值得一提的是,目前 AUX 編程輔助庫已經(jīng)很大程度上被 GLUT 庫取代了 。 GLUT代表 OpenGL應(yīng)用工具包( OpenGL Utility Toolkit),是一個與窗口系統(tǒng)無關(guān)的工具包。它作為 AUX 庫的功能更強(qiáng)的替代品,用于隱藏不同窗口系統(tǒng) API 的復(fù)雜性。 GLUT 的子程序的前綴使用 ”glut”。 MFC MFC 簡單來說就是 VC 的類庫,是一個編程框架。 MFC( Microsoft Foundation Class Library) 中的各種類結(jié)合起來構(gòu)成了一個應(yīng)用程序框架,它的目的就是讓程序員在此基礎(chǔ)上來建立 Windows 下的應(yīng)用程序,這是一種相對 SDK 來說更為簡單的方法。 湖南大學(xué)畢業(yè)設(shè)計(jì) (論文 ) 第 8 頁 湖南大學(xué)軟件學(xué)院 從 總體上 來看 , MFC 框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個輪廓。 Microsoft Visual C++提供了相應(yīng)的工具來完成這個工作: AppWizard 可以用來生成初步的框架文件(代碼和資源等);資源編輯器用于幫助直觀地設(shè)計(jì)用戶接口;ClassWizard 用來協(xié)助添加代碼到框架文件;最后編譯,則通過類庫實(shí)現(xiàn)了應(yīng)用程序特定的邏輯。 構(gòu)成 MFC 框架的是 MFC 類庫。 MFC 類庫是 C++類庫。這些類或者封裝了 Win32應(yīng)用程序編程接口,或者封裝了應(yīng)用程序的概念,或者封裝了 OLE 特性,或者封裝了ODBC 和 DAO 數(shù)據(jù)訪問的功能等等 。 MFC 抽象出眾多類的共同特性,設(shè)計(jì)出一些基類作為實(shí)現(xiàn)其他類的基礎(chǔ)。這些類中,最重要的類是 CObject 和 CCmdTarget。 CObject 是 MFC 的根類,絕大多數(shù) MFC 類是其派生的,包括 CCmdTarget。 CObject 實(shí)現(xiàn)了一些重要的特性,包括動態(tài)類信息、動態(tài)創(chuàng)建、對象序列化、對程序調(diào)試的支持,等等。所有從 CObject 派生的類都將具備或者可以具備 CObject 所擁有的特性。 CCmdTarget 通過封裝一些屬性和方法,提供了消息處理的架構(gòu)。 MFC 中,任何可以處理消息的類都從 CCmdTarget 派生。 針對每種不同的對象, MFC 都設(shè)計(jì)了一組類對這些對象進(jìn)行封裝,每一組類都有一個基類,從基類派生出眾多更具體的類。這些對象包括以下種類:窗口對象,基類是CWnd;應(yīng)用程序?qū)ο螅愂?CwinThread;文檔對象,基類是 Cdocument,等等。 程序員將結(jié)合自己的實(shí)際,從適當(dāng)?shù)?MFC 類中派生出自己的類,實(shí)現(xiàn)特定的功能,達(dá)到自己的編程目的。 MFC 以 “C++”為基礎(chǔ),自然支持虛擬函數(shù)和動態(tài)約束。但是作為一個編程框架,有一個問題必須解決:如果僅僅通過虛擬函數(shù)來支持動態(tài)約束,必然導(dǎo)致虛擬函數(shù)表過于臃腫,消耗內(nèi)存,效率低下。例如, CWnd 封裝 Windows 窗口對象時,每一條 Windows消息對應(yīng)一個成員函數(shù),這些成員函數(shù)為派生類所繼承。如果這些函數(shù)都設(shè)計(jì)成虛擬函數(shù),由于數(shù)量太多,實(shí)現(xiàn)起來不現(xiàn)實(shí)。于是, MFC 建立了消息映射機(jī)制,以一 種富有效率、便于使用的手段解決消息處理函數(shù)的動態(tài)約束問題。 這樣,通過虛擬函數(shù)和消息映射, MFC 類提供了豐富的編程接口。程序員繼承基類的同時,把自己實(shí)現(xiàn)的虛擬函數(shù)和消息處理函數(shù)嵌入 MFC 的編程框架。 MFC 編程框架將在適當(dāng)?shù)臅r候、適當(dāng)?shù)牡胤絹碚{(diào)用程序的代碼。 湖南大學(xué)畢業(yè)設(shè)計(jì) (論文 ) 第 9 頁 湖南大學(xué)軟件學(xué)院 如前所述, MFC 實(shí)現(xiàn)了對應(yīng)用程序概念的封裝,把類、類的繼承、動態(tài)約束、類的關(guān)系和相互作用等封裝起來。這樣封裝的結(jié)果對程序員來說,是一套開發(fā)模板(或者說模式)。針對不同的應(yīng)用和目的,程序員采用不同的模板。例如, SDI 應(yīng)用程序的模板, MDI 應(yīng)用程序的模板,規(guī) 則 DLL 應(yīng)用程序的模板,擴(kuò)展 DLL 應(yīng)用程序的模板,OLE/ACTIVEX 應(yīng)用程序的模板,等等。 這些模板都采用了以文檔 視為中心的思想,每一個模板都包含一組特定的類。 為了支持對應(yīng)用程序概念的封裝, MFC 內(nèi)部必須作大量的工作。例如,為了實(shí)現(xiàn)消息映射機(jī)制, MFC 編程框架必須要保證首先得到消息,然后按既定的方法進(jìn)行處理。又如,為了實(shí)現(xiàn)對 DLL編程的支持和多線程編程的支持, MFC 內(nèi)部使用了特別的處理方法,使用模塊狀態(tài)、線程狀態(tài)等來管理一些重要信息。雖然,這些內(nèi)部處理對程序員來說是透明的,但是,懂得和理解 MFC 內(nèi)部 機(jī)制有助于寫出功能靈活而強(qiáng)大的程序。 總之, MFC 封裝了 Win32 API, OLE API, ODBC API 等底層函數(shù)的功能,并提供更高一層的接口,簡化了 Windows 編程。同時, MFC 支持對底層 API 的直接調(diào)用。 MFC 提供了一個 Windows 應(yīng)用程序開發(fā)模式,對程序的控制主要是由 MFC 框架完成的,而且 MFC 也完成了大部分的功能,預(yù)定義或?qū)崿F(xiàn)了許多事件和消息處理,等等??蚣芑蛘哂善浔旧硖幚硎录?,不依賴程序員的代碼;或者調(diào)用程序員的代碼來處理應(yīng)用程序特定的事件。 MFC 是 C++類庫,程序員就是通過使用、繼承 和擴(kuò)展適當(dāng)?shù)念悂韺?shí)現(xiàn)特定的目的。例如,繼承時,應(yīng)用程序特定的事件由程序員的派生類來處理,不感興趣的由基類處理。實(shí)現(xiàn)這種功能的基礎(chǔ)是 C++對繼承的支持,對虛擬函數(shù)的支持,以及 MFC 實(shí)現(xiàn)的消息映射機(jī)制。 湖南大學(xué)畢業(yè)設(shè)計(jì) (論文 ) 第 10 頁 湖南大學(xué)軟件學(xué)院 3. 粒子 系統(tǒng) 的設(shè)計(jì) Particle System API 為了方便粒子系統(tǒng)的運(yùn)用, McAllister 以 OpenGL 為基礎(chǔ),利用 C++開發(fā)了一套Particle System API。這套 API 具有以下優(yōu)點(diǎn):運(yùn)行高效、運(yùn)用靈活、參數(shù)獨(dú)立、升級方便、硬件無關(guān)、學(xué)習(xí)簡單等。 該系統(tǒng)共分為五個部分:粒子 組、活動、活動列表、屬性和域。 所有的粒子都存在粒子組中,粒子組是一組具有相同作用力的粒子集合。用戶可以定義多個具有不同行為的粒子組分別進(jìn)行調(diào)用,但在某一時刻,只能有一個粒子組是活動的。 活動是粒子組修改粒子屬性的函數(shù)。 活動列表類似與 OpenGL中的顯示列表,可以把一系列操作都封裝在一個活動列表中,需要的時候調(diào)用相應(yīng)的活動列表。 屬性提供了一些函數(shù),用來修改粒子的顏色、大小和生命周期等屬性。 域定義了矩形、球體、園盤、圓柱等一些形狀,使行為函數(shù)、屬性函數(shù)能在域范圍內(nèi)做定義。 下面的偽代碼描述了粒子系統(tǒng)運(yùn)行 的流程: for each particle group j pCurrentGroup(j)//指定 group j 為當(dāng)前粒子組 for each time step per rendered framepSource(…)// 產(chǎn)生新的粒子 other actions…// 改變粒子組屬性 pMove() //更新粒子位置 end for pDrawGroup(…)// 繪制粒子 end for other drawing… 每顆粒子的生命周期或工作 處理 流程如圖 31 所示: 湖南大學(xué)畢業(yè)設(shè)計(jì) (論文 ) 第 11 頁 湖南大學(xué)軟件學(xué)院 圖 31 每顆 粒子 的生命 圖 常見的粒子運(yùn)動模型 粒子運(yùn)動中粒子產(chǎn)生的時候都具有一定的初始屬性,粒子作為質(zhì)點(diǎn),按照動力學(xué)的規(guī)律進(jìn)行運(yùn)動。以下是幾種常見的運(yùn)動形式: ( 1) 直線運(yùn)動。粒子的位置和速度變化遵循下面的原則 (如公式( 31)): P=P0+∫Vdt, V=V0+∫adt ( 31) 其中 P 為粒子位置, P0 為粒子初始位置, V為粒子速度, V0 為初始速度, a為粒子加速度 。 ( 2) 阻尼運(yùn)動。在當(dāng)前運(yùn)動方向上的粒子根據(jù)阻尼的作用,其速度根據(jù)某種比例減少,一般取 值如公式( 32)所示: V=V0( 1d△ t) ( 32) 其中 d 為阻尼運(yùn)動的阻尼因子, d=[0, 1]。 ( 3) 螺旋運(yùn)動。螺旋運(yùn)動能按照給頂軸進(jìn)行旋轉(zhuǎn),以產(chǎn)生粒子的翻滾等效果,使速度方向發(fā)生改變。 ( 4) 反彈運(yùn)動。反彈運(yùn)動能改變粒子運(yùn)動速度的大小與方向。對于無能量損失的湖南大學(xué)畢業(yè)設(shè)計(jì) (論文 ) 第 12 頁 湖南大學(xué)軟件學(xué)院 反彈運(yùn)動,類似于光的反射 ,如公式( 33)所示: V0=V2( V0N) N ( 33) 其中 N 為反射面的方法向量。 噴泉模擬 的算法 想要有好的模擬效果,首先要構(gòu)造合適的坐標(biāo)系。假想觀察者的視點(diǎn)位于屏幕正前方,以噴泉出水的管嘴的中心位置為 O,設(shè)置 X 軸正向沿從左至右的方向, Y 軸正向沿從下至上的方向, Z軸正向?yàn)閺睦镏镣獾姆较颉? 噴泉種類多樣, 本文 挑選出其中一些具有代表性的進(jìn)行研究和模擬。下面以 這樣 的一個 噴泉為例 來 說明模擬方法 : 這個噴泉是從以原點(diǎn) O 為中心的管嘴中噴出水柱,經(jīng)過兩次面反射之后落在水池之中。 圖 32 描述了這個噴泉的大致形狀,其 中虛線段表示的 σ1和 σ2平面為噴泉的反射面,他們的形狀和位置可以由用戶設(shè)置。目前反彈面的形狀可以設(shè)為矩形或者圓;粗實(shí)線表示噴泉水流的輪廓;最下方用實(shí)線表示的 σ0平面為水池表面。在這個例子中, σ1與 Y 軸交于原點(diǎn) O, σ2與 Y 軸交于 P1 點(diǎn), σ0與 Y 軸交于 P2 點(diǎn)。 圖 32 噴泉形狀圖示 噴泉粒子初始化 首先設(shè)定粒子的初始屬性,包括粒子的初始速度、初始位置以及顏色。將粒子的初始速度( Vx,Vy,Vz)限制在一個圓柱環(huán)的域內(nèi),圓柱的軸平行與 Y 軸并且長度很短,圓柱的外徑和內(nèi)徑也都不大,這樣可以保證粒子以比較穩(wěn)定的狀態(tài)變化。 然后設(shè)定粒子的初始顏色,由于是模擬噴泉水流,設(shè)定粒子顏色為白色?,F(xiàn)在就可以產(chǎn)生新粒了,將粒子產(chǎn)生的位置( x0, y0, z0)范圍限制在 Z軸上一條很短的直線段上,這樣可以使粒子產(chǎn)生的位置看起來就像 從一個很細(xì)的管嘴噴出來一樣。粒子的位置將按照下面公式 ( 34) 變化: 湖南大學(xué)畢業(yè)設(shè)計(jì) (論文 ) 第 13 頁 湖南大學(xué)軟件學(xué)院 x=x0+∫Vxdt y=y0+∫Vydt ( 34) z=z0+∫Vzdt 其中 , ( x, y, z)是粒子的
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1