私はさまざまなレンズがどのように機能するかを示すプログラムに取り組んでおり、そのために2Dレイトレーシングライブラリまたはアルゴリズムが必要でした。
私はレイトレーシングを検索し、3Dでシーンを作成するために使用するものをほとんど見つけましたが、私の要件は単純なインタラクティブレンズシミュレーションです。
したがって、2Dレイトレーシングアルゴリズムまたはライブラリに向けたあらゆるポイントを歓迎します。私はPythonを使用しています。
私はさまざまなレンズがどのように機能するかを示すプログラムに取り組んでおり、そのために2Dレイトレーシングライブラリまたはアルゴリズムが必要でした。
私はレイトレーシングを検索し、3Dでシーンを作成するために使用するものをほとんど見つけましたが、私の要件は単純なインタラクティブレンズシミュレーションです。
したがって、2Dレイトレーシングアルゴリズムまたはライブラリに向けたあらゆるポイントを歓迎します。私はPythonを使用しています。
こういうことに興味があったのでこのグループを始めたのですが、
ここでは、正しい方向を示す Python レイ トレーサーの (網羅的ではない) リストを見つけることができます。必要なことを実行する Python で書かれたレイ トレーサーもありますが、まだリリースされていません。
この問題には 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 を光線方向に適用し、新しい開始点を入射点に設定します。その後、その時点からレイトレーシングを再開します。
また、レイが同じラインピースにすぐに当たらないように注意する必要があります。その1つのラインピースをブラックリストに登録するか、ラインピースを少し超えて位置を設定するだけでそれを行います(位置+ =イプシロン*方向)
ヒットがなくなるまで繰り返します。つまり、光線がボックスを離れます。
問題が解決するかどうかはわかりませんが、少なくとも「光線が何に当たるかを調べる」ために、各行 (x0,y0)-(x1,y0) を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)。次に、embree や optix などの 3D レイ トレーシング ライブラリを使用して、これらのレイを追跡し、ヒットした「クワッド」を見つけることができます。