筆記 投影座標到螢幕座標

2021-07-13 10:06:20 字數 1289 閱讀 9839

最近閱讀《3d遊戲程式設計大師技巧》,想要手動實現一遍固定渲染管線,作者在投影變換的部分費了頗多筆墨,但感覺該部分組織結構不是很清晰,花了不少功夫才搞懂,因此總結一下。

完成投影變換之後,視景體從乙個平截頭體(frustum)變換為乙個邊長為2的立方體:

經過透視除法之後,將平截頭體區域投影到乙個立方體中,其中的幾何體會產生相應的形變,造成近大遠小的透視效果:

接下來要將該立方體中的所有幾何體投影到二維視平面上,視平面上的投影區域為正方形,但是正常情況下視景體的寬高比大多為4:3,16:10等,因此對於y軸來講(通常以x軸為基準),投影區域比實際要顯示的區域大(高),如下圖所示:

為了將乙個長方形區域投影到正方形的視平面中,對於所有的y座標都要乘以乙個寬高比ra,相當於把y軸拉伸。如下圖所示:左邊虛線為視平面的大小,實線為實際應該看到的視野範圍,為了得到乙個x y座標範圍均為[-1,1]的投影,我們就需要將投影座標按照圖中箭頭的方式拉伸,得到右邊的視平面上的投影。

接下來將視平面上的頂點對映到螢幕座標系中,對x,y軸進行拉伸,y座標除以寬高比ar。通常來講,螢幕座標系的原點在左上角,y軸方向向下,也要進行相應的變換:

總結一下,先將矩形視野投影到方形的視平面中,然後將視平面變換到螢幕座標系。

細細思考,上面的步驟中,y座標先是乘以ar,然後又除以ar,發現其實完全可以省略歸一化到方形視平面的步驟,將視景體的寬高比設定為與螢幕相同。直接從視景體投影到螢幕座標系中,然後光柵化(如果不考慮z-buffer的話)。

這裡的視平面就不再是上面步驟中視景體的near平面了,新的視平面大小與螢幕相當,新的視距d根據螢幕座標系的長度和視野(fov)的正切計算得到:

從上圖不難看出,實際上將視景體中的幾何體放大到與螢幕座標相應的大小,然後直接投影。

地理 投影 座標與螢幕座標的轉換

剛接觸到這個東東,確實頭暈 什麼地理座標,投影座標,螢幕座標等等.哎.地理知識中學學過 都不知道咋學的 數學貌似n多年不用也都還給老師了 確實悲哀.唉.終於認真的研究了一下才算明白是怎麼回事了 其實不要管什麼地理座標,投影座標還是螢幕座標,搞的你是非要知道天文地理似的才能去動手去做這個東東 原理掌握...

SharpMap 螢幕座標到世界座標

計算機中有很多座標系,物件座標系 世界座標系 裁剪座標系 螢幕座標系!opengl流水線很容易實現上述順序的轉換。從網上查的資訊 1.裝置座標系與螢幕座標系 裝置座標 device coordinate 又稱為物理座標 physical coordinate 是指輸出裝置上的座標。通常將螢幕上的裝置...

螢幕座標到opengl世界座標轉換

很多人用opengl繪圖會遇到乙個問題即螢幕座標向opengl座標轉換,在網上流傳著如下類似的 glint viewport 4 gldouble modelview 16 gldouble projection 16 glfloat winx,winy,winz gldouble posx,pos...