OpenGL超級寶典總結(二)2D/3D笛卡爾坐標、坐標裁剪、紋理坐標、MVP轉換等概念


如果你想把圖形渲染在正確的位置上,那么坐標的設置就很重要了。在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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM