水波紋算法_第1頁
已閱讀1頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、在介紹編程之前,先讓我們來回顧一下在高中的物理課上我們所學(xué)的關(guān)于水波的知識。水波有如下幾個特性:?擴散擴散:當(dāng)你投一塊石頭到水中,你會看到一個以石頭入水點為圓心所形成的一圈圈的水波,這里,你可能會被這個現(xiàn)象所誤導(dǎo),以為水波上的每一點都是以石頭入水點為中心向外擴散的,這是錯誤的。實際上,水波上的任何一點在任何時候都是以自己為圓心向四周擴散的,之所以會形成一個環(huán)狀的水波,是因為水波的內(nèi)部因為擴散的對稱而相互抵消了。?衰減衰減:因為水是有阻尼

2、的,否則,當(dāng)你在水池中投入石頭,水波就會永不停止的震蕩下去。?水的折射水的折射:因為水波上不同地點的傾斜角度不同,所以,因為水的折射,我們從觀察點垂直往下看到的水底并不是在觀察點的正下方,而有一定的偏移。如果不考慮水面上部的光線反射,這就是我們能感覺到水波形狀的原因。?反射反射:水波遇到障礙物會反射。?衍射衍射:忽然又想到這一點,但是在程序里卻看不到,如果能在水池中央放上一塊礁石,或放一個中間有縫的隔板,那么就能看到水波的衍射現(xiàn)象了。好

3、了,有了這幾個特性,再運用數(shù)學(xué)和幾何知識,我們就可以模擬出真實的水波了。但是,如果你曾用3DMax做過水波的動畫,你就會知道要渲染出一幅真實形狀的水波畫面少說也得好幾十秒,而我們現(xiàn)在需要的是實時的渲染,每秒種至少也得渲染20幀才能使得水波得以平滑的顯示??紤]到電腦運算的速度,我們不可能按照正弦函數(shù)或精確的公式來構(gòu)造水波,不能用乘除法,更不能用sin、cos,只能用一種取近似值的快速算法,盡管這種算法存在一定誤差,但是為了滿足實時動畫的要

4、求,我們不得不這樣做。首先我們要建立兩個與水池圖象一樣大小的數(shù)組buf1[PoolWidthPoolHeight]和buf2[PoolWidthPoolHeight](PoolWidth=水池圖象的象素寬度、PoolHeight=水池圖象的象素高度),用來保存水面上每一個點的前一時刻和后一時刻波幅數(shù)據(jù),因為波幅也就代表了波的能量,所以以后我們稱這兩個數(shù)組為波能緩沖區(qū)。水面在初始狀態(tài)時是一個平面,各點的波幅都為0,所以,這兩個數(shù)組的初始值

5、都等于0。下面來推導(dǎo)計算波幅的公式下面來推導(dǎo)計算波幅的公式我們假設(shè)存在這樣一個一次公式,可以在任意時刻根據(jù)某一個點周圍前、后、左、右四個點以及該點自身的振幅來推算出下一時刻該點的振幅,那么,我們就有可能用歸納法求出任意時刻這個水面上任意一點的振幅。如左圖,你可以看到,某一時刻,X0點的振幅除了受X0點自身振幅的影響外,同時受來自它周圍前、后、左、右四個點(X1、X2、X3、X4)的影響(為了簡化,我們忽略了其它所有點),而且,這四個點對

6、a0點的影響力可以說是機會均等的。那么我們可以假設(shè)這個一次公式為:交換波能數(shù)據(jù)緩沖區(qū)shtptmp=buf1buf1=buf2buf2=ptmp寫到這里,我已經(jīng)兩眼發(fā)暈了,呼呼——,先休息一下......好了,下面再來根據(jù)算出的波幅數(shù)據(jù)對頁面進行渲染。好了,下面再來根據(jù)算出的波幅數(shù)據(jù)對頁面進行渲染。因為水的折射,當(dāng)水面不與我們的視線相垂直的時候,我們所看到的水下的景物并不是在觀察點的正下方,而存在一定的偏移。偏移的程度與水波的斜率,水的

7、折射率和水的深度都有關(guān)系,如果要進行精確的計算的話,顯然是很不現(xiàn)實的。同樣,我們只需要做線形的近似處理就行了。因為水面越傾斜,所看到的水下景物偏移量就越大,所以,我們可以近似的用水面上某點的前后、左右兩點的波幅之差來代表所看到水底景物的偏移量。在程序中,用一個頁面裝載原始的圖象,用另外一個頁面來進行渲染。先用Lock函數(shù)鎖定兩個頁面,取得指向頁面內(nèi)存區(qū)的指針,然后用根據(jù)偏移量將原始圖象上的每一個象素復(fù)制到渲染頁面上。進行頁面渲染的代碼如

8、下:(下面的代碼為了便于理解,并沒有進行優(yōu)化,實際上,優(yōu)化后的代碼比它要麻煩許多)根據(jù)波能數(shù)據(jù)緩沖區(qū)對離屏頁面進行渲染voidRenderRipple()鎖定兩個離屏頁面DDSURFACEDESCddsd1ddsd2ddsd1.dwSize=sizeof(DDSURFACEDESC)ddsd2.dwSize=sizeof(DDSURFACEDESC)lpDDSPic1Lock(NULLlpDDSPic2Lock(NULL取得頁面象素位深

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論