2010-11-28 132 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 *方向)来做到这一点

重复,直到没有更多的命中,即射线离开盒子。