因此,我決定重寫一個用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]
我還記得一些關於矩陣可以被轉置以及被倒置的原因,因爲它是正交的。
大多數你正在尋找能在www.scratchapixel.com可以找到解釋的座標。例如:http://www.scratchapixel.com/lessons/3d-basic-rendering – user18490
這是一個非常古老的問題,但我來到這個線程搜索正是你問同樣的事情。 @FreaknBigPanda的回答實際上是一個無法回答的問題。基本的問題是一樣的:對於光線追蹤(相機的位置,方向,焦距等),你怎麼得到改造和投影矩陣給出的參數?當你需要將外部完成的事情與光線追蹤器的輸出結合起來時,這尤其重要。你有沒有想出答案? – TSGM