1. 將投影面上x,y,z方向上的點,投影到剪裁空間有一定比例關係
2. y方向上的比例關係
y/y0 = y'
y0/-z = tan(fov/2)
y' = y / tan(fov/2)*-z
讓f=1/tan(fov/2)
y' = f/-z * y
3. x方向上的比例關係
x' = f'/-z * x
根據相似三角形原理:
tan(fovx/2)/tan(fovy/2)=f/f' = aspect = width/height
所以:x' = f/aspect * 1/-z * x
4. 為了讓z方向近大遠小表示更真實,用雙曲線來求z方向上的點
因為zfar = 1 znear = -1
1 = m/zfar + c
-1 = m/znear + c
解方程得到:
m = -(2 * zfar * znear / znear - zfar)
c = -(zfar + znear/znear-zfar)
令znear = n, zfar = f
z' = 2nf/n-f * 1/-z - n+f/n-f
5. 將x',y',z'寫成矩陣的形式
x' = f/aspect * 1/-z * x
y' = f/-z * y
z' = 2nf/n-f * 1/-z - n+f/n-f
f = 1/tan(fov/2)
讓圖形引擎去除以1/-z,所以消去1/-z
x'' = x'/-z
y'' = y'/-z
z'' = z'/-z
x'' = f/aspect * x
y'' = fy
z'' = 2nf/n-f + n+f/n-f *
a = [
f/aspect 0 0 0
0 f 0 0
0 0 n+f/n-f 2nf/n-f
0 0 -1 0
]b = [
x y
z 1
]將w分量設定為-z,圖形引擎計算的時候會將x,y,z各分量除以-z
a * b =
[ fx/aspect
fy n+f/n-f + 2nf/n-f
-z]
const m4 = ,
透視投影矩陣的構建
投影矩陣最終建立的是乙個平截頭體 也可以稱為臺 在這種變換下呈現遠小近大的效果。這裡我將我學到知識記錄下來,以後備忘用。首先是使用opengl的glfrustum函式,它要求傳入的是前後 左右 上下等引數,這要求這個平截頭體是軸對稱的。由它構成的矩陣是為 如果我們使用的不是glfrustum,而是g...
26 WebGL的透視投影矩陣
上一章講的盒狀投影矩陣,主要用於精度需求度高的工業。而這一節的透視投影矩陣,更符合我們正常人的視覺,也是就近大遠小的感覺。我們需要實現的效果就是同樣大小的圖形,距離視點越遠,展現出來就越小,如圖 就像盒狀可視空間那樣,透視投影可視空間也有視點 視線 近裁剪面和遠裁剪面,這樣可視空間內的物體才會被現實...
Android OpenGL透視投影
首先申明下,本文為筆者學習 opengl es應用開發實踐指南 的筆記,並加入筆者自己的理解和歸納總結。1 透視除法 opengl會把每個gl position的x y和z分量都除以它的w分量。當w分量用來表示距離的時候,會使得較遠處的物體被移動到距離渲染區域中心更近的地方。新增w分量建立三維圖 p...