2

そこで、XNAフレームワークを利用して、C ++で記述された古いレイトレーサーをC#で書き直すことにしました。

私はまだ古い本を持っていて、メモに従うことができますが、いくつかのアイデアについて混乱していて、誰かがそれをうまく表現できるかどうか疑問に思いました。


    for each x pixel do
        for each y pixel do
        //Generate Ray
        //1 - Calculate world coordinates of current pixel
           //1.1 Calculate Normalized Device coordinates for current pixel 1- to -1 (u, v) 
           u = (2*x/ WIDTH) - 1 ;
           v = (2*y/HEIGHT) - 1 ;
           Vector3 rayDirection = -1*focalLength + u'*u + v'*v


上記のコードでは、u'とv'は、特定のカメラに対して計算された通常の基準です(同じ名前で混乱することはわかっています)

私がその本をたどって、それが表現する方法でそれをするならば、それはうまくいきます。ただし、XNAを活用しようとしていて、同じアクションを実行する方法について混乱していますが、マトリックスを使用しています。

だから私は次の手順をXNAコードに置き換えようとしました


    class Camera
        {
           public Camera(float width, float height)
           {
            AspectRatio = width/height;
            FOV = Math.PI / 2.0f;
            NearPlane = 1.0f;
            FarPlane = 100.0f;
            ViewMatrix = Matrix.CreateLookAt(Position, Direction,this.Up);
            ProjectionMatrix=Matrix.CreatePerspectiveFieldOfView(FOV,
                                              AspectRatio,NearPlane,FarPlane); 
           }
        }

この時点で、任意のピクセル(x、y)の方向ベクトルを取得するために適用することになっている操作の順序が混乱していますか?

私の頭の中で考えているのは:(u、v)= ProjectionMatrix * ViewMatrix * ModelToWorld * Vertex(モデル空間内)

したがって、それは理にかなっています

頂点(ワールド空間内)= Inverse(ViewMatrix)* Inverse(ProjectionMatrix)* [u、v、0]

また、ビューマトリックスは正規直交であるため、転置および反転する方法についても思い出しました。

4

2 に答える 2

0

レイトレーシングに行列を使用する必要は実際にはありません。パースペクティブプロジェクションはシステムから外れます。これは、レイトレーシングの利点の1つです。

私たちのコメントも紛らわしいです。

//1-現在のピクセルのワールド座標を計算します//1.1現在のピクセルの正規化されたデバイス座標を計算します1-から-1(u、v)

NDCはレイトレーシングには何の役割も持たないため、ここで何について話しているのかわかりません。そのu、vコードで行っているのは、ワールド空間に設定したピクセルの仮想グリッドに基づいて光線の方向を計算することだけです。次に、光線をシーンにトレースして、何かと交差するかどうかを確認します。

本当に今、あなたは本当に異なるスペースの儀式について心配する必要はありません。すべてを世界座標に入れて、それを1日と呼んでください。複雑なモデル(スケール回転やたわごとなどのモデル変換)を実行する場合は、モデル->ワールド変換が必要になる場合がありますが、レイトレーサーを最初に作成するときは、そのことについて心配する必要はありません。

XNAを使用したい場合は、そのカメラクラスを使用できますが、一部のメンバーのように役に立たなくなります。つまり、行列と近距離および遠距離の平面です。

于 2011-07-27T19:14:54.213 に答える
0

NDC の理由は、ピクセル単位の画像の高さ/幅を任意のサイズの画像 (必ずしも 1:1 ではない) にマップできるためです。

  1. ピクセル X&Y を -1 から 1 の均一な長方形に変換したい (基本的に、表示フレーム内でカメラを中央に配置する)
  2. FOV、アスペクト比、近平面を使用してピクセル (NDC 座標) をワールド空間座標に配置する逆投影行列を実行します。
  3. カメラ行列の逆を実行して、ワールド空間のカメラに相対的な座標を配置します
  4. 方向を計算する
于 2011-07-29T15:07:34.477 に答える