[參考文章]
作者正大三,剛好選修到計算機圖形學這門課,基於興趣,便試著實現全域性光照的效果,由此,寫下此篇文章。
所謂光線追蹤,是指從眼睛出發,經過影象平面每一畫素,投射光線到場景中,求該光線與場景中幾何圖形的最近交點,然後求該交點的顏色屬性,並將該顏色值記錄下來,再根據相交點的材質判斷性地進行反射、折射等現象繼續追蹤計算,最終把多次追蹤交點顏色值的結果混合得到最終該畫素的顏色值。(本文皆是介紹反向追蹤)
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。我通過成像平面以均勻隨機分布的方式拍攝光子,並且如果光子碰巧與物體相交...