OpenGL 投影矩陣

OpenGL Projection Matrix
OpenGL投影矩陣

  • 概述
  • 透視投影
  • 正交投影

概述

計(jì)算機(jī)顯示器是一個(gè)2D平面拗踢。OpenGL渲染的3D場(chǎng)景必須以2D圖像方式投影到計(jì)算機(jī)屏幕上脚牍。GL_PROJECTION矩陣用于該投影變換。首先巢墅,它將所有定點(diǎn)數(shù)據(jù)從觀察坐標(biāo)轉(zhuǎn)換到裁減坐標(biāo)诸狭。接著,這些裁減坐標(biāo)通過(guò)除以w分量的方式轉(zhuǎn)換到歸一化設(shè)備坐標(biāo)(NDC)君纫。

因此驯遇,我們需要記住一點(diǎn):裁減變換(視錐剔除)與NDC變換都保存在GL_PROJECTION矩陣中。下述章節(jié)描述如何從6個(gè)限定參數(shù)(左蓄髓、右叉庐、下、上会喝、近平面陡叠、遠(yuǎn)平面)構(gòu)建投影矩陣。

注意肢执,視錐剔除(裁減)在裁減坐標(biāo)上執(zhí)行枉阵,并且在除以wc之前。裁減坐標(biāo)xc预茄、yc兴溜、zc會(huì)與wc做比較檢測(cè)。如果任一坐標(biāo)小于-wc或大于wc,則該頂點(diǎn)將會(huì)拋棄昵慌。

接著假夺,OpenGL重新構(gòu)建那些裁減掉的多邊形的邊。

被視錐裁減的三角形

透視投影

OpenGL透視視錐體與NDC

在透視投影中斋攀,截棱錐體(觀察坐標(biāo))中的3D點(diǎn)會(huì)被映射到立方體(NDC)中已卷。x坐標(biāo)的范圍從[l,f]到[-1,1],y坐標(biāo)的范圍從[b,t]到[-1,1]淳蔼,z坐標(biāo)的范圍從[n,f]到[-1,1]侧蘸。

注意,觀察坐標(biāo)為右手坐標(biāo)系鹉梨,NDC使用左手坐標(biāo)系讳癌。也就是說(shuō),位于原點(diǎn)的照相機(jī)在觀察坐標(biāo)中看向-Z軸存皂,而在NDC中看向+Z軸晌坤。因?yàn)間lFrustum()只接收正的近平面與遠(yuǎn)平面距離值,我們需要在構(gòu)建GL_PROJECTION矩陣時(shí)對(duì)他們?nèi)》础?/p>

OpenGL中旦袋,觀察空間中的3D點(diǎn)被投影到近平面(投影平面)上骤菠。下圖展示觀察空間中的點(diǎn)(xe,ye,ze)如何投影到近平面上的點(diǎn)(xp,yp,zp)。

視錐體的俯視圖
視錐體的側(cè)視圖

從視錐體的俯視圖看出疤孕,使用相似三角形比率計(jì)算方式將觀察空間的x坐標(biāo)xe被映射到xp商乎。

從視錐體的側(cè)視圖看出,yp也使用相同的方式計(jì)算出:

注意祭阀,xp與yp二者都依賴于ze鹉戚,它們與-ze成反比例。也就是說(shuō)专控,它們都被-ze除抹凳。這是構(gòu)建GL_PROJECTION矩陣的第一點(diǎn)提示。在觀察坐標(biāo)通過(guò)與GL_PROJECTION矩陣相乘變換之后踩官,裁減坐標(biāo)依舊是其次坐標(biāo)却桶。它最終通過(guò)除以裁減坐標(biāo)的w分量才變成歸一化設(shè)備坐標(biāo)(NDC)。(更詳細(xì)描述參考OpenGL變換蔗牡。)

因此颖系,我們可以將裁減坐標(biāo)的w分量設(shè)置為-ze。這樣辩越,GL_PROJECTION矩陣的第四行變?yōu)?0,0,-1,0)嘁扼。

接著,我們通過(guò)線性關(guān)系將xp與yp映射到NDC中的xn與yn:[l,r]=>[-1,1]黔攒,[b,t]=>[-1,1]趁啸。

映射xp到xn
映射yp到y(tǒng)n

然后,我們用上面的方程式替換xp與yp强缘。


注意,我們?yōu)橥敢暢ǎ▁c/wc, yc/wc)將每個(gè)等式相被-ze整除不傅。前面我們已經(jīng)將wc設(shè)置為-ze旅掂,大括號(hào)中的項(xiàng)為裁減坐標(biāo)中xc與yc

從這個(gè)等式访娶,我們可以發(fā)現(xiàn)GL_PROJECTION矩陣的第一與第二行商虐。


現(xiàn)在,我們僅僅解決GL_PROJECTION矩陣的3行崖疤。由于觀察空間中的ze總是投影到近平面上的-n點(diǎn)秘车,zn的計(jì)算方法與其他坐標(biāo)的計(jì)算方法有稍許不同。不過(guò)我們需要唯一的z值來(lái)進(jìn)行裁剪與深度測(cè)試劫哼。此外叮趴,我們也會(huì)進(jìn)行逆投影(逆變換)操作。因?yàn)槿ㄉ眨覀冎纙并不依賴于x與y的值眯亦,我們借助w分量找尋zn與ze之間的關(guān)系。因此豪嚎,我們可以像這樣指定GL_PROJECTION矩陣的第三行:

在觀察空間搔驼,we等于1谈火。因此侈询,等式變?yōu)椋?/p>

為了計(jì)算系數(shù)A與B,我們使用(ze,zn)關(guān)系式(-n,-1)與(-f,1)糯耍,且將它們帶入到上述等式扔字。

為了求解A與B,重寫等式(1):

將等式(1')帶入等式(2)温技,然后求解A:

將A帶入等式(1)中革为,求出B:

我們解出A與B。因此ze與zn的關(guān)系變?yōu)椋?/p>

最后舵鳞,我們解出GL_PROJECTION矩陣的所有元素震檩。完整的投影矩陣為:

OpenGL透視投影矩陣

該投影矩陣為通用截面體。如果視錐體為對(duì)稱的蜓堕,即r=-l且t=-b抛虏,則矩陣可簡(jiǎn)化為:

在開(kāi)始后面講述之前,請(qǐng)回顧ze與zn之間的關(guān)系:等式(3)套才。你會(huì)注意到它是一個(gè)有理數(shù)方程且ze與zn并非線性關(guān)系迂猴。也就是說(shuō)近平面具有非常高的精度,而遠(yuǎn)平面的精度很低背伴。如果[-n,-f]的范圍變得很大沸毁,會(huì)引起深度精度問(wèn)題(深度沖突):遠(yuǎn)平面附近ze的小變化不會(huì)影響zn值峰髓。為了最小化深度緩存精度問(wèn)題,n與f的距離應(yīng)該盡可能小息尺。

深度緩存精度比較

正交投影


正交椎體與歸一化設(shè)備坐標(biāo)(NDC)

構(gòu)造正交投影的GL_PROJECTION矩陣比透視投影模式簡(jiǎn)單很多携兵。

觀察空間的xe、ye與ze分量都線性映射到NDC搂誉。我們只需將長(zhǎng)方體縮放為正方體眉孩,然后移動(dòng)它到原點(diǎn)。讓我們使用線性關(guān)系推導(dǎo)出GL_PROJECTION中的所有元素勒葱。

映射Xe到Xn
映射Ye到Y(jié)n
映射Ze到Zn

因?yàn)閷?duì)于正交投影并不需要w分量浪汪,GL_PROJECTION矩陣的第4行依舊為(0,0,0,1)。因此凛虽,正交投影完整的GL_PROJECTION矩陣為:

OpenGL正交投影矩陣

如果視錐體是對(duì)稱的(r=-l且t=-b)死遭,它可以進(jìn)一步簡(jiǎn)化。


英文原文:http://www.songho.ca/opengl/gl_projectionmatrix.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凯旋,一起剝皮案震驚了整個(gè)濱河市呀潭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌至非,老刑警劉巖钠署,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異荒椭,居然都是意外死亡谐鼎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門趣惠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狸棍,“玉大人,你說(shuō)我怎么就攤上這事味悄〔莞辏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵侍瑟,是天一觀的道長(zhǎng)唐片。 經(jīng)常有香客問(wèn)我,道長(zhǎng)涨颜,這世上最難降的妖魔是什么费韭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮咐低,結(jié)果婚禮上揽思,老公的妹妹穿的比我還像新娘。我一直安慰自己见擦,他們只是感情好钉汗,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布羹令。 她就那樣靜靜地躺著,像睡著了一般损痰。 火紅的嫁衣襯著肌膚如雪福侈。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,785評(píng)論 1 290
  • 那天卢未,我揣著相機(jī)與錄音肪凛,去河邊找鬼。 笑死辽社,一個(gè)胖子當(dāng)著我的面吹牛伟墙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滴铅,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼戳葵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了汉匙?” 一聲冷哼從身側(cè)響起拱烁,我...
    開(kāi)封第一講書(shū)人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎噩翠,沒(méi)想到半個(gè)月后戏自,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伤锚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年擅笔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片见芹。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剂娄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玄呛,到底是詐尸還是另有隱情,我是刑警寧澤和二,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布徘铝,位于F島的核電站,受9級(jí)特大地震影響惯吕,放射性物質(zhì)發(fā)生泄漏惕它。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一废登、第九天 我趴在偏房一處隱蔽的房頂上張望淹魄。 院中可真熱鬧,春花似錦堡距、人聲如沸甲锡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缤沦。三九已至虎韵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缸废,已是汗流浹背包蓝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工锥腻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留别威,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓沪铭,卻偏偏與公主長(zhǎng)得像届巩,于是被迫代替她去往敵國(guó)和親绳泉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容