光線跟蹤講解及源代碼_第1頁(yè)
光線跟蹤講解及源代碼_第2頁(yè)
光線跟蹤講解及源代碼_第3頁(yè)
光線跟蹤講解及源代碼_第4頁(yè)
光線跟蹤講解及源代碼_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、計(jì)算機(jī)圖形學(xué)期末作業(yè)作業(yè)題目:Ray Tracing算法的實(shí)現(xiàn)姓 名:李海廣學(xué) 號(hào):S130201036任課教師:秦紅星摘 要Ray Tracing算法又叫光線跟蹤算法,它能通過遞歸方法逐個(gè)計(jì)算每個(gè)像素點(diǎn)的光強(qiáng),然后就可以繪制出高度真實(shí)感的圖像,因此該方法在圖形學(xué)領(lǐng)域得到了廣泛的應(yīng)用。Ray Tracing算法的思想還能應(yīng)用到移動(dòng)通信終端定位領(lǐng)域,該領(lǐng)域里的射線跟蹤法與此算法思想類似。MFC是微軟公司提供的一個(gè)類庫(kù),以C+類的形式封裝了Windows的API,并且包含一個(gè)應(yīng)用程序框架,以減少應(yīng)用程序開發(fā)人員的工作量。其中包含的類包含大量Windows句柄封裝類和很多Windows的內(nèi)建控件和組

2、件的封裝類。MFC在處理Windows窗口應(yīng)用程序方面具有很大的優(yōu)勢(shì),因此,本文使用MFC在VC6.0里實(shí)現(xiàn)Ray Tracing算法,并給出了該算法的詳細(xì)講解。【關(guān)鍵詞】Ray tracing 光線跟蹤 遞歸 像素 光強(qiáng) MFC C+目錄1.Ray Tracing算法概述11.1Ray Tracing算法簡(jiǎn)介11.2Ray Tracing算法的實(shí)現(xiàn)原理12.Ray Tracing算法的具體實(shí)現(xiàn)22.1算法的實(shí)現(xiàn)環(huán)境22.2實(shí)現(xiàn)算法的C+程序簡(jiǎn)介22.3算法的具體實(shí)現(xiàn)過程32.4 程序運(yùn)行結(jié)果113.總結(jié)113.1 通過該算法學(xué)到的東西113.2本程序未完成的任務(wù)124.參考文獻(xiàn)12II1.R

3、ay Tracing算法概述1.1Ray Tracing算法簡(jiǎn)介光線跟蹤(Ray tracing),又稱為光跡追蹤或光線追跡,它是來(lái)自于幾何光學(xué)的一項(xiàng)通用技術(shù),它通過跟蹤與光學(xué)表面發(fā)生交互作用的光線從而得到光線經(jīng)過路徑的模型。它用于光學(xué)系統(tǒng)設(shè)計(jì),如照相機(jī)鏡頭、顯微鏡、望遠(yuǎn)鏡以及雙目鏡等。這個(gè)術(shù)語(yǔ)也用于表示三維計(jì)算機(jī)圖形學(xué)中的特殊渲染算法,跟蹤從眼睛發(fā)出的光線而不是光源發(fā)出的光線,通過這樣一項(xiàng)技術(shù)將具有一定數(shù)學(xué)模型的場(chǎng)景顯現(xiàn)出來(lái)。這樣得到的結(jié)果類似于光線投射與掃描線渲染方法的結(jié)果,但是這種方法有更好的光學(xué)效果,例如對(duì)于反射與折射有更準(zhǔn)確的模擬效果,并且效率非常高,所以在追求高質(zhì)量結(jié)果時(shí)我們經(jīng)常使

4、用這種方法。在光線跟蹤的過程中,我們要考慮許多因素。要跟蹤的光線包括反射光線、散射光線和鏡面反射光線,利用遞歸方法并且設(shè)定一定的閥值來(lái)跟蹤;在計(jì)算光強(qiáng)度時(shí),我們要考慮場(chǎng)景中物體的反射系數(shù)、漫反射系數(shù)和鏡面反射系數(shù),還有交點(diǎn)處的法向量,出射光線的方向向量;在求視線以及反射光線和場(chǎng)景中物體的交點(diǎn)時(shí),要計(jì)算出離眼睛以及出射點(diǎn)最近的交點(diǎn)作為擊中點(diǎn),得到擊中點(diǎn)之后,我們就可以計(jì)算出擊中點(diǎn)的坐標(biāo)。最終,通過三個(gè)公式計(jì)算出每一個(gè)像素點(diǎn)處三種光線的光強(qiáng)值,再將三個(gè)光強(qiáng)值相加,就得到了該像素點(diǎn)出的總光強(qiáng)值,最后將顏色緩沖器中的三種顏色值輸出到屏幕上,就得到了我們需要的光線跟蹤圖像。1.2Ray Tracing算

5、法的實(shí)現(xiàn)原理(1)對(duì)圖像中的每一個(gè)像素,創(chuàng)建從視點(diǎn)射向該像素的光線;(2)初始化最近時(shí)間T為一個(gè)很大的值,離視點(diǎn)最近的物體指針設(shè)為空值;(3)對(duì)場(chǎng)景中的每一個(gè)物體,如果從視點(diǎn)出發(fā)的光線和物體相交,且交點(diǎn)處的時(shí)間t比最近時(shí)間T小,則將t的值賦給最近時(shí)間T,并設(shè)置該物體為最近物體,將物體指針指向該物體;(4)經(jīng)過第三步的計(jì)算后,如果最近物體指針指向空值NULL,則用背景色填充該像素。如果該指針指向光源,則用光源的顏色填充該像素;(5)如果最近物體指針指向的既不是NULL也不是光源,則從交點(diǎn)向光源發(fā)出一條光線,并判斷該光線在射向光源的過程中是否被遮擋,如果被遮擋,則該交點(diǎn)對(duì)光源不可見;(6)若第五步

6、中的光線在射向光源的過程中沒有被遮擋,則該交點(diǎn)對(duì)光源可見。那么從交點(diǎn)到光源做出一條入射光線,并將入射光線單位化。求出物體表面該交點(diǎn)處的法向量之后,我們就可以利用公式計(jì)算出該點(diǎn)的散射光強(qiáng)值、鏡面反射光強(qiáng)值,并將它們加到總光強(qiáng)值上;(7)對(duì)于反射光線,我們先利用視線和交點(diǎn)處的法向向量求出視線的反射光線,并將其單位化。然后以交點(diǎn)為視點(diǎn),以交點(diǎn)處的反射光線為視線遞歸地進(jìn)行跟蹤,直至達(dá)到最大遞歸深度,我們就得到了加上遞歸反射光強(qiáng)的總光強(qiáng)值;(8)最后,我們逐行逐個(gè)像素的將三種顏色值輸出到屏幕上。至此,通過光線跟蹤就得到了一幅質(zhì)量很高的圖像。2.Ray Tracing算法的具體實(shí)現(xiàn)2.1算法的實(shí)現(xiàn)環(huán)境(1

7、)編程環(huán)境:Microsoft Visual C+6.0;(2)圖形類類庫(kù):MFC;(3)編程語(yǔ)言:C+;(4)顯示設(shè)備:電腦顯示器。2.2實(shí)現(xiàn)算法的C+程序簡(jiǎn)介 該程序由C+編寫而成,主要分為以下幾個(gè)部分:(1) 點(diǎn)和向量的定義及運(yùn)算;(2) 光線類的定義及操作;(3) 場(chǎng)景中各種物體的材質(zhì)特征定義和求交計(jì)算;(4) 光線跟蹤過程及圖像繪制;2.3算法的具體實(shí)現(xiàn)過程(1)點(diǎn)和向量的定義及運(yùn)算 CVector類用來(lái)存儲(chǔ)向量的坐標(biāo)值,設(shè)置向量的三個(gè)坐標(biāo)值,對(duì)向量進(jìn)行求和、求差、點(diǎn)積、叉積運(yùn)算,這些運(yùn)算通過運(yùn)算符重載來(lái)完成。使用typedef將CVector類重定義為CColor類和CPoint類

8、,從而實(shí)現(xiàn)對(duì)像素點(diǎn)顏色和點(diǎn)的設(shè)置和運(yùn)算。CVector類公用成員函數(shù)的聲明不再詳述。(2)光線類的定義及操作 光線包含兩個(gè)特征參數(shù),即光線的起點(diǎn)和方向。以上程序段能實(shí)現(xiàn)對(duì)光線的起點(diǎn)和方向的設(shè)置和獲取,由起點(diǎn)和方向能唯一地確定出一條光線,并能結(jié)合“時(shí)間”t寫出該光線的方程,以用來(lái)進(jìn)行求交計(jì)算。(3)場(chǎng)景中各種物體的材質(zhì)特征定義和求交計(jì)算 通過上面的程序段我們能設(shè)置和獲取場(chǎng)景中各物體的散射系數(shù)、鏡面反射系數(shù)和反射系數(shù),以用來(lái)計(jì)算各像素點(diǎn)處的光強(qiáng)值。 通過上面的程序可以具體設(shè)置場(chǎng)景中每個(gè)物體的位置參數(shù)、散射系數(shù)、鏡面反射系數(shù)和反射系數(shù)。對(duì)球體和光源來(lái)說(shuō),我們?cè)O(shè)置它的球心坐標(biāo)和半徑;對(duì)地面和多邊形來(lái)說(shuō)

9、,我們?cè)O(shè)置它的單位法向量和距坐標(biāo)原點(diǎn)的距離,這樣以來(lái),它們的位置就能夠確定出來(lái)。 上面的程序用來(lái)獲得球體的球心和半徑坐標(biāo),以及球面上position位置處的單位法向量。得到這三個(gè)值之后,我們就可以對(duì)球體進(jìn)行求交計(jì)算。 上面程序的功能是針對(duì)某條射線對(duì)球體進(jìn)行求交計(jì)算,返回的結(jié)果是“擊中”或者“丟失”或者“光線起點(diǎn)在內(nèi)部”。當(dāng)delta大于0時(shí),該光線和球體表面必有兩個(gè)交點(diǎn),擊中時(shí)間分別為t1和t2,且t1t2,當(dāng)t1和t2均大于0時(shí),光線起點(diǎn)必在球體外部,此時(shí)的擊中時(shí)間為t1,返回值為“1”。當(dāng)t10時(shí),光線起點(diǎn)在球體內(nèi)部,此時(shí)的返回值為“-1”。當(dāng)delta小于或者等于0時(shí),我們認(rèn)為光線與球體

10、無(wú)交點(diǎn),此時(shí)返回值為“0”。 上面的程序?qū)崿F(xiàn)了光線對(duì)地平面(無(wú)限大平面)的求交計(jì)算,當(dāng)單位法向量和視線垂直時(shí),dot=0,此時(shí)視線與平面平行,函數(shù)返回值為MISS=0。當(dāng)單位法向量和視線不垂直時(shí),視線和平面必有交點(diǎn),可以通過公式計(jì)算出擊中時(shí)間t0,當(dāng)t0大于0且t0不是無(wú)窮大時(shí),則把最近擊中時(shí)間設(shè)置為t0,函數(shù)返回值為HIT=1。 上面的程序通過視線與無(wú)限大平面求交的方法來(lái)實(shí)現(xiàn)四邊形的繪制,當(dāng)求出擊中時(shí)間t后,將t代入光線方程即可求出擊中點(diǎn)的三維坐標(biāo)值。以上面程序中多面體的后面為例,其單位法向量與z軸平行,所以我們只需要將擊中點(diǎn)的x坐標(biāo)值和y坐標(biāo)值分別與四邊形的范圍進(jìn)行比較,x值和y值中任何一

11、個(gè)超出范圍,就將該點(diǎn)拋棄;只有x值和y值均在四邊形范圍內(nèi)時(shí),我們才將該點(diǎn)的返回值設(shè)為HIT=0。通過這種方法我們能繪制出一個(gè)四邊形。左面和底面的繪制原理與后面類似,在此不再贅述。(4)光線跟蹤過程及圖像繪制 Raytrace函數(shù)共有5個(gè)參數(shù),分別為視線、交點(diǎn)處的總光強(qiáng)、遞歸深度、反射索引和最近擊中時(shí)間t。當(dāng)遞歸深度大于最大遞歸深度時(shí)函數(shù)停止運(yùn)行。初始化物體指針使其指向NULL,然后通過一個(gè)循環(huán)遍歷場(chǎng)景中的所有物體,依次對(duì)物體求交,則t的值會(huì)不斷的變化,最終變成一個(gè)所有物體擊中時(shí)間中的最小值。最后得到的物體指針指向最小t對(duì)應(yīng)的物體,result為最小t對(duì)應(yīng)的返回結(jié)果。如果物體指針指向空NULL,

12、則該光線和場(chǎng)景中的任何物體都沒有交點(diǎn);如果物體指針指向光源,則將光源的顏色值賦給總光強(qiáng)。先利用上面求出的最近擊中時(shí)間t求出交點(diǎn)坐標(biāo)。然后從交點(diǎn)向光源中心發(fā)出一條光線,求出該光線的時(shí)間方程,然后判斷該光線是否與場(chǎng)景中的除光源外的物體相交,若相交,則該光線在射向光源的途中被遮擋,則該交點(diǎn)對(duì)光源不可見。 若該交點(diǎn)對(duì)光源可見,則從交點(diǎn)向光源發(fā)出一條光線當(dāng)作入射線,然后求出交點(diǎn)處的單位法向量,然后通過函數(shù)調(diào)用分別得到該物體的散射系數(shù)和鏡面反射系數(shù),再通過兩個(gè)公式分別計(jì)算出該交點(diǎn)處的散射光光強(qiáng)和鏡面反射光光強(qiáng),并把這兩個(gè)光強(qiáng)值加到總光強(qiáng)上。反射光的光強(qiáng)通過遞歸的方法實(shí)現(xiàn),先求出物體的反射系數(shù),計(jì)算出交點(diǎn)處

13、的單位法向量。然后計(jì)算出從視點(diǎn)射向交點(diǎn)的光線的反射光線。然后以該反射光線為視線,以反射光強(qiáng)為總光強(qiáng)繼續(xù)進(jìn)行光線跟蹤,且達(dá)到遞歸深度后停止遞歸,將得到的總光強(qiáng)(即反射光光強(qiáng))加到原來(lái)的總光強(qiáng)上。至此,該像素點(diǎn)處的總光強(qiáng)已求出,接下來(lái)就可以進(jìn)行該像素點(diǎn)的繪制。上面的程序的功能是逐行逐像素的繪制圖像。direction為從視點(diǎn)出發(fā)射向場(chǎng)景的光線的向量,然后將其單位化,求出方向向量之后,就得到了定義好的視線r。針對(duì)每一條視線調(diào)用光線跟蹤程序得到交點(diǎn)處的總光強(qiáng),通過總光強(qiáng)可求出交點(diǎn)處紅、綠、藍(lán)三種顏色的強(qiáng)度值,然后利用顏色緩沖器將這三種顏色值輸出到屏幕上顯示出來(lái)。至此,利用光線跟蹤算法繪制圖像已完成。2

14、.4 程序運(yùn)行結(jié)果3.總結(jié)3.1 通過該算法學(xué)到的東西 通過Ray Tracing算法的實(shí)現(xiàn),我學(xué)會(huì)了在C+程序中如何對(duì)向量進(jìn)行運(yùn)算,因?yàn)楸境绦蛩械倪\(yùn)算都是基于向量的;對(duì)遞歸思想有了更深入的理解;使我的面向?qū)ο缶幊碳夹g(shù)有了很大的提升,懂得了如何用C+做出一個(gè)大項(xiàng)目,這其中涉及到頭文件的編寫、源文件的編寫、頭文件的組織以及整個(gè)程序文件的組織,使大量的C+文件有條不紊的運(yùn)行;還學(xué)習(xí)到了MFC繪圖的相關(guān)知識(shí)。總之,這次作業(yè)的完成使我獲益匪淺。3.2本程序未完成的任務(wù) 本程序只實(shí)現(xiàn)了球體和立方體的三個(gè)面,沒有完整的做出立方體,因?yàn)樵诋嬃⒎襟w別的面時(shí),該面將其他的物體遮擋,改變?cè)撁娴姆ㄏ蛄恐筮€不能解決,原因有可能是光線跟蹤程序中的跟蹤過程只適用于球體,即有限空間的物體。而立方體的面是由無(wú)限大的平面限制范圍而求得,所以跟蹤過程中

溫馨提示

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

評(píng)論

0/150

提交評(píng)論