最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

計(jì)算機(jī)圖形學(xué)基礎(chǔ)(二):光線追蹤(Ray Tracing)

2023-08-03 10:25 作者:寧牁兒  | 我要投稿

所有專欄系列的內(nèi)容均為本人(b站id:寧牁兒)精心總結(jié)和排版,僅用于免費(fèi)學(xué)習(xí)交流,任何人不得擅自用于商業(yè)活動(dòng)

計(jì)算機(jī)圖形計(jì)算的最基本任務(wù)之一就是渲染三維物體。模型是用特定語(yǔ)言或者數(shù)據(jù)結(jié)構(gòu)對(duì)于三維物體的描述,包括幾何形狀、視點(diǎn)、紋理以及照明信息等。渲染就是將三維場(chǎng)景中的模型,按照設(shè)定好的環(huán)境、燈光、材質(zhì)及渲染參數(shù),二維投影成數(shù)字圖像的過(guò)程。


從數(shù)學(xué)角度上來(lái)說(shuō),渲染就是接收一堆物體的數(shù)字集合作為輸入,產(chǎn)生出一些像素點(diǎn)的矩陣作為輸出。我們需要考慮每個(gè)物體對(duì)最后輸出的每個(gè)像素點(diǎn)有什么影響,通常有兩種渲染方式:

1. 按物體順序渲染(object-order rendering)。輪詢每個(gè)物體對(duì)象,考察每個(gè)對(duì)象影響了哪些像素的值并依次更新這些像素值

2. 按圖像順序渲染(image-order rendering)。輪詢每個(gè)像素,考察每個(gè)像素會(huì)被哪些物體影響并計(jì)算最終的像素值

上述兩種渲染方式能產(chǎn)生相同的結(jié)果,對(duì)3D渲染來(lái)說(shuō),光線追蹤就是一種image-order rendering的渲染算法。


本章涉及到的數(shù)學(xué)知識(shí)點(diǎn)回顧:

  • 笛卡爾坐標(biāo)系中,給定兩點(diǎn)es,(s-e)可以表示從點(diǎn)e出發(fā)指向點(diǎn)s的向量

  • 笛卡爾坐標(biāo)系中,給定兩點(diǎn)ab,這兩個(gè)點(diǎn)的距離的平方可表示為向量(b-a)與自己的點(diǎn)積,即(D_%7Bab%7D)%5E2%3D(b-a)%5Ccdot(b-a)

  • ?求解線性方程組的定理,克萊姆法則

基礎(chǔ)光線追蹤算法

光線追蹤器(ray tracer)的基礎(chǔ)工作就是每次計(jì)算一個(gè)像素,考察圖像中該像素位置能觀測(cè)到的物體。以特定的像素位為觀測(cè)點(diǎn)(下圖中眼睛的位置),視線(ray)可能會(huì)和多個(gè)物體相交(T2,T1),我們只關(guān)心那個(gè)離觀測(cè)點(diǎn)最近的物體(T2),因?yàn)樗竺娴奈矬w(T1)會(huì)被其遮擋住。一旦找到了這個(gè)物體(T2),就使用交點(diǎn)、表面法線和其它信息來(lái)進(jìn)行著色計(jì)算(shading computation)來(lái)決定最終該像素點(diǎn)的值:

圖1

因此,一個(gè)基礎(chǔ)光線追蹤器包括三個(gè)部分:

  • 光線生成(計(jì)算觀測(cè)光線)

  • 光線相交計(jì)算

  • 著色

用偽代碼來(lái)描述這一算法過(guò)程:

透視

計(jì)算機(jī)產(chǎn)生以前,使用2D的圖像來(lái)表示3D的物體場(chǎng)景的方法已經(jīng)被各路藝術(shù)家研究過(guò),如立體繪畫、魚眼鏡頭、外圍攝像機(jī),其中大部分方法都是線性透視:3D的物體投影到一個(gè)平面上,保證場(chǎng)景內(nèi)的直線在圖像中呈現(xiàn)的仍然是直線。

最簡(jiǎn)單的投影方法是平行投影:3D的點(diǎn)沿著投影方向移動(dòng)到與圖像平面相交,從而映射到2D的平面上。最終產(chǎn)生的視圖由投影方向和圖像平面位置決定:如果圖像平面和觀測(cè)方向垂直,那么這個(gè)投影就被稱作正交的(orthographic),否則就被稱作斜交的(oblique)。但在日常生活經(jīng)驗(yàn)中,更遠(yuǎn)處的物體看起來(lái)更小,因?yàn)槲覀兊难劬Σ皇菑膯我环较蚴占饩€的,而是從一個(gè)特定的點(diǎn),這就是透視投影:讓投影沿著的線都是經(jīng)過(guò)某一個(gè)點(diǎn)(視點(diǎn)),透視投影的視圖是通過(guò)視點(diǎn)位置和圖像平面位置決定的。

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

基于正交基的計(jì)算方法需要建立一個(gè)光線的數(shù)學(xué)表示,一條光線其實(shí)就是一個(gè)起點(diǎn)和一個(gè)傳播方向。一條三維直線,從觀測(cè)點(diǎn)e出發(fā)并經(jīng)過(guò)圖像平面上一點(diǎn)s可以表示為:

%5Cbegin%7Barray%7D%7Bc%7D%0Ap(t)%20%3D%20e%20%2B%20t(s-e)%0A%5Cend%7Barray%7D

其中向量(s-e)的方向從點(diǎn)e指向點(diǎn)s,可以理解為,從點(diǎn)e出發(fā),沿著向量(s-e)的方向前進(jìn),經(jīng)過(guò)t個(gè)單位向量長(zhǎng)度,到達(dá)了點(diǎn)p(t),由所有符合此表達(dá)式的點(diǎn)p(t)所組成的直線,就是所要計(jì)算的觀測(cè)光線,其方向與向量(s-e)同向:

圖2

可以注意到,p(0)%20%3D%20ep(1)%20%3D%20s,并且,如果0%3Ct1%3Ct2,則點(diǎn)p(t1)相比點(diǎn)p(t2)來(lái)說(shuō)更加接近于觀測(cè)點(diǎn);如果t%3C0,則點(diǎn)p(t)在眼睛的后方。在OOP編程中,想要將此表達(dá)式表示為一個(gè)類的函數(shù),大致是:

要計(jì)算一條觀測(cè)光線,最常見的構(gòu)建正交直角坐標(biāo)系的方法就是以視點(diǎn)e為原點(diǎn),觀測(cè)方向是-W,垂直觀測(cè)方向向上是V,另一個(gè)基向量則為U,如下圖所示:

圖3

正交視圖

對(duì)于正交視圖來(lái)說(shuō),所有光線的方向都是-W。視圖光線應(yīng)該從點(diǎn)e和向量UV所在的平面出發(fā),現(xiàn)在還需要的就是圖像平面的位置信息??梢杂盟臈l邊來(lái)表示圖像平面在UV方向上的邊界:lr分別表示圖像的左右邊界,bt分別表示圖像的上下邊界,一般情況下會(huì)有:l%3C0%3Crb%3C0%3Ct

圖4

假設(shè)我們現(xiàn)在需要在這個(gè)大小為(r-l)*(t-b)的連續(xù)平面上擬合出一張像素大小為n_%7Bx%7D*n_%7By%7D的圖像,則垂直方向上的像素點(diǎn)間隔為%5Cfrac%7Bt-b%7D%7Bn_%7By%7D%7D,水平方向上的像素點(diǎn)間隔為%5Cfrac%7Br-l%7D%7Bn_%7Bx%7D%7D,并且像素點(diǎn)處于每一個(gè)像素網(wǎng)格的中心。所以,假設(shè)某一像素點(diǎn)的索引坐標(biāo)為(i%2Cj),在UV平面上的實(shí)際實(shí)數(shù)域坐標(biāo)為(u%2Cv),坐標(biāo)系原點(diǎn)為e,UVW方向的單位向量分別為%5Cvec%7Bu%7D%EF%BC%8C%5Cvec%7Bv%7D%EF%BC%8C%5Cvec%7Bw%7D,則有:

%5Cbegin%7Barray%7D%7Bc%7D%20u%20%3D%20l%2B%5Cfrac%7Br-l%7D%7Bn_%7Bx%7D%7D*(i%2B0.5)%5C%5C%20v%20%3D%20b%2B%5Cfrac%7Bt-b%7D%7Bn_%7By%7D%7D*(j%2B0.5)%20%5Cend%7Barray%7D

給定一個(gè)像素點(diǎn)$(i,j)$,現(xiàn)在可以計(jì)算觀測(cè)光線的出發(fā)點(diǎn)(O)和光線方向(D)了:

%5Cbegin%7Barray%7D%7Bl%7D%20O%20%3D%20e%2Bu%5Cvec%7Bu%7D%2Bv%5Cvec%7Bv%7D%5C%5C%20D%20%3D%20-%5Cvec%7Bw%7D%20%5Cend%7Barray%7D

所以,正交視圖的觀測(cè)光線可表示為:

%5Cbegin%7Barray%7D%7Bl%7D%20%20p(T)%20%3D%20O%2BT*D%20%5C%5C%20%20%3D%20(e%2Bu%5Cvec%7Bu%7D%2Bv%5Cvec%7Bv%7D)%20%2B%20T*(-%5Cvec%7Bw%7D)%20%5C%5C%20%20%3D%20(e%2B(l%2B%5Cfrac%7Br-l%7D%7Bn_%7Bx%7D%7D*(i%2B0.5))%5Cvec%7Bu%7D%2B(b%2B%5Cfrac%7Bt-b%7D%7Bn_%7By%7D%7D*(j%2B0.5))%5Cvec%7Bv%7D)%20%2B%20T*(-%5Cvec%7Bw%7D)%20%5Cend%7Barray%7D

透視視圖

明白了正交視圖的計(jì)算方法后,透視視圖的計(jì)算方法就簡(jiǎn)單了,所有的光線擁有相同的起點(diǎn),即視點(diǎn)e。但是對(duì)于不同的像素點(diǎn),光線方向不同,由于最后的圖像和視點(diǎn)位置有關(guān),假設(shè)視點(diǎn)e到圖像平面的距離為d,此時(shí)觀測(cè)光線的出發(fā)點(diǎn)(O)和光線方向(D)為:

%5Cbegin%7Barray%7D%7Bc%7D%20O%20%3D%20e%5C%5C%20D%20%3D%20-d%5Cvec%7Bw%7D%2Bu%5Cvec%7Bu%7D%2Bv%5Cvec%7Bv%7D%5C%5C%20%5Cend%7Barray%7D%0A

圖5

故透視視圖的觀測(cè)光線可表示為:

%5Cbegin%7Barray%7D%7Bl%7D%20%20p(T)%20%3D%20O%2BT*D%20%5C%5C%20%20%3D%20e%2B%20T*(-d%5Cvec%7Bw%7D%2Bu%5Cvec%7Bu%7D%2Bv%5Cvec%7Bv%7D)%20%5C%5C%20%20%3D%20e%2BT*(-d%5Cvec%7Bw%7D%2B(l%2B%5Cfrac%7Br-l%7D%7Bn_%7Bx%7D%7D*(i%2B0.5))%5Cvec%7Bu%7D%2B(b%2B%5Cfrac%7Bt-b%7D%7Bn_%7By%7D%7D*(j%2B0.5))%5Cvec%7Bv%7D)%20%5Cend%7Barray%7D

光線相交計(jì)算

現(xiàn)在已經(jīng)得到了正交和透視視圖的觀測(cè)光線的計(jì)算方法,接下來(lái)需要找到光線在T%3E0的范圍內(nèi)與物體的第一個(gè)交點(diǎn),也就是說(shuō),尋找光線在區(qū)間%5BT%7B0%7D%2CT%7B1%7D%5D%2C(T%7B0%7D%3D0%2CT%7B1%7D%3D%2B%5Cinfty)T處與物體表面的第一個(gè)交點(diǎn)。

與球體的相交計(jì)算

假設(shè)一個(gè)球體的中心點(diǎn)為C%3D(x_%7Bc%7D%2Cy_%7Bc%7D%2Cz_%7Bc%7D),半徑為R,對(duì)一個(gè)球面上的任意一點(diǎn)P%3D(x%2Cy%2Cz),可表示為:

%5Cbegin%7Balign*%7D%20(P%20-%20C)%5Ccdot(P%20-%20C)%20-%20R%5E2%20%3D%200%5C%5C%E6%88%96%5C%5C%20(x%20%E2%88%92%20x_%7Bc%7D)%5E2%20%2B%20(y%20%E2%88%92%20y_%7Bc%7D)%5E2%20%2B%20(z%20%E2%88%92%20z_%7Bc%7D)%5E2%20%E2%88%92%20R%5E2%20%3D%200%20%5Cend%7Balign*%7D

故,對(duì)于觀測(cè)光線上一點(diǎn)P(T),只要滿足上式,就是該光線與球面的交點(diǎn),將P(T)%3DO%2BT%5Ccdot%20D代入上式:

%5Cbegin%7Balign*%7D%20(O%2BT%5Ccdot%20D-C)%5Ccdot(O%2BT%5Ccdot%20D-C)-R%5E2%3D0%20%5Cend%7Balign*%7D

整理可得,

%5Cbegin%7Balign*%7D%20(D%5Ccdot%20D)T%5E2%2B2D%5Ccdot(O-C)T%2B(O-C)%5Ccdot(O-C)-R%5E2%3D0%20%5Cend%7Balign*%7D

這個(gè)式子是一個(gè)關(guān)于T的一元二次方程,根據(jù)求根公式x%20%3D%20%5Cfrac%7B-B%5Cpm%5Csqrt%7BB%5E2-4AC%7D%7D%7B2A%7D,可以得到:

%5Cbegin%7Balign*%7D%20T%20%26%3D%20%5Cfrac%7B-D%5Ccdot(O-C)%5Cpm%5Csqrt%7B(D%5Ccdot(O-C))%5E2-(D%5Ccdot%20D)((O-C)%5Ccdot(O-C)-R%5E2)%7D%7D%7B(D%5Ccdot%20D)%7D%20%5Cend%7Balign*%7D

如果兩個(gè)解中更小的解在區(qū)間%5BT%7B0%7D%2CT%7B1%7D%5D內(nèi),那么更小的解是交點(diǎn),否則更大的解是交點(diǎn)。若兩者都不在區(qū)間內(nèi),則該觀測(cè)光線在此區(qū)間內(nèi)與該球體沒有交點(diǎn)。

與三角形平面的相交計(jì)算

假設(shè)一個(gè)三角形的三個(gè)頂點(diǎn)分別為A%2CB%2CC,那三角形內(nèi)部的任何一點(diǎn)P都可以描述為:

%5Cbegin%7Balign*%7D%20P%20%26%3D%20A%2B%5Cbeta(B-A)%2B%5Cgamma(C-A)%2C%20(%5Cbeta%3E0%2C%5Cgamma%3E0%2C%5Cbeta%2B%5Cgamma%3C1)%20%5Cend%7Balign*%7D

那么觀測(cè)光線與三角形內(nèi)部某點(diǎn)相交就可以寫成:

%5Cbegin%7Balign*%7D%20P(T)%20%26%3D%20O%2BT*D%20%3D%20A%2B%5Cbeta(B-A)%2B%5Cgamma(C-A)%20%5Cend%7Balign*%7D

轉(zhuǎn)換成三維坐標(biāo)值的形式就是一個(gè)方程組:

%5Cbegin%7Bcases%7D%20x_%7BO%7D%2BTx_%7BD%7D%3Dx_%7BA%7D%2B%5Cbeta(x_%7BB%7D-x_%7BA%7D)%2B%5Cgamma(x_%7BC%7D-x_%7BA%7D)%5C%5C%20y_%7BO%7D%2BTy_%7BD%7D%3Dy_%7BA%7D%2B%5Cbeta(y_%7BB%7D-y_%7BA%7D)%2B%5Cgamma(y_%7BC%7D-y_%7BA%7D)%5C%5C%20z_%7BO%7D%2BTz_%7BD%7D%3Dz_%7BA%7D%2B%5Cbeta(z_%7BB%7D-z_%7BA%7D)%2B%5Cgamma(z_%7BC%7D-z_%7BA%7D)%20%5Cend%7Bcases%7D

再轉(zhuǎn)換成標(biāo)準(zhǔn)的線性系統(tǒng):

%5Cbegin%7Bbmatrix%7D%20x_%7BA%7D-x_%7BB%7D%20%26%20x_%7BA%7D-x_%7BC%7D%20%26%20x_%7BD%7D%5C%5C%20y_%7BA%7D-y_%7BB%7D%20%26%20y_%7BA%7D-y_%7BC%7D%20%26%20y_%7BD%7D%5C%5C%20z_%7BA%7D-z_%7BB%7D%20%26%20z_%7BA%7D-z_%7BC%7D%20%26%20z_%7BD%7D%20%5Cend%7Bbmatrix%7D%20%5Cbegin%7Bbmatrix%7D%20%5Cbeta%5C%5C%20%5Cgamma%5C%5C%20T%20%5Cend%7Bbmatrix%7D%20%3D%20%5Cbegin%7Bbmatrix%7D%20x_%7BA%7D-x_%7BO%7D%5C%5C%20y_%7BA%7D-y_%7BO%7D%5C%5C%20z_%7BA%7D-z_%7BO%7D%20%5Cend%7Bbmatrix%7D

其中%5Cbeta%2C%5Cgamma%2CT均為未知數(shù),求解3*3的線性方程組經(jīng)典方法是克萊姆法則,推導(dǎo)過(guò)程比較復(fù)雜在此省略,直接給出解,對(duì)于一個(gè)方程組:

%5Cbegin%7Bbmatrix%7D%20a%20%26%20d%20%26%20g%5C%5C%20b%20%26%20e%20%26%20h%5C%5C%20c%20%26%20f%20%26%20i%20%5Cend%7Bbmatrix%7D%20%5Cbegin%7Bbmatrix%7D%20%5Cbeta%5C%5C%20%5Cgamma%5C%5C%20T%20%5Cend%7Bbmatrix%7D%20%3D%20%5Cbegin%7Bbmatrix%7D%20j%5C%5C%20k%5C%5C%20l%20%5Cend%7Bbmatrix%7D

它的解為:

%5Cbegin%7Balign*%7D%20%5Cbeta%20%26%3D%20%5Cfrac%7Bj(ei-hf)%2Bk(gf-di)%2Bl(dh-eg)%7D%7BM%7D%2C%5C%5C%20%5Cgamma%20%26%3D%20%5Cfrac%7Bi(ak-jb)%2Bh(jc-al)%2Bg(bl-kc)%7D%7BM%7D%2C%5C%5C%20T%20%26%3D%20%5Cfrac%7Bf(ak-jb)%2Be(jc-al)%2Bd(bl-kc)%7D%7BM%7D%2C%5C%5C%20%E5%85%B6%E4%B8%AD%20M%20%26%3D%20a(ei-hf)%2Bb(gf-di)%2Bc(dh-eg)%20%5Cend%7Balign*%7D

當(dāng)然,得到的解應(yīng)該滿足T%7B0%7D%3C%3DT%3C%3DT%7B1%7D%2C%5Cbeta%3E0%2C%5Cgamma%3E0%2C%5Cbeta%2B%5Cgamma%3C1,否則代表該光線在該三角形內(nèi)部沒有交點(diǎn)。

代碼表示

在OOP編程中,可以把此求交點(diǎn)的函數(shù)放在物體表面類中:

當(dāng)物體不止一個(gè)時(shí),我們需要找到沿著光線距離觀測(cè)點(diǎn)最近的那個(gè)交點(diǎn),最簡(jiǎn)單方法是將一組物體本身看作另一個(gè)物體:








計(jì)算機(jī)圖形學(xué)基礎(chǔ)(二):光線追蹤(Ray Tracing)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
新竹县| 文登市| 双峰县| 塔城市| 康乐县| 澄迈县| 禄丰县| 防城港市| 绥棱县| 横峰县| 海林市| 盖州市| 临清市| 灌南县| 芜湖县| 和顺县| 湾仔区| 北碚区| 横峰县| 犍为县| 罗源县| 收藏| 习水县| 颍上县| 兴化市| 区。| 勐海县| 湘潭县| 新民市| 资阳市| 乾安县| 巴青县| 白城市| 九台市| 垫江县| 天气| 长垣县| 大荔县| 清徐县| 通许县| 铜川市|