2014-05-20 102 views
0

我正在使用透視相機。構造函數必須是:透視投影只給予視場

PerspectiveCamera::PerspectiveCamera(Vec3f &center, Vec3f &direction, Vec3f &up, float angle) 

這是大多數人不同的建築,因爲它缺少近端和遠端剪切面。我知道如何處理中心,方向和起步 - 標準的算法。相應地

r

foo+bar

z

我們可以構造視圖矩陣和平移矩陣:

V

因此,觀看變換是:

M

對於正交相機(其正常工作對我來說),該逆變換是用來去從屏幕空間到世界空間。相機座標從屏幕空間中的(-1,-1,0) - >(1,1,0)開始。

p

對於透視變換,僅視場中給出。所述Wikipedia 3D projection article給出了使用視角領域的透視投影矩陣,並假設相機座標從去(-1,-1) - >(1,1):

p

p

在我的代碼(ex,ey,ez)是從(-1,-1,ez) - >(1,1,ez)的相機座標。請注意,K中的1(3,3)點不在維基百科的文章中 - 我把它放在矩陣中使其可逆。所以這可能是一個問題。

但不管怎麼說,對透視投影,我使用的這種轉變:

p

ķ逆乘以p來使典型視圖體積視錐體,和該結果被乘以M反轉到世界座標。

我得到了錯誤的結果。正確的輸出是:

Correct result

我的輸出是這樣的:

My result

我使用了透視投影正確的算法給我的限制(沒有近及遠平面輸入)? ??

+0

這是你的描述中的一個拼寫錯誤,即近端和遠端剪輯平面是否彼此相等(ez)?如果你這樣做,使用透視投影矩陣的傳統方程** m22 **和** m23 **(其中指數從** 0 **開始)將是無限的。 –

+0

我假設你的意思是當我說「(-1,-1,ez) - >(1,1,ez)」時。不,我不認爲這意味着近距離和遠距離的剪輯平面。根據維基百科,exyz觀衆的位置相對於顯示器表面。 –

+0

我想到的方法是ez是距離xy軸的z距離,假設您有從(-1,-1) - >(1,1)的alpha和xy座標視場。但這只是我的猜測。 –

回答

0

爲防萬一有人遇到這個問題,在問題中提出的方法是不正確的方式來創建一個查看視錐體。透視矩陣(K)用於將遠平面投影到近平面上,並且在這種情況下我們沒有這些平面

要創建平截頭體,請對(x,y,ez)[與用於正交投影的(x,y,0)相反)。通過從投影中心減去變換點找到一個新的方向。射線。