如果你想把圖形渲染在正確的位置上,那么坐標的設置就很重要了。在OpenGL中,與坐標相關的主要有笛卡爾坐標、坐標裁剪、紋理坐標、MVP(Model View Projection)轉換。
1.笛卡爾坐標
在二維繪圖中,笛卡爾坐標有一個X軸和一個Y軸組成,X軸為水平方向,Y軸為垂直方向,X和Y相互垂直。如圖1。關於正負方向問題,默認如圖1上標示,但是我們可以根據實際需求自己定義。(左下角為(0, 0)原點)
圖1:

在三維繪圖中,笛卡爾坐標多了一個Z軸,Z軸同時垂直於X和Y軸。Z軸的實際意義代表着三維物體的深度。如圖2。關於正負方向問題,默認如圖2上標示,但是我們可以根據實際需求自己定義。
圖2:

2.坐標裁剪
窗口是以像素為單位進行度量的。開始在窗口中繪制點、線和形狀之前,要把指定的笛卡爾坐標對翻譯成屏幕坐標,我們可以通過指定占據窗口的笛卡爾區域來轉換,這個區域叫做裁剪區域。在二維空間中,有兩種常見的裁剪區域。第一種,裁剪區域就是窗口內部最小和最大的x、y值,如圖3。第二種就是根據窗口指定原點位置,如圖4。
圖3:

圖4:

在OpengL繪圖中采用的裁剪坐標是第二種,並且x、y的取值為-1~+1,這稱為單位坐標。當然我們平常直接使用setPosition(x=500,y=600),x和y值到最后還是會通過矩陣相乘轉換成單位坐標,這是涉及到模型視圖、投影的變換,即MVP變換(Model View Projection)。
3.紋理坐標(左上角為(0, 0)原點)
在指定了圖形的笛卡爾坐標后,如果想要在圖形上進行貼圖,則要設置好紋理坐標。紋理坐標要么是指定為着色器的一個屬性,要么通過算法計算出來。典型情況下,紋理坐標是作為0.0到1.0范圍內的浮點值指定,當然你也可以設置自己預定的范圍,然后再着色器中進行單位化計算。紋理坐標的命名為s、t和q(與頂點坐標x、y、z、w相似),支持從一維到三維的紋理坐標,並且可以選擇一種對坐標進行縮放的方法。如圖5。
圖5:
注意:如果紋理經過DXT壓縮(通常為jpg格式),紋理的坐標的t坐標會反轉。即原點變成左上角了,y軸向下為正,x依舊向右為正。因為DXT壓縮源自DirectX,紋理坐標和OpenGL相比,所以使用壓縮紋理時,得用“t變=1.0-t前”來獲取正確的紋素。即在OpenGL中(0,0)變為(0,1),(0,1)變為(0,0),(1,1)變為(1,0),(1,0)變為(1,1)。
4.模型視圖、投影
首先,我們來看看OpengGL變換的術語。
視圖(View)--指定觀察者或照相機的位置。
模型(Model)--在場景中移動物體。
模型視圖--描述視圖和模型變換的二元性。
投影(Projection)--改變視景體的大小或重新設置它的形狀。
視口--這是偽改變,只是對窗口上的最終輸出進行縮放。
視圖坐標與視圖變換
視覺坐標是相對觀察者的視角而言的,它是一個虛擬的固定坐標系,通常用作參考坐標系。 視圖變換允許我們把觀察點放在任何位置,並允許在任何方向上觀察場景。確定視圖變換就像在場景中放置照相機並讓它指向某個方向。
模型變換
模型變換用於操縱模型和其中的特定對象,這里的模型指的是點的笛卡爾坐標,這些變換將對象移動到需要的位置,然后再對它們進行旋轉和縮放。通常代碼如,Sprite::moveTo(x,y),Sprite::scale(x)。這里需要注意的是模型變換的順序,因為矩陣的相乘不遵守結合律,因此變換順序不同,通常得到的結果會不同。
模型視圖變換
模型視圖變換是模型變換和視圖變換在變換管線中的組合。因為有時兩種變換的效果一樣的,如將對象向后移動和將參考坐標系向前移動在視覺上的效果一樣,但是后者的變換對所有的元素都有效,前者只作用於自己。所以,要看自己需要那種效果來進行那種變換。
需要注意的是,在OpengL中的矩陣是以列優先排序的。
投影變換
投影變換將在模型視圖變換之后應用到頂點上,這種投影定義了視景體並創建了裁剪平面。投影變換有兩種:正投影和透視投影。
正投影,所有多邊形都是按同樣相對大小來在屏幕上繪制的。線和多邊形使用平行線來直接映射到2D屏幕上。適合藍圖、文本等二維圖形。如圖6。
圖6:

透視投影,通過非平行線來把圖形映射到2D屏幕上,有透視縮短的特點,更加貼近現實。如圖7。
圖7:
5.總結
最后,我們梳理一下渲染過程中坐標變換的流程,如圖8。
圖8:

如需轉載,請標明出處,http://blog.csdn.net/cbbbc/article/details/39738641
