分享到plurk 分享到twitter 分享到facebook

版本 57c8b346f4796e9fda4cd4fe39427e7450e850f7

基於叢集電腦的光跡追蹤程式開發

預期目標

  • 使用者可輸入自訂格式的場景描述檔案
  • 在叢集電腦環境下做平行運算,使用MPI

說明文件

What is Ray Tracing? 在解說光跡跟蹤之前,先介紹Perspective Projection透視投影。如下圖,在空間中有個正立方體,攝影機的底片在底面(正方形),c經過一些相似形幾何運算,可以得到一個較小的c’,將所有頂點都打在底片上,再將c’的頂點相連(運用直線投影還是直線的直觀概念),這就是相機會拍到的東西!由於每個頂點可以在常數時間內被映射,這種方法被大量用在早期計算機圖學界

.. image:: /l001vantagepoint.png

現在介紹另一種電腦運算成像的方法光機追蹤(Ray Trace)。這是一套運用物理原理的演算法,模擬光的運作流程。首先從光源向四面八方打出來,假設其中一條光線交會空間中一個物體,經過不平的表面漫射(diffuse)再向四面八方散射光,有些被吸收….在這無限多條光中找到幾條射入攝影機底片的光做運算。你可以發現這句話無限使得這個直觀模擬複雜度也變為無限。如何改善這套演算法呢?想像懵懂無知的小時候,上課無聊拿著鏡子偷看身後的同學,此時那個同學對著鏡子也能“偷看”到你,這個現象說明著光的可逆性,利用這個可逆性,我們可以只針對打在底片上的光往回追蹤做運算,這便是光跡追蹤的理論核心

.. image:: /l001lightingshadow.gif

球體可以凸顯光跡追蹤的強大,因此我們首要目標是實做球體和光的交會演算法(Ray-Sphere Intersection)。這其實是一個不太難但是算式複雜的題目。向量底片上的各點(x,y)扣除眼睛位置(xe,ye)即為光的方向向量(dx, dy)=(x, y)-(xe, ye),由參數式(xe+dxt, ye+dyt)可以描述這道光,帶入空間中球心(xc, yc, zc)半徑為r的球體方程式(x-xc)2+(y-yc)2+(z-zc)2=r2,得到一個二次方程式,可以解得t之值,兩組解表示兩個交點,此時要取近的才是光真正打到的地方!

開發日誌

2014/3/22 完成儲存BMP圖檔和Ray-Sphere Intersection演算法,做出來的顏色是球本身的顏色,並且只做一層追蹤(確認Ray-Sphere intersect正確性)!

.. image:: /output.jpg

參考資料