實現光線追蹤

2022-08-31 09:39:09 字數 1746 閱讀 6786

[參考文章]

作者正大三,剛好選修到計算機圖形學這門課,基於興趣,便試著實現全域性光照的效果,由此,寫下此篇文章。

所謂光線追蹤,是指從眼睛出發,經過影象平面每一畫素,投射光線到場景中,求該光線與場景中幾何圖形的最近交點,然後求該交點的顏色屬性,並將該顏色值記錄下來,再根據相交點的材質判斷性地進行反射、折射等現象繼續追蹤計算,最終把多次追蹤交點顏色值的結果混合得到最終該畫素的顏色值。(本文皆是介紹反向追蹤)

4.1 攝像機

此次實驗,本人將攝像機放置於世界座標系下的vec3(0,5,15)下,影象平面置於vec3(0,0,-1)處。注,為了簡化,直接將影象設定width,height一致,均為600。

圖一特別注意:\(|front| = 1\)

4.2 場景

本實驗中,場景由兩個球以及乙個無限平面組成。

sphere1:

sphere(vec3(-10,10,-10),float(10))

引數一:球心

引數二:球徑

sphere2:

sphere(vec3(-10,10,-10),float(10))

plane:

在數學表達上,無限平面可表示為\(np=d\),其中n為平面法向量,d為原點到平面的最短距離。

plane(vec3(0,1,0),float(0))

4.3 影象中座標的轉換

最初,影象是600*600的平面,左上角為原點。現先轉換為以左下角為原點的[0,1]範圍內的平面。

左上角為原點且範圍為[0,600]:

\(x = x\)...(1)

\(y = y\)...(2)

左下角為原點且範圍為[0,1]:

\(x = x/width\)...(2)

\(y = 1-y/height\)...(2)

影象中心為原點且範圍為[-1,1]:

\(x = 2x-1\)...(3)

\(y=2y-1\)...(3)

(1)對於影象平面,自左向右,自上而下的經過每一畫素投射光線

(2)計算光線與場景中幾何圖形的最近交點,都無交點即直接返回黑色,進行(5),否則進(3)

(3)取樣 即計算最近交點的顏色屬性

(4)計算反射光線繼續追蹤,回到(2)。

(5)賦畫素予顏色值,回到(1)

4.1 步驟一之生成光線

由圖一可知,

\(ray.dire = samplevector+front\)...(4)

\(samplevector=vec3(x,y,0)\)...(5)[注:此時是以中心為原點了]

即可得到初始化的ray物件ray(eye.origin,ray.dire);

轉換為中心為原點計算光線原因如下:

4.2 步驟二之計算最近交點

推導過程複雜,作者不在此詳細闡述,有興趣的朋友可去這裡檢視

光線追蹤(raytracing)

考慮乙個二維平面,攝像機在 0,0 0,0 的位置,初始時平面上沒有障礙物。現在執行qq次操作,操作有兩種 假設這是第ii次操作,1 i q1 i q 1 給定x0,y0,x1,y1 x0 2 給定向量 x,y x,y 會有乙個動點從攝像機所在的 0,0 0,0 位置出發,以 x,y x,y 所指的...

光線追蹤(raytracing)

考慮乙個二維平面,攝像機在 0,0 0,0 的位置,初始時平面上沒有障礙物。現在執行qq次操作,操作有兩種 假設這是第ii次操作,1 i q1 i q 1 給定x0,y0,x1,y1 x0 2 給定向量 x,y x,y 會有乙個動點從攝像機所在的 0,0 0,0 位置出發,以 x,y x,y 所指的...

python渲染光線 Python光線追蹤

我正在用純python構建乙個簡單的python光線追蹤器 僅僅是為了它 但我遇到了障礙。我的場景的設定目前是這樣的 相機位於沿y軸指向的0,10,0。半徑為1的球體位於0,0,0。成像平面物距1遠離相機,其寬度和高度均為0.5。我通過成像平面以均勻隨機分布的方式拍攝光子,並且如果光子碰巧與物體相交...