2010-11-28 131 views
1

我正在研究程序,演示各種鏡頭如何工作,並且我需要一個2D ray tracing 2D庫或算法。2D光線追蹤

我搜索了光線追蹤,主要發現了用於創建3D場景的東西,而我的要求是一個簡單的交互式鏡頭模擬。

因此,歡迎使用2D射線追蹤算法或庫的任何一點。我正在使用Python。

+0

所以你想在光學指數取決於位置的材料中進行光線追蹤?光學指數變化的地方是否存在硬性邊界,還是位置的任意函數? – CodesInChaos 2010-11-28 09:51:00

+0

不,這是2D鏡頭演示,從簡單的凹凸透鏡到菲涅耳透鏡。存在硬邊界和多種材料(玻璃水空氣等),但在單個物體內沒有變化。 – iamgopal 2010-11-28 09:58:25

回答

2

這個問題有兩個部分:

  1. 找出什麼光線照射
  2. 計算射線折射

後發現什麼射線擊中我離散的形式鏡頭。所以你只需要測試直線。

僞代碼,找到第一擊:

Line hitLine=null; 
double minA=+Infinity; 
foreach(line in Lines) 
{ 
    Solve (Ray.Start + a*Ray.Direction) == (line.P1+b*(line.P2-line.P1)) for a and b 
    if(0<=b<=1) //hit the line-piece 
    { 
    if(0<=a<minA) 
    { 
     minA=a; 
     hitLine=line; 
    } 
    } 
} 

在命中應用矢量版本斯涅耳定律的射線方向和設置新的起點,事件的點。然後從這一點開始再次進行光線跟蹤。

您還需要注意光線不會立即再次撞擊相同的線條。通過將該線條黑名單或僅將該位置設置爲超出線條位置(位置+ = epsilon *方向)來做到這一點

重複,直到沒有更多的命中,即射線離開盒子。