Fundamentals of Computer Graphics(4th Ed)--Ray Tracing (計算機圖形學翻譯級筆記)

轉載請註明出處
歡迎留言、討論、指正
本文未註明出處圖片均來自 個人 或 Fundamentals of Computer Graphics(4th Ed)

計算機圖形學最基本的功能就是渲染(rendering)一個三位物體:比如從某個特定視角看由很多幾何形狀組成的三維空間,所能看到的畫面是什麼樣子?這是藝術家和工程師已經重複了幾個世紀的工作。本質上來說,就是輸入一堆對象,輸出一個二維數組。總而言之,渲染考慮的就是每一個對象是怎麼影響輸出的圖像的,分爲兩種:一種是對象順序渲染(object-order rendering),按對象順序依次考慮每個對象對所有像素的影響並更新像素值;一種是像素順序渲染(image-order rendering) 按像素順序依次考慮所有對象對每個像素的影響並更新像素值。兩者循環順序不同:

//-----對象順序渲染----
for(object : world)
   for(pixel : array)
{ pixel[i] = pixel[i]+ effect_of(object);}

//-----像素順序渲染----
for(pixel : array)
  for(object : world)
{ pixel[i] = pixel[i]+ effect_of(object);}

兩種方法計算結果相同,但在不同應用場景性能不一樣,我們將在第8章詳細討論有什麼不一樣。但通常來說,像素順序渲染可能更簡單,適應性更強,但產生一張“過得去的圖像”所花費的時間更長。光線追蹤的難點不在陰影和反射,而在於對象順序的框架(object-order framework)???我還沒弄懂 T.T
在這裏插入圖片描述
我們先討論像素順序渲染,是因爲光線追蹤器能在不借助任何高級數學機制的條件下就可以工作。

基本的光線追蹤算法
一個光線追蹤器以此計算一個像素,每次計算的基本任務是圖像當前像素點爲視點(viewpoint),以互不平行的==“視線(viewing ray)”(射線)射出,“視線”先“擊中(hit)”==的交點(intersection point)就是在圖像相應像素點上應該顯示的對象點,因爲這個對象已經遮擋了它身後的所有對象。找到目標對象後,利用交點、法向量、和其他信息(如選擇的渲染方式)進行 着色(shading)計算得到像素的顏色值。故光線追蹤器由三個部分組成:
1.光線生成(ray generation) 根據相機的空間參數(camera geometry)計算每個像素上的“視線”的原點和方向;
2.光線相交(ray intersection) 找到視線首先擊中的對象,計算法向量n;
3.着色(shading) 根據視線交點,法向量,和“視線”計算像素的像素的顏色值;
光線追蹤器的真正潛力在學習了第10章的着色方法,第12章更先進的射線交互技術(ray intersection techniques),和第13章的渲染技術後才能發揮出強大的功能。

透視
藝術家早在計算機發明前幾個世紀就在研究怎麼將3D對象或景色用2D繪畫表現出來,發展到今天比如相機魚眼鏡頭,立繪。它們和計算機圖形學具有共同的“工具”-----透視(perspective),3D對象的直線映射到2D圖像中仍是直線
最簡單的投影是平行投影,3D空間的點朝投影方向(projection direction)移動直到hit上圖像平面。平行投影在機械和建築領域經常使用,因爲保留與圖像平面平行對象的大小和形狀
投影線相互平行垂直於圖像平面時,稱作正交投影(orthographic projection)。有的書將投影線平行於座標軸的投影稱爲正交投影。
在這裏插入圖片描述

投影線相互平行不垂直於圖像平面時,稱作斜射(oblique)
投影線交於視點稱作透視投影(perspective perspective)
平行投影的限制:人類的視角不只捕捉一個方向的光線,存在近大遠小現象,平行線會在遠處匯聚於消失點(vanishing point),透視能夠解決這個問題。透視效果取決於視點的選擇(而非投影方向)和圖像所在平面。同平行投影一樣,透視也分爲正交和斜射兩種。
你可能聽說過傳統的==“三點透視”==這種人工構建透視效果的系統(如下)。只要能遵循投影簡單的數學原理就能達到透視效果。
在這裏插入圖片描述

視線計算
首先我們使用一條3D直線代表從視點e設向圖像平面上的點s,P=e+t(se)\vec P=\vec e+t(\vec s-\vec e),則P是視線上一點,se\vec s-\vec e爲視線的方向。t<0代表對象處於視點“之後”(使用t能保證被“看”到的對象始終視點前)。現在的問題時怎麼找到點s。所有光線發射器坐落於直角座標系(orthonormal coordinate frame),也被稱作攝像機系(camera frame),原點在視點e,uvw\vec u 、\vec v和\vec w分別代表三個基向量,u\vec u右手正方向,v\vec v朝上正方向,w\vec w朝後正方向,右手系。
w=aa   u=b×wb×w   v=w×u \vec w =\frac{\vec a}{|\vec a|} \space \space \space \vec u = \frac{\vec b\times \vec w}{||\vec b\times \vec w||} \space \space \space \vec v = \vec w \times \vec u 在這裏插入圖片描述在這裏插入圖片描述

正交視圖
在正交視圖下所有ray的方向都是w-\vec w,攝像機(圖像平面)後面也可以有對象。所有的視線都從視點e和向量uv\vec u,\vec v決定的平面上平行射出,唯一需要確定的參數是圖像平面在哪。我們定義ll爲爲左邊界的橫座標,rr爲右邊界的橫座標,bb下邊界縱座標,tt上邊界正方向。
在這裏插入圖片描述
在3.2小節中我們介紹了nx×nyn_x\times n_y圖像像素座標系。爲將圖片塞到(rl)×(td)(r-l)\times(t-d)大小的矩形中,像素水平間距爲(rl)nx\frac{(r-l)}{n_x},縱向間距爲tbny\frac{t-b}{n_y},注意像素點均在中心,故(i,j)柵格圖像座標上的點的攝像機系座標爲:u=l+(rl)(i+0.5)nxv=b+(tb)(j+0.5)ny u=l+\frac{(r-l)(i+0.5)}{n_x} \\ v=b+\frac{(t-b)(j+0.5)}{n_y}
在正交視角中,我們直接使用像素點作爲視線的起點,由於視線方向已知,產生正交視圖視線:
1.計算u,vu,v
2.射線方向w-w(斜射時w\vec w方向與視線d\vec d不重合)
3.射線起點=e+uv+vv\vec e+u\vec v+v\vec v
對於透視圖,所有視線的起點均爲視點,圖像平面不再是視點e,而是視點前方圖像平面距離(image plane distane) 或者稱爲焦距(focal length),同攝像機中的焦距作用一樣。視線由視點和圖像像素位置決定。視線產生的方法:
1.計算u,vu,v
2.射線方向ddd\vec d(斜射時w\vec w方向與投影線d\vec d不重合)
3.射線起點=e\vec e

視線-物體
我們已經產生了一個射線e+tde+t\vec d,再來看看t>0的範圍內hit到對象的情況。爲了便於學習,使用簡單例子:找到[t0t1][t_0,t_1]之間hit到的第一個表面。
球體的情況
p(t)=e+tdp(t)=e+t\vec d,隱式表面f§=0,我們希望找到hit在表面上,帶入可得f(e+td)=0f(e+t\vec d)=0,圓的表達式爲(xxc)2+(yyc)2+(zzc)2=R2(x-x_c)^2+(y-y_c)^2+(z-z_c)^2=R^2,圓心C(xc,yc,zc)(x_c,y_c,z_c)那麼我們將以上兩個式子變換爲:(e+tdC)(e+tdC)R2=0(e+t\vec d-\vec C)(e+t\vec d-\vec C)-R^2=0,化簡如下:
(dd)t2+2d(eC)t+(eC)(eC)R2=0(\vec d\cdot\vec d)t^2+2\vec d(\vec e-\vec C)t+(\vec e-\vec C)\cdot(\vec e-\vec C)-R^2=0
判別Δ=d(ec)2(dd)((eC)(eC)R2)\Delta=\sqrt{\vec d\cdot(\vec e-\vec c)^2-(\vec d\cdot\vec d)((\vec e-\vec C)\cdot(\vec e-\vec C)-R^2)}
t=d(eC)±Δddt=\frac{-d\cdot(\vec e-\vec C)\pm\Delta }{\vec d\cdot \vec d}
實際使用過程中應當先檢查判別式再做其他工作,當我們需要判斷 hit 結果的時候,通常作爲更復雜對象的邊界,檢查判別式已經足夠了。
同2.5.4章所討論的那樣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章