2

我正在开发演示各种镜头如何工作的程序,为此我需要一个 2D光线追踪库或算法。

我搜索了光线追踪,大部分都找到了用于创建 3D 场景的东西,而我的要求是简单的交互式镜头模拟。

因此,欢迎任何关于 2D 光线追踪算法或库的观点。我正在使用 Python。

4

3 回答 3

3

我开始这个小组是因为我对这种事情很感兴趣,

http://groups.google.com/group/python-ray-tracing-community/web/list-of-python-statistical-ray-tracers

在这里,您将找到一个(非详尽的)python 光线追踪器列表,它们应该为您指明正确的方向。我还有一个用 Python 编写的光线追踪器,可以满足您的需求,但它尚未发布!

于 2011-01-03T08:25:18.423 回答
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;
    }
  }
}

在命中时,将矢量版本 snellius-law 应用于射线方向并将新起点设置为入射点。然后从该点再次开始光线追踪。

您还需要注意光线不会立即再次击中同一线条。通过将一个线段列入黑名单或仅将位置设置为超出线段(位置+=epsilon*direction)来做到这一点

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

于 2010-11-28T10:13:21.883 回答
0

不确定这是否能解决您的问题,但至少对于“找出射线击中的内容”而言,您始终可以通过将每条线 (x0,y0)-(x1,y0) “嵌入”到 3D 场景中quad (x0,y0,z=0)-(x1,y1,z=1),然后将你所有的射线 (ex,ey)+r*(dx,dy) 变成“3D”射线 (ex,ey, z=0.5)+r*(dx,dy,0.f)。然后,您可以使用任何 3D 光线追踪库(如 embree 或 optix)来追踪这些光线并找到被击中的“四边形”。

于 2021-09-07T19:08:48.113 回答