全て、
シーン内のさまざまなオブジェクトの熱伝達特性を計算するために、従来とは異なるレイトレーサーを作成しています。このレイトレーサーでは、ランダムな光線がプリミティブオブジェクトの表面からシーンに発射され、交差をチェックします。
この特定のアルゴリズムでは、各光線をプリミティブ空間で展開し、ソースオブジェクトによってワールド空間にアフィン変換し、その後、シーン内の他のオブジェクトのプリミティブ空間にアフィン変換して交差をチェックする必要があります。
たとえば、オブジェクトを[2 2 1]でスケーリングするなど、異方性スケールを実行するまでは、すべて問題ありません(等方性スケールは問題ありません)。これは、私が光線の指向性成分を正しく変換していないと私に信じさせます。現在、方向成分にソースオブジェクトの逆変換行列の転置を掛けて光線の方向をプリミティブ空間からワールド空間に変換し、次に宛先オブジェクトの転置を掛けて光線をワールド空間から各プリミティブ空間に変換します。マトリックス。
また、ソースプリミティブの変換行列を乗算してプリミティブからワールド空間に移動し、宛先の逆変換を乗算してワールド空間からプリミティブ空間に移動しようとしましたが、失敗しました。
プリミティブオブジェクトの表面から(ランダムな点でランダムな方向に)発射された光線は、「通常の」レイトレーシングの表面法線と同じ方法で変換する必要があると思いますが、確かではありません。
私の方法論の欠陥が何であるかを知っている専門家はいますか?さらに情報が必要かどうかお気軽にお問い合わせください。
このレイトレーサーの基本的なアルゴリズムは次のとおりです。
For each object, i, in scene
{
for each ray, r, in number of rays per object
{
determine random ray from primitive i
convert ray from primitive space of i to world space
for each object, j, in scene
{
convert ray to primitive space of object j
check for intersection with object j
}
}
}
うまくいけば、質問をクリアするために例を見てみましょう。z軸(単位半径と高さ)に沿って伸びる円柱と、内径7と外径8のxy平面にある環があるとします。xとyの係数6で円柱をスケーリングします。方向(z方向ではない)なので、私のアフィン変換行列は次のようになります。
M(cylinder) = |2 0 0 0| M^-1(cylinder) = | .5 0. 0. 0. |
|0 2 0 0| | 0. .5 0. 0. |
|0 0 1 0| | 0. 0. 1. 0. |
|0 0 0 1| | 0. 0. 0. 1. |
M(annulus) = |1 0 0 0| M^-1(annulus) = |1 0 0 0|
|0 1 0 0| |0 1 0 0|
|0 0 1 0| |0 0 1 0|
|0 0 0 1| |0 0 0 1|
ここで、円柱sの表面にランダムな開始点があり、円柱cの表面からランダムな方向に離れて光線r(os)= s+ctを与える光線があるとします。
この光線をプリミティブ(オブジェクト)空間からワールド空間に変換してから、シーン内の他のオブジェクト(環)との交差をテストしたいと思います。
最初の質問は、M(円柱)またはM ^ -1(円柱)を使用して、光線r(os)を世界空間r(ws)に変換する正しい方法は何ですか。
2番目の質問は、光線r(ws)をワールド空間からオブジェクト空間に変換し、M(環)とM ^ -1(環)を使用して他のオブジェクトとの交差をチェックする正しい方法は何ですか。
いくつかの追加の背景情報:
このアプリケーションは、N個のオブジェクト間の放射熱伝達を計算するためのものです。光線はオブジェクト上のランダムな点から発射され、その方向はランダムな点で表面法線に向けられた半球分布内にあるようにランダムに選択されます。
これが私の問題の視覚化です。最初に生成されたときの光線の方向分布:
変換行列Mを使用して世界座標に変換を適用すると、次のようになります。
逆変換行列M^-1を使用して世界座標に変換を適用すると