OpenGL有六種坐標(biāo):
物體或模型坐標(biāo)系(Object or Model Coordinates)
世界坐標(biāo)系(World Coordinates)
眼坐標(biāo)或相機(jī)坐標(biāo)(Eye (or Camera) Coordinates)
裁剪坐標(biāo)系(Clip Coordinates)
標(biāo)準(zhǔn)設(shè)備坐標(biāo)系(Normalized Devices Coordinates)
屏幕坐標(biāo)系(Window (or Screen) Coordinates)
備注 :除了以上坐標(biāo)系罕扎,還有一個假想坐標(biāo)系——紋理坐標(biāo)系聚唐,這個坐標(biāo)系不存在的,其實是一系列矩陣變換的結(jié)果腔召,比如它能使頂點從物體或模型坐標(biāo)變換到世界坐標(biāo)系
從 Object Coordinates 到 World Coordinates 再到Camera Coordinates的變換杆查,在OpenGL中統(tǒng)一稱為model-View轉(zhuǎn)換,初始化的時候臀蛛,Object Coordinates 和 World Coordinates 還有Camera Coordinates坐標(biāo)重合在原點亲桦,變換矩陣都為Identity,所以在OpenGL中用glLoadIdentity() 初始化變換矩陣棧浊仆。model-view matrix 轉(zhuǎn)換points客峭, vectors到camera坐標(biāo)系
OpenGL可以只使用設(shè)備的一部分進(jìn)行繪制,這個部分稱為視區(qū)(Viewport)氧卧。投影得到的是視區(qū)內(nèi)的坐標(biāo)(投影坐標(biāo))桃笙,從投影坐標(biāo)到設(shè)備坐標(biāo)的計算過程就是設(shè)備變換了。
常用到的集中坐標(biāo)系:
世界坐標(biāo)沙绝、物體坐標(biāo)、設(shè)備坐標(biāo)鼠锈、眼坐標(biāo)闪檬、紋理坐標(biāo)
世界坐標(biāo)系:
是針對OpenGL來說明的,即三維坐標(biāo)系x,y,z
右手笛卡爾坐標(biāo)系购笆,水平向右為x軸粗悯,向上為y軸,屏幕向外為z軸
OpenGL提供了 glTranslate*/glRotate*/glScale*三條坐標(biāo)變換命令同欠,利用OpenGL的矩陣運算命令样傍,則可以實現(xiàn)任意復(fù)雜的坐標(biāo)變換。
坐標(biāo)變換矩陣棧(ModelView)
用來存儲一系列的變換矩陣铺遂,棧頂就是當(dāng)前坐標(biāo)的變換矩陣衫哥,進(jìn)入OpenGL管道的每個坐標(biāo)(齊次坐標(biāo))都會先乘上這個矩陣,結(jié)果才是對應(yīng)點在場景中的世界坐標(biāo)襟锐。
VertexData —>(Object Coordinates)—>ModelViewMatrix —>(Eye Coordinates)—> ProjectionMatrix —>(Clip Coordinates)—>Divide by w —>(Normalized Device Coordinates)—>ViewportTransform—>WindowCoordinates—>
紋理坐標(biāo)系
紋理是圖片撤逢,視頻等格式的一種渲染方式,圖片只有通過紋理才能加載到GLES中
因此紋理坐標(biāo)系是圖片,視頻等在手機(jī)屏幕上的坐標(biāo)系蚊荣,即U初狰,V也有叫ST的。
應(yīng)用初始化時互例,UV坐標(biāo)與三維坐標(biāo)系重合奢入,可以選擇繪制的模式,繪制模式包括點媳叨,線腥光,面,且都是坐標(biāo)集合里進(jìn)行順序繪制的肩杈。
物體坐標(biāo)系
物體坐標(biāo)系是以物體的某一個點為原點來建立的三維坐標(biāo)系(世界坐標(biāo)系)柴我。僅針對該物體。物體放到場景中時扩然,各部分經(jīng)歷的坐標(biāo)變換矩陣相同艘儒,相對位置不變,所以可視為一個整體
眼坐標(biāo)系或相機(jī)坐標(biāo)系
以視點為原點夫偶,以視線的方向為Z+軸正方向的坐標(biāo)系中的方向界睁。OpenGL管道會將世界坐標(biāo)先變換到眼坐標(biāo),然后進(jìn)行裁剪兵拢,只有在視線范圍(視見體)之內(nèi)的場景才會進(jìn)入下一階段的計算翻斟。
裁剪坐標(biāo)系
由眼坐標(biāo)可知,OpenGL管道首先會將目標(biāo)從世界坐標(biāo)變換到眼坐標(biāo)说铃,然后對視線范圍外的部分進(jìn)行裁剪访惜。
裁剪過程中用到投影變換矩陣棧(ProjectionMatrix),棧頂矩陣就是當(dāng)前投影變換矩陣腻扇,負(fù)責(zé)將場景各坐標(biāo)變換到眼坐標(biāo)债热,由所得到的結(jié)果是裁剪后的場景部分,稱為裁剪坐標(biāo)
我們上面說到了ModelViewMatrix 與ProjectionMatrix兩個矩陣棧幼苛,那矩陣棧是怎么切換的呢窒篱?
用函數(shù):glMatrixMode(GL_MODELVIEWING或GL_PROJECTION);本命令執(zhí)行后參數(shù)所指矩陣棧就成為當(dāng)前矩陣棧,以后的矩陣棧操縱命令將作用于它舶沿。
緊接著glMatrixMode()就是初始化矩陣墙杯,我們在上面也講到,所有矩陣都為Identity,所以用方法glLoadIdentity()初始化矩陣括荡。