【问题标题】:2D optical ray tracing2D 光学光线追踪
【发布时间】:2010-11-28 09:46:34
【问题描述】:

我正在开发一个程序来演示各种镜头的工作原理以及我所需要的 2D ray tracing 库或算法。

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

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

【问题讨论】:

  • 所以你想在光学指数取决于位置的材料中进行光线追踪?光学指数的变化是否存在硬边界,或者它是位置的任意函数?
  • 不,它是用于2D镜头演示,从简单的凸凹透镜到菲涅尔透镜。有硬边界和多种材料(玻璃水空气等),但单个对象内没有变化。
  • 你好。您是否曾设法构建您的 2D 镜头演示?

标签: simulation raytracing


【解决方案1】:

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

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

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

【讨论】:

  • 还有我的网站,我记得有一些在等待。
【解决方案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)

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 2023-03-07
      • 2021-07-24
      • 2019-11-29
      • 2011-12-08
      • 2014-06-18
      相关资源
      最近更新 更多