看了好幾篇關於投影矩陣的文章,在z座標的推導上,沒有提到為什麼z'和1/z成線性關係,而是通過結論中的投影矩陣,即已知z'= (za + b)/w,並且x和x',y和y'關係式中分母都有-z,所以w為-z,然後(-n,-f)對映到(-1,1),求出a、b,得到z'和z的關係。
這是用結論去反推過程,過程再得到結論,這樣的邏輯我覺得不對,我認為,應該是先得到x,y,z各自的關係式,才去構造出投影矩陣。
推導x,y座標
向量投影到近平面,然後對映到ndc,就可以得到,在此不贅述。
(下文ze同z,都是投影前向量座標(觀察空間座標))
式1.1
式1.2
重點討論如何推導z座標
z座標的轉換關係,並不是投影得到的,而是根據我們的需要:
1、表示物體原有的前後關係。
2、對映到標準裝置座標,從(-n,-f)對映到(-1,1)(使用右手座標系)。
3、近處精度更大;因為精度有限,當場景中有許多物體時,按照重要程度來說,首先保證近處物體前後關係是正確;所以要讓近處物體的z座標有更大的表示範圍。
關鍵在於3,在這篇文章(中的深度精度部分有提到,如何讓近處有更大表示範圍,文章中是對映到(0,1),對映到(-1, 1)也是一樣的道理。
這裡我認為,不只是z' = a*1/z + b可以達到我們的需求,z' = a*1/z² + b也可以,還可以構造很多關係式都可以達到我們的需求,但是我們的最終目標是構造乙個投影矩陣,投影矩陣*向量/齊次座標=對映後的向量。
整理式1.1,式1.2
式2.1
式2.2
整理後,式2.1、式2.2分母都有ze,因此選擇z'(ndc) = a*1/z(觀察空間) + b,即可以和x,y的關係式對應起來,又滿足我們的需求
(2019.08.15補充:使用1/z還有乙個重要的原因在於,光柵化時,需要進行透視校正插值,因為z'(ndc)與1/z(觀察空間)是線性關係(證明:或《3d遊戲與計算機圖形學中的數學方法》 第3版,第5.4章節),所以z'(ndc) = a*1/z(觀察空間) + b,另外,如果z'(ndc)直接儲存為z(觀察空間) ,等到進行透視校正插值,再進行轉換,這樣做是不好的,因為透視校正插值是逐片元操作,就要重複非常多次的運算,直接儲存為a*1/z(觀察空間) + b,是逐頂點操作,運算次數就少很多)
z'(ndc) = a*1/z + b,(-n, -f)對映到(-1,1)
式2.3
式2.1,式2.2,式2.3就可以整理出投影矩陣(負號提取到分母)
投影矩陣推導
投影變換是計算機圖形學的基礎,理解並推導投影矩陣也是很有必要的。正交投影比較簡單,沒有透視失真效果 近大遠小 而透視投影比較符合人類的眼睛感知,平行線在遠處會相交於一點。投影是通過乙個4x4的矩陣來完成的,將視錐對映成標準觀察體 齊次裁剪空間 opengl採用的是右手座標系,z軸朝螢幕向外,因此觀察...
OpenGL 投影矩陣的推導
計算機顯示器是乙個2d平面。opengl渲染的3d場景必須以2d影象方式投影到計算機螢幕上。gl projection矩陣用於該投影變換。首先,它將所有定點資料從觀察座標轉換到裁減座標。接著,這些裁減座標通過除以w分量的方式轉換到歸一化裝置座標 ndc 本文主要推導正交投影矩陣和透視投影矩陣。注意n...
旋轉座標轉換的矩陣推導
旋轉座標轉換的矩陣推導 介紹略,去網上查吧 旋轉變換一般是按照某個圓心點,以一定半徑r旋轉一定的角度 為了簡單起見我們給出下面的情景 假定點a x,y 想經過旋轉變換到達b x y 已知旋轉角度 和點a座標,計算出點b 要計算點b則分別計算他的x 和y 分量 根據矩陣乘法計算規則,可以推出 只要給出...