我正在使用透視相機。構造函數必須是:透視投影只給予視場
PerspectiveCamera::PerspectiveCamera(Vec3f ¢er, Vec3f &direction, Vec3f &up, float angle)
這是大多數人不同的建築,因爲它缺少近端和遠端剪切面。我知道如何處理中心,方向和起步 - 標準的算法。相應地
我們可以構造視圖矩陣和平移矩陣:
因此,觀看變換是:
對於正交相機(其正常工作對我來說),該逆變換是用來去從屏幕空間到世界空間。相機座標從屏幕空間中的(-1,-1,0) - >(1,1,0)開始。
對於透視變換,僅視場中給出。所述Wikipedia 3D projection article給出了使用視角領域的透視投影矩陣,並假設相機座標從去(-1,-1) - >(1,1):
在我的代碼(ex,ey,ez)是從(-1,-1,ez) - >(1,1,ez)的相機座標。請注意,K中的1(3,3)點不在維基百科的文章中 - 我把它放在矩陣中使其可逆。所以這可能是一個問題。
但不管怎麼說,對透視投影,我使用的這種轉變:
ķ逆乘以p來使典型視圖體積視錐體,和該結果被乘以M反轉到世界座標。
我得到了錯誤的結果。正確的輸出是:
我的輸出是這樣的:
我使用了透視投影正確的算法給我的限制(沒有近及遠平面輸入)? ??
這是你的描述中的一個拼寫錯誤,即近端和遠端剪輯平面是否彼此相等(ez)?如果你這樣做,使用透視投影矩陣的傳統方程** m22 **和** m23 **(其中指數從** 0 **開始)將是無限的。 –
我假設你的意思是當我說「(-1,-1,ez) - >(1,1,ez)」時。不,我不認爲這意味着近距離和遠距離的剪輯平面。根據維基百科,exyz觀衆的位置相對於顯示器表面。 –
我想到的方法是ez是距離xy軸的z距離,假設您有從(-1,-1) - >(1,1)的alpha和xy座標視場。但這只是我的猜測。 –