2014-04-20 110 views
0

我使用SharpDX寫一個「從零開始3D軟引擎」按照MSDN上的教程。但是,我無法讓我的預期和實際視野相匹配。透視投影矩陣似乎有不正確的FOV

我現在簡化的世界包括以下中的與Z = 0 4個三維頂點(0,1,0);(0,-1,0);(1,0,0);( - 1,0, 0)。我將相機放在(0,0,2)處並用(0,1,0)向上看(0,0,0)。我用90度視角(PI/2弧度)設置投影矩陣,並準備通過調用Vector3.TransformCoordinate(Vector3, Matrix)來渲染四個頂點中的每一個。

我的理解是,FOV用於計算比例因子1/TAN(FOV/2),它可應用於每個(Y,Z)對,例如y' = y * scale/z。類似地,考慮到縱橫比,也可以計算(X,Z)對的比例。

爲90度和相機間的距離2(垂直)FOV,我本來期望我所有的頂點是從位圖的邊緣相當遠。然而,頂部和底部頂點的Y值爲-0.49和+0.49,這意味着如果渲染它們實際上將觸摸屏幕邊界。我誤解了FOV的概念嗎?我看到的結果是我所期望的大約53度的FOV。就好像切線在其反轉之前被減半一樣...

我第一次嘗試用相機在(0,0,1)和90度的視場,因爲我確信比例因子是1(1/TAN(90/2) = 1),但頂點離屏。

+1

'0.49'不在屏幕邊緣。對於'x'和'y',視口的範圍從'-1'到'1'。因此,這些價值似乎是合理的。對於'90°'的fov,你可以在'2'的z-距離看到'-2'到'2'的範圍。 –

+0

謝謝妮可。這與我的測量結果完全吻合。我剛剛接受了教程代碼,卻沒有想到。我認爲你應該加上這個答案,而不僅僅是一個評論。 – Jono

回答

1

透視變換將來自相機空間座標到剪裁空間。

相機空間是一個普通的直角座標系與相機作爲原點。

剪輯空間是事後映射到視口中的臨時空間。對於位於視口內的點,xy座標都在[-1, 1]的範圍內。

+0

謝謝,尼科。對剪輯空間中的z值有任何意義,還是可以安全地丟棄它? – Jono

+0

通常這是寫入z緩衝區的值。值爲0意味着像素距離攝像機很遠(僅考慮沿視圖方向的距離),值爲1意味着像素距離攝像機遠。所以基本上它是像素的深度,但它不是線性的。如果你不需要深度,你可以丟棄它。 –