4

全て、

シーン内のさまざまなオブジェクトの熱伝達特性を計算するために、従来とは異なるレイトレーサーを作成しています。このレイトレーサーでは、ランダムな光線がプリミティブオブジェクトの表面からシーンに発射され、交差をチェックします。

この特定のアルゴリズムでは、各光線をプリミティブ空間で展開し、ソースオブジェクトによってワールド空間にアフィン変換し、その後、シーン内の他のオブジェクトのプリミティブ空間にアフィン変換して交差をチェックする必要があります。

たとえば、オブジェクトを[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によって変換された方向

逆変換行列M^-1を使用して世界座標に変換を適用すると M^-1によって変換された方向

4

2 に答える 2

3

逆転置変換行列は、回転コンポーネントを一定に保ちますが、スケーリングを反転します。つまり、スケーリングはまだそこにあります。これは法線に対して正しいです。2dで、 (0,0)から(.707、.707)までの線分を考えてみましょう。通常は(-.707、.707)です。(s、1)でスケーリングすると、 (0,0)から(s * .707、.707)までのセグメントが得られます。限界では、sが大きくなるにつれて、基本的にx軸に平行な平坦な線ができます。つまり、法線はy軸に沿って指す必要があります。したがって、通常の値(-.707 / s、.707)が得られます。。ただし、この例から、変換されたベクトルはもはや単位長ではないことが明らかです。おそらく、指向性コンポーネントを正規化する必要がありますか?

変換行列を2つの回転に挟まれたスケーリング(SVD)として表すことができるというプロパティを使用することから始めると、アウトバウンド変換行列は次のようになります。R2out* Sout ^ -1 * R1out、次にインバウンド変換行列は次のようになります:R1in ^ -1 * Sin * R2in ^ -1(SOがMathjaxをどのように使用したいか...)。ベクトルを再正規化する限り、これは正しいことのように思われます。


編集:

これを一夜にして考えて、逆転置は通常の場合にのみ有効である可能性があると判断しました。上記の例を考えてみましょう。s = 2の場合、線分の傾き(元々は1)は1/2になります。同様に、法線の傾きは-1から-2に変わります。線分と光線の間にはまだ90度の角度があります。ここまでは順調ですね。さて...検討中のベクトルが実際に線分に平行である場合はどうなりますか。平行ではなくなった2の勾配が得られます。

ですから、この時点で2つの質問があると思います。あなたのプログラムで実際に何がうまくいかないのですか/それが正しくないと思う理由は何ですか?そして、正しい動作は何ですか?おそらく、2Dプロットを作成できます。

于 2011-04-29T03:46:18.670 に答える
1

これは先日この質問で出てきました

回答の1つは、法線の逆変換の転置の使用について説明しているレイトレーシングニュースの記事にリンクしています。

「実際に何がうまくいかないのか」という質問については、JCooperに同意する必要があります。私の最初の考えは、あなたは放射熱伝達をシミュレートしているように見え、オブジェクトの不均一なスケーリングに注意する必要があるということです。放出されているオブジェクトの表面に「フォトン」が均一に分布している場合、そのオブジェクトのスケーリングを不均一に適用すると、表面を離れるフォトンの分布が不均一になります。これは考えられる落とし穴の1つですが、何が問題になっているのかを示さないため、これが問題であるかどうかを判断するのは困難です。

変換を行う正しい方法に関する質問に答えるには、レイトレーシングニュースへのこのリンクをたどってください

于 2011-04-29T14:47:41.747 に答える