光線追蹤試驗(yàn)報(bào)告_第1頁(yè)
光線追蹤試驗(yàn)報(bào)告_第2頁(yè)
光線追蹤試驗(yàn)報(bào)告_第3頁(yè)
光線追蹤試驗(yàn)報(bào)告_第4頁(yè)
光線追蹤試驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩3頁(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)介

本文格式為Word版,下載可任意編輯——光線追蹤試驗(yàn)報(bào)告RayTracer光線跟蹤試驗(yàn)報(bào)告

711064XXXXX

一、試驗(yàn)?zāi)康?/p>

在計(jì)算機(jī)圖形學(xué)課程作業(yè)中,題目要求是做RayTracing或碰撞檢測(cè),其中對(duì)RayTracing的要求是:

(1)多種形狀物體,Ball,box等

(2)包含多種材質(zhì)物體:純鏡面反射、透明物體、純漫反射、半透明物體等(3)Movingina3Dworld(4)environmenttexture

二、試驗(yàn)原理

在這次試驗(yàn)中,使用了真正的光線跟蹤算法,而不是采用環(huán)境紋理來(lái)反映周邊環(huán)境。1、光線跟蹤簡(jiǎn)介

光線跟蹤是一種真實(shí)地顯示物體的方法,該方法由Appel在1968年提出為了生成在三維計(jì)算機(jī)圖形環(huán)境中的可見(jiàn)圖像,光線跟蹤是一個(gè)比光線投射或者掃描線渲染更加逼真的實(shí)現(xiàn)方法。這種方法通過(guò)逆向跟蹤與假象的照相機(jī)鏡頭相交的光路進(jìn)行工作,由于大量的類似光線橫穿場(chǎng)景,所以從照相機(jī)角度看到的場(chǎng)景可見(jiàn)信息以及軟件特定的光照條件,就可以構(gòu)建起來(lái)。當(dāng)光線與場(chǎng)景中的物體或者媒介相交的時(shí)候計(jì)算光線的反射、折射以及吸收。由于一個(gè)光源發(fā)射出的光線的絕大部分不會(huì)在觀測(cè)者看到的光線中占很大比例,這些光線大部分經(jīng)過(guò)屢屢反射逐漸消失或者至無(wú)限小,所以對(duì)于構(gòu)建可見(jiàn)信息來(lái)說(shuō),逆向跟蹤光線要比真實(shí)地模擬光線相互作用的效率要高好多倍。計(jì)算機(jī)模擬程序從光源發(fā)出的光線開(kāi)始查詢與觀測(cè)點(diǎn)相交的光線從執(zhí)行與獲得正確的圖像來(lái)說(shuō)是不現(xiàn)實(shí)的。

2、經(jīng)典光線跟蹤算法

對(duì)圖像中的每一個(gè)像素{

創(chuàng)立從視點(diǎn)通過(guò)該像素的光線初始化最近T為無(wú)限大,最近物體為空值

對(duì)場(chǎng)景中的每一個(gè)物體{假使光線與物體相交{假使交點(diǎn)處的t比最近T小{設(shè)置最近T為焦點(diǎn)的t值設(shè)置最近物體為該物體}}}假使最近物體為空值{用背風(fēng)景填充該像素}否則{對(duì)每個(gè)光源射出一條光線來(lái)檢測(cè)是否處在陰影中假使表面是反射面,生成反射光;遞歸假使表面透明,生成折射光;遞歸使用最近物體和最近T來(lái)計(jì)算著色函數(shù)以著色函數(shù)的結(jié)果填充該像素}}由以上經(jīng)典的光線追蹤算法可以發(fā)現(xiàn),在此算法中,環(huán)境中的物體等模型,并不是一次性的畫好的,而是對(duì)整個(gè)場(chǎng)景一個(gè)像素一個(gè)像素的畫上去的,光線跟蹤算法中的每一根光線要與場(chǎng)景中的每一個(gè)物體所含的每一個(gè)面求交。

三、光線跟蹤算法實(shí)現(xiàn)

1、計(jì)算觀測(cè)光線

首先需要確定光線的數(shù)學(xué)表達(dá)式。一條光線實(shí)際上只是一個(gè)起點(diǎn)和一個(gè)傳播方向,假設(shè)起點(diǎn)為O(x1,y1,z1),屏幕上一點(diǎn)為D(x2,y2,z2),則光線的方向dir(x3,y3,z3)為:dir=O–D;即x3=x1–x2;y3=y1–y2;z3=z1–z2;

在程序中,光線的起點(diǎn)定義為:

vector3o(0,0,-5);

方向?yàn)椋?/p>

vector3dir=vector3(m_SX,m_SY,0)-o;

由此可以確定一條光線Rayr(o,dir);

然后就需要求出與該光線相交的物體中的最近的交點(diǎn)2、光線與球體相交

球體由方程(x-a)2+(y-b)2+(z-c)2=r2確定,求光線是否與方程相交,只需計(jì)算方程組

(x-x1)2+(y-y1)2+(z-z1)2=R2

e+dt=0

有無(wú)實(shí)數(shù)解即可。

若令c(x1,y1,z1)為圓心,將二式帶入一式整理可得,

(d﹒d)t2+2d﹒(e-c)t+(e-c)﹒(e-c)-R2=0

這里,除了參數(shù)t外所有的都是已知的,所以也就是標(biāo)準(zhǔn)的一元二次方程,即

At2+Bt+C=0

二次解下中根號(hào)下的項(xiàng)B-4AC為判別式,它可以說(shuō)明有多少實(shí)數(shù)解。假使判別式為負(fù),球和直線沒(méi)有交點(diǎn)。假使判別式為正,則有兩個(gè)解;一個(gè)解是光線進(jìn)入球的位置,另一個(gè)是離開(kāi)的位置。假使判別式為零,光線與球相切并只有一個(gè)交點(diǎn)。代入球的方程中,并消除公共因子得

2

在實(shí)際實(shí)現(xiàn)中,在計(jì)算其他項(xiàng)之前應(yīng)當(dāng)首先檢查判別式的值。在程序中的具體實(shí)現(xiàn)如下:

intSphere::Intersect(Rayfloatb=-DOT(v,a_Ray.GetDirection());floatdet=(b*b)-DOT(v,v)+m_SqRadius;intretval=MISS;if(det>0){det=sqrtf(det);floati1=b-det;floati2=b+det;if(i2>0){if(i10){if(distGetCentre()-pi;NORMALIZE(L);vector3N=prim->GetNormal(pi);if(prim->GetMaterial()->GetDiffuse()>0){floatdot=DOT(L,N);if(dot>0){floatdiff=dot*prim->GetMaterial()->GetDiffuse()*shade;//adddiffusecomponenttoraycolora_Acc+=diff*light->GetMaterial()->GetColor()*prim->GetMaterial()->GetColor();}}下面這段代碼還計(jì)算了從交點(diǎn)('pi')到光源('L')的向量,并且通過(guò)計(jì)算這個(gè)向量

和物體表面的法向量的點(diǎn)乘積來(lái)確定該點(diǎn)的光照強(qiáng)度。這樣的計(jì)算會(huì)產(chǎn)生這樣的效果:那些面對(duì)光源的點(diǎn)要比其他的點(diǎn)要更加敞亮,背對(duì)光源的點(diǎn)將不會(huì)被照亮。//calculatediffuseshading5、反射的計(jì)算

計(jì)算一個(gè)已知法向量的點(diǎn)的反射光線,可以使用以下公式

R=V-2(V﹒N)N

其中R是反射光線的方向向量,V是入射光線的方向向量,N是該點(diǎn)的法向量計(jì)算反射光線并遞歸跟蹤的關(guān)鍵代碼如下:floatrefl=prim->GetMaterial()->GetReflection();if(refl>0.0f){vector3N=prim->GetNormal(pi);vector3R=a_Ray.GetDirection()-2.0f*DOT(a_Ray.GetDirection(),N)*N;if(a_DepthGetMaterial()->GetColor();}}

6、折射的計(jì)算

光線跟蹤同樣可以構(gòu)造經(jīng)折射的光線并繼續(xù)遞歸跟蹤,并最終將遇到的顏色信息加到最近的交點(diǎn)上。折射時(shí)可根據(jù)折射定律進(jìn)行計(jì)算,可以使用以下式子

T=(n*V)+(n*(-N﹒V)-SQRT(1.0-(n*(N﹒V))2))*N;

其中,T是折射光線的方向向量,V是入射光線的方向向量,N是該點(diǎn)的法向量,

n是兩種材料的折射率的比值

計(jì)算折射光線并遞歸跟蹤的關(guān)鍵代碼如下://calculaterefractionfloatrefr=prim->GetMaterial()->GetRefraction();if((refr>0)floatn=a_RIndex/rindex;vector3N=prim->GetNormal(pi)*(float)result;floatcosI=-DOT(N,a_Ray.GetDirection());floatcosT2=1.0f-n*n*(1.0f-cosI*cosI);if(cosT2>0.0f){vector3T=(n*a_Ray.GetDirection())+(n*cosI-sqrtf(cosT2))*N;Colorrcol(0,0,0);floatdist;Raytrace(Ray(pi+T*EPSILON,T),rcol,a_Depth+1,rindex,dist);Colorabsorbance=prim->GetMaterial()->GetColor()*0.15f*-dist;Colortransparency=Color(expf(absorbance.r),expf(absorbance.g),expf(absorbance.b));a_Acc+=rcol*transparency;}}7、Phong明暗處理

當(dāng)物體表面被光源照亮?xí)r,會(huì)形成一個(gè)高亮的光斑。這個(gè)光斑會(huì)隨著視點(diǎn)的移動(dòng)而移動(dòng),而不是固定的。Phong提出的光照模型,實(shí)際上就是把反射光的方向向量考慮了進(jìn)來(lái)。

intensity=diffuse*(L.N)+specular*(V.R)n

上式中的L是從交點(diǎn)到光源的向量,N是平面的法向量,V是觀測(cè)方向,R是L在平面上的反射向量,可以發(fā)現(xiàn)這個(gè)公式同時(shí)包含了漫反射和鏡面反射光,實(shí)現(xiàn)的代碼如下:vector3V=a_Ray.GetDirection();vector3R=L-2.0f*DOT(L,N)*N;floatdot=DOT(V,R);if(dot>0){floatspec=powf(dot,20)*prim->GetMaterial()->GetSpecular()*shade;//addspecularcomponenttoraycolora_Acc+=spec*light->GetMaterial()->GetColor();}

8、陰影效果

為了計(jì)算陰影,需要在算法中判斷點(diǎn)是否在陰影中,對(duì)于場(chǎng)景中的每個(gè)光源都創(chuàng)立一條陰影光線,再判斷對(duì)場(chǎng)景中的所有物體是否相交,若相交,則說(shuō)明物體在陰影中而光源是不可見(jiàn)的,并置shade=0;否則,說(shuō)明物體不再陰影中,光線可以照射到該點(diǎn),置shade=1;而shade最終的值在0和1之間的話表示該點(diǎn)對(duì)部分光源是可見(jiàn)的,其他的是不可見(jiàn)的。//handlepointlightsource

四、

floatshade=1.0f;if(light->GetType()==Primitive::SPHERE){vector3L=((Sphere*)light)->Ge

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論