2

因此,我決定重寫一個用C++編寫的舊光線跟蹤器,並使用XNA框架在C#中完成。關於使用XNA進行光線跟蹤的世界視圖投影矩陣問題的困惑

我還有我的舊書,可以按照說明操作,但是我對一些想法感到困惑,我想知道是否有人能夠很好地表達它。

 

    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」是orthnormal依據給定的相機計算(我知道相同的名稱,使其混亂)

如果我按照書和做它的方式表示,它的作品。然而,我正在嘗試利用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 *頂點(在模型空間)

因此,它會更有意義

頂點(在世界空間)= Inverse(ViewMatrix)* Inverse(ProjectionMatrix)* [u,v,0]

我還記得一些關於矩陣可以被轉置以及被倒置的原因,因爲它是正交的。

+0

大多數你正在尋找能在www.scratchapixel.com可以找到解釋的座標。例如:http://www.scratchapixel.com/lessons/3d-basic-rendering – user18490

+1

這是一個非常古老的問題,但我來到這個線程搜索正是你問同樣的事情。 @FreaknBigPanda的回答實際上是一個無法回答的問題。基本的問題是一樣的:對於光線追蹤(相機的位置,方向,焦距等),你怎麼得到改造和投影矩陣給出的參數?當你需要將外部完成的事情與光線追蹤器的輸出結合起來時,這尤其重要。你有沒有想出答案? – TSGM

回答

-1

原因NDC是,你可以在像素的圖像高度/寬度映射到任意大小的圖像(不一定是1:1) 基本上我的理解是以下幾點:

  1. 你想到像素X &將Y從-1轉換成均勻的矩形爲1(基本上定心觀察幀中的照相機)
  2. 執行逆投影矩陣,其使用FOV,寬高比和近平面放置像素(在NDC座標)進入世界空間座標
  3. 執行攝像頭矩陣的逆投入相對於相機在世界空間
  4. 計算方向
1

Theres確實不需要使用矩陣進行光線追蹤。透視投影只是落在系統之外。這是光線追蹤的好處之一。

你的評論也很混亂。

// 1 - 計算當前像素 的世界座標//1.1計算規格化設備座標當前像素1到-1(U,V)

NDC不必須在光線追蹤,所以我不要任何角色你不知道你在說什麼。所有你在做的事情,v代碼正在計算方向 基於你在世界空間中建立的虛擬像素網格。那麼你將會把光線追蹤到場景中,看看它是否與任何東西相交 。

真的,你真的不需要擔心現在不同的空間儀式。把所有東西都放到世界座標中,並稱之爲一天。如果你想做 複雜的模型(模型轉換如縮放旋轉和狗屎),可能需要模型 - >世界變換,但是當你第一次開始寫射線時,你不需要擔心那些東西。

如果你想使用XNA,你可以使用那個攝像頭類,但是像一些成員將是無用的。即矩陣和近平面以及遠平面。