當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]坐標(biāo)系統(tǒng)想要弄懂幾何變換,一定要搞清楚OpenGL中的坐標(biāo)系統(tǒng)。從我們構(gòu)造模型的局部坐標(biāo)系(Local/Object Space)經(jīng)過(guò)一系列處理最終渲染到屏幕坐標(biāo)(Screen Space)下,這過(guò)程

坐標(biāo)系統(tǒng)

想要弄懂幾何變換,一定要搞清楚OpenGL中的坐標(biāo)系統(tǒng)。
從我們構(gòu)造模型的局部坐標(biāo)系(Local/Object Space)經(jīng)過(guò)一系列處理最終渲染到屏幕坐標(biāo)(Screen Space)下,這過(guò)程中有6種坐標(biāo)系。

World Coordinates(世界坐標(biāo)系)Object Coordinates(對(duì)象坐標(biāo)系、模型坐標(biāo)系、局部坐標(biāo)系或當(dāng)前繪圖坐標(biāo)系)Eye Coordinates(眼坐標(biāo)系或照相機(jī)坐標(biāo)系)Clip Coordinates(裁剪坐標(biāo)系)Normalized Device Coordinates (NDC) (歸一化設(shè)備坐標(biāo)系)Window Coordinates (Screen Coordinates)(屏幕坐標(biāo))

實(shí)際上,并不存在單獨(dú)的模型變換(Model)和視點(diǎn)變換(View),通常將這兩種變換合稱為ModelView變換。則OpenGL的頂點(diǎn)變換過(guò)程如圖所示:

世界坐標(biāo)系

世界坐標(biāo)系始終是固定不變的。OpenGL使用右手坐標(biāo),這里有一個(gè)形象的方法:使用右手定則
X 是你的拇指
Y 是你的食指
Z 是你的中指
如果你把你的拇指指向右邊,食指指向天空,那么中指將指向你的背后。我們的觀察方向是Z軸負(fù)半軸的方向。


進(jìn)行旋轉(zhuǎn)操作時(shí)需要指定的角度θ的方向則由右手法則來(lái)決定,即右手握拳,大拇指直向某個(gè)坐標(biāo)軸的正方向,那么其余四指指向的方向即為該坐標(biāo)軸上的θ角的正方向(即θ角增加的方向),圖中用圓弧形箭頭標(biāo)出:

對(duì)象坐標(biāo)系

這是對(duì)象在被應(yīng)用任何變換之前的初始位置和方向所在的坐標(biāo)系,也就是當(dāng)前繪圖坐標(biāo)系。該坐標(biāo)系不是固定的,且僅對(duì)該對(duì)象適用。在默認(rèn)情況下,該坐標(biāo)系與世界坐標(biāo)系重合。這里能用到的函數(shù)有g(shù)lTranslatef(),glScalef(), glRotatef(),當(dāng)用這些函數(shù)對(duì)當(dāng)前繪圖坐標(biāo)系進(jìn)行平移、伸縮、旋轉(zhuǎn)變換之后, 世界坐標(biāo)系和當(dāng)前繪圖坐標(biāo)系不再重合。改變以后,再用glVertex3f()等繪圖函數(shù)繪圖時(shí),都是在當(dāng)前繪圖坐標(biāo)系進(jìn)行繪圖,所有的函數(shù)參數(shù)也都是相對(duì)當(dāng)前繪圖坐標(biāo)系來(lái)講的。如圖則是對(duì)物體進(jìn)行變換后,對(duì)象坐標(biāo)系與世界坐標(biāo)系的相對(duì)位置。對(duì)象坐標(biāo)系也叫本地(局部)坐標(biāo)系。

眼坐標(biāo)系

模型變換:對(duì)象坐標(biāo)系->世界坐標(biāo)系
視變換:世界坐標(biāo)系->眼坐標(biāo)系

GL_MODELVIEW矩陣是模型變換矩陣和視點(diǎn)變換矩陣的組合(Mview*Mmodel),前面已經(jīng)說(shuō)了,并不存在單獨(dú)的模型變換(Model)和視點(diǎn)變換(View)。所以使用GL_MODELVIEW矩陣就可以使對(duì)象從對(duì)象坐標(biāo)系轉(zhuǎn)換到眼坐標(biāo)系。
為啥要轉(zhuǎn)換到眼坐標(biāo)系呢?
可以這樣理解,通過(guò)前面的MODEVIEW變換,這個(gè)世界坐標(biāo)系中的場(chǎng)景已經(jīng)繪制好了。這時(shí)候我們還不能看到場(chǎng)景哦,因?yàn)槲覀兊挠^察位置還沒定呢,而且如果我們眼睛(照相機(jī))的位置不同,那么觀察物體的角度則不同,那看到的場(chǎng)景的樣子肯定也不同,所以要有這一步,把場(chǎng)景與我們的觀察位置對(duì)應(yīng)起來(lái)。

默認(rèn)情況下,眼坐標(biāo)系與世界坐標(biāo)系也是重合的。使用函數(shù) gluLookAt()則可以指定眼睛(相機(jī))的位置和眼睛看向的方向。該函數(shù)的原型如下:

void?gluLookAt(GLdouble?eyex,?GLdouble?eyey,?GLdouble?eyez,?
????????????????????????GLdouble?centerx,?GLdouble?centery,?GLdouble?centerz,
????????????????????????GLdouble?upx,?GLdouble?upy,?GLdouble?upz)

函數(shù)參數(shù)中:點(diǎn)(eyex, eyey, eyez)代表眼睛所在位置;
? ? ? ? ? ? ? ? ? ?點(diǎn)(centerx, centery,centerz)代表眼睛看向的位置;
? ? ? ? ? ? ? ? ? ?向量(upx, upy, upz)代表視線向上方向,其中視點(diǎn)和參考點(diǎn)的連線與視線向上方向要保持垂直關(guān)系。
只需控制這三個(gè)量,便可定義新的視點(diǎn)。

tips

使用glTranslatef(),glScalef(), glRotatef()這些函數(shù)是對(duì)對(duì)象坐標(biāo)系進(jìn)行變動(dòng);使用void gluLookAt()是對(duì)眼坐標(biāo)系進(jìn)行變動(dòng),兩者可以達(dá)到相同的變換效果。相當(dāng)于對(duì)象不動(dòng)移動(dòng)相機(jī),和相機(jī)不動(dòng)移動(dòng)對(duì)象。比如場(chǎng)景向x軸正方向移動(dòng)1個(gè)單位(相機(jī)不動(dòng)),相當(dāng)于相機(jī)向x軸負(fù)方向移動(dòng)一個(gè)單位(對(duì)象不動(dòng)),glTranslatef(1.0, 0.0, 0.0) ?

裁剪坐標(biāo)系

眼坐標(biāo)到裁剪坐標(biāo)是通過(guò)投影完成的。眼坐標(biāo)通過(guò)乘以GL_PROJECTION矩陣變成了裁剪坐標(biāo)。

這個(gè)GL_PROJECTION矩陣定義了視景體( viewing volume),即確定哪些物體位于視野之內(nèi),位于視景體外的對(duì)象會(huì)被剪裁掉。除了視景體,投影變換還定義了頂點(diǎn)是如何投影到屏幕上的,是透視投影(perspective projection)還是正交投影(orthographic projection)。透視投影似于日常生活看到的場(chǎng)景,遠(yuǎn)處物體看起來(lái)小,近處看起來(lái)大。使用透視投影函數(shù)glFrustum()和gluPerspective().

void?glFrustum(GLdouble?left,?GLdouble?right,
     ?GLdouble?bottom,?GLdouble?top,?
     ?GLdouble?near,?GLdouble?far)

far, near是指近裁剪面,遠(yuǎn)剪裁面離視點(diǎn)的距離(>0);對(duì)角坐標(biāo),(left, bottom, -near)和(right, top, -near)定義了近裁剪面的左下角和右上角的(x, y, z)坐標(biāo)。

void?gluPerspective(GLdouble?fovy,??GLdouble?aspect,
       ???GLdouble?near,?GLdouble?far)

fovy視角,aspect = w/h

正交投影把物體直接映射到屏幕上,不影響它們的相對(duì)大小。也就是圖像反映物體的實(shí)際大小。函數(shù)glOrtho()創(chuàng)建一個(gè)用于正交投影的平行視景體, 將其與當(dāng)前矩陣相乘。

void?glOrtho(GLdouble?left,?GLdouble?right,
    ???????GLdouble?bottom,?GLdouble?top,?
    ???????GLdouble?near,?GLdouble?far);

關(guān)于透視投影和正交投影詳見:OpenGL之glMatrixMode函數(shù)的用法

歸一化設(shè)備坐標(biāo)系

?既然要規(guī)范化,那么就得先有一個(gè)規(guī)范。前面在投影部分也已經(jīng)看到,每種投影,都有一個(gè)剪裁空間,稱之為觀察體,對(duì)正交投影來(lái)說(shuō)是一個(gè)立方體,對(duì)透視投影來(lái)說(shuō)是一個(gè)棱臺(tái)。如果一個(gè)觀察體是一個(gè)x、y、z坐標(biāo)范圍都是 [-1, 1] 的立方體,則稱之為規(guī)范化立方體,這個(gè)就是所謂的規(guī)范。那么,將原來(lái)的觀察體,映射到規(guī)范化立方體的過(guò)程,就是規(guī)范化。

一個(gè)格外需要注意的地方是,由于后面的屏幕坐標(biāo)系通常是左手坐標(biāo)系,所以這里的規(guī)范化觀察體也使用左手坐標(biāo)系,意味著 x 軸和 y 軸沒有改變,但是 z 軸的正方向轉(zhuǎn)了個(gè)。這帶來(lái)的結(jié)果是,在這樣的坐標(biāo)系下,z 的坐標(biāo)值越小,距離觀察者(也就是你)越近。實(shí)際上,在opengl中,進(jìn)行規(guī)范化之后,近裁剪平面的z軸坐標(biāo)是 -1,遠(yuǎn)裁剪平面的z軸坐標(biāo)是1。

由裁剪坐標(biāo)系下通過(guò)除以W分量得到。這個(gè)操作稱為透視除法。NDC坐標(biāo)很像屏幕坐標(biāo),但是還沒有經(jīng)過(guò)平移和縮放到屏幕像素?,F(xiàn)在3個(gè)軸上的值范圍均為[-1,1]。屏幕坐標(biāo)系

通常將屏幕上的設(shè)備坐標(biāo)稱為屏幕坐標(biāo)。設(shè)備坐標(biāo)又稱為物理坐標(biāo),是指輸出設(shè)備上的坐標(biāo)。設(shè)備坐標(biāo)用對(duì)象距離窗口左上角的水平距離和垂直距離來(lái)指定對(duì)象的位置,是以像素為單位來(lái)表示的,設(shè)備坐標(biāo)的 X 軸向右為正,Y 軸向下為正,坐標(biāo)原點(diǎn)位于窗口的左上角。
從NDC坐標(biāo)到屏幕坐標(biāo)基本上是一個(gè)線性映射關(guān)系。通過(guò)對(duì)NDC坐標(biāo)進(jìn)行視口變換得到。這時(shí)候就要用到函數(shù)glViewport(),該函數(shù)用來(lái)定義渲染區(qū)域的矩形,也就是最終圖像映射到的區(qū)域。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉