我正在开发演示各种镜头如何工作的程序,为此我需要一个 2D光线追踪库或算法。
我搜索了光线追踪,大部分都找到了用于创建 3D 场景的东西,而我的要求是简单的交互式镜头模拟。
因此,欢迎任何关于 2D 光线追踪算法或库的观点。我正在使用 Python。
我正在开发演示各种镜头如何工作的程序,为此我需要一个 2D光线追踪库或算法。
我搜索了光线追踪,大部分都找到了用于创建 3D 场景的东西,而我的要求是简单的交互式镜头模拟。
因此,欢迎任何关于 2D 光线追踪算法或库的观点。我正在使用 Python。
我开始这个小组是因为我对这种事情很感兴趣,
在这里,您将找到一个(非详尽的)python 光线追踪器列表,它们应该为您指明正确的方向。我还有一个用 Python 编写的光线追踪器,可以满足您的需求,但它尚未发布!
这个问题有两个部分:
为了找出光线击中的内容,我会离散化镜头的形式。所以你只需要对直线进行测试。
查找第一个命中的伪代码:
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)来做到这一点
重复直到没有更多的命中,即光线离开盒子。
不确定这是否能解决您的问题,但至少对于“找出射线击中的内容”而言,您始终可以通过将每条线 (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)来追踪这些光线并找到被击中的“四边形”。