電腦圖形學(二)輸出圖元_10_多邊形填充區_7_OpenGL多邊形填充區函數(上)

來源:互聯網
上載者:User

標籤:

OpenGL多邊形填充區函數(上)        描述填充多邊形的OpenGL過程與描述點和折線類似,但有一個例外。函數glVertex用來輸入多邊形的一個頂點座標,而完整的多邊形用從glBegin到glEnd之間的一組頂點來描述。但有另外一個函數可以用來顯示具有完全不同格式的矩形。
        預設時多邊形內部顯示為單色,由使用中色彩設定確定其顏色。作為選項(下面的內容中敘述),可以用圖案填充多邊形且顯示多邊形的邊作為內部填充的邊界。函數glBegin中指定多邊形填充區的變數可使用6個不同的符號常量。這6個基本常量可用來顯示單一填充多邊形、一組不相連的填充多邊形或一組相連的填充多邊形。
       OpenGL中的填充區必須指定為凸多邊形。因此,一個填充多邊形的頂點集中至少包含三個頂點,其中無相交邊,多邊形所有內角均小於180度。單個多邊形填充區只用一個頂點集描述,其內部不能包含圖3.54所示的洞。那樣的圖形可用兩個重疊的多邊形來描述。
    我們描述的每一個多邊形有兩個面:後向面和前向面。在OpenGL中,可以為每個面分別設定填充顏色和其他屬性,且在二維和三維觀察子程式中要求有後向/前向標誌。因此,多邊形按從“外部”觀察它時的逆時針方向描述。這標識了該多邊形的前向面。

       因為圖形顯示中經常包含有矩形的填充區,OpenGL提供了一個特殊的矩形函數,直接在xy平面中描述頂點。在有些OpenGL的實現中,下面的函數比用g1Vertex描述的填充區有更高的效率:
glRect* (x1, y1, x2, y2);
       該矩形的一個角位於座標位置(x1,y1)處,而與其相對的一角位於座標位置(x2,y2)處。glRect的尾碼碼指出座標資料類型及是否用數組元素來表示座標。這些編碼是i(整數)、s(短整數)、f(浮點數)、d(雙倍長浮點數)和v(向量)。矩形的邊平行於xy座標軸。作為一個例子,下面的語句定義了圖3.55中給出的正方形:
glRecti (200, 100,50, 250);
       如果將座標值放在數組中,可用下列語句產生同樣的正方形:
int vertex1 [] = { 200, 1000};int vertex2 [] = { 50, 250};glRectv (vertex1, vertex2);
       利用函數glRect產生矩形時,多邊形的邊按頂點序列(x1,y1)、(x2,y1)、(x2,y2)、(x1,y2)來形成,後返回到第一頂點(x1,yl)。在該例子中,我們產生了順時針次序的頂點集。在許多二維應用中,前向面和後向面的確定是不重要的。但如果確實要將不同的特性賦給矩形的前向面和後向面,那就應該將本例中的兩個頂點次序倒過來從而得到逆時針的頂點次序。第4章將討論另一種可以顛倒前向
面和後向面描述的方法。

       另外六個OpenGL多邊形填充圖元中的每一個都用glBegin函數中的符號常量及一組glVertex命令描述。使用OpenGL圖元常量GL_POLYGON可以顯示圖3.56(a)那樣的單個多邊形。在該例子中,我們假定有六個頂點,標號p1到p6,描述一個逆時針次序的兩維多邊形頂點位置。每一點用一個數組(x,y)座標值表示。
glBenin (GL_POLYGON); glVertex2iv (p1); glVertex2iv (p2); glVertex2iv (p3); glVertex2iv (p4); glVertex2iv (p5); glVertex2iv (p6);glEnd();
一個多邊形的頂點集至少包含三個頂點,否則什麼也不顯示。
 如果改變前一例子中頂點集的次序並將圖元常量改變成GL_TRIANGLES,就獲得圖3.56(b)所示的兩個分開的三角形填充區。
glBenin (GL_TRIANGLES); glVertex2iv (p1); glVertex2iv (p2); glVertex2iv (p3); glVertex2iv (p4); glVertex2iv (p5); glVertex2iv (p6);glEnd();
     此時,前面三個座標點定義一個三角形的頂點,後面三點定義下一個三角形,依次類推。對於每一個三角形填充區,我們指定逆時針次序的頂點位置。除非重複使用某些頂點,否則該圖元常量僅顯示不相連的三角形。如果頂點數小於3,則什麼也不顯示。而如果指定的頂點數不是3的倍數,則最後一個或兩個頂點沒有用。
    再次改變頂點集次序並將圖元常量改為GL_TRIANGLE_STRIP,可顯示圖3.56(c)所示的一組串連的三角形。
glBenin (GL_TRIANGLE_STRIP); glVertex2iv (p1); glVertex2iv (p2); glVertex2iv (p6); glVertex2iv (p3); glVertex2iv (p5); glVertex2iv (p4);glEnd();
        假定在N個頂點的集合中沒有重複的座標位置,可獲得N-2個三角形的帶。很清楚,必須有N >= 3,否則什麼也不顯示。在該例子中,N=6,得到4個三角形。每一後繼三角形共用前面定義的三角形的一條邊,因此頂點次序的設定必須保證顯示的一致性。一個三角形在前面兩個頂點的基礎上再加一個頂點來定義。因此,最前面三個頂點必須按從前面(外部)觀察三角形表面時的逆時針次序列出。隨後,頂點表中用於另外三個三角形的三個頂點安排成順時針次序。這通過按次序n=1,n=2....n = N-2處理頂點集中的位置n,並按n是否為奇數或偶數確定相應的三頂點集次序來實現。如果n是奇數,三角形頂點的多邊形列表次序是n 、n+1、 n+2。如果n是偶數,則三角形頂點次序為。n+l、n、n+2。在前面的例子中,第一個三角形(n=1)的頂點次序為(p1, p2, p6)。第二個三角形(n = 2)的頂點次序為(p6, p2, p3)。第三個三角形(n=3)為(p6, p3, p5)。多邊形表中第四個三角形(n=4)的頂點次序為(p5, p3, p4)。
       產生一組相連三角形的另一種方法是使用圖3.56(d)所示的“扇形”方法,其中有一個頂點被所有的三角形共用。使用圖元常量GL_TRIANGLE_FAN和六個頂點的原來次序可以獲得這樣的設定:
glBenin (GL_TRIANGLE_FAN); glVertex2iv (p1); glVertex2iv (p2); glVertex2iv (p3); glVertex2iv (p4); glVertex2iv (p5); glVertex2iv (p6);glEnd();

      N個頂點可獲得N-2個三角形,不需要重複使用任何頂點,但必須至少列出三個頂點。另外,必須合適地描述頂點次序,以便正確定義每一個三角形的前向面和後向面。第一個列出的頂點(此時為pl )是扇形中每一三角形共用的頂點。如果再按n=1,n=2,...,n=N-2來計算多邊形和座標位置,則多邊形表中第n個三角形的頂點次序為1, n+1 , n+2。因此,三角形1由頂點集(p1,p2,p3)定義;三角形2的頂點次序為(p1, p3, p4);三角形3的頂點次序為(p1,p4,p5);而三角形4的頂點集為(p1,p5,p6)。


電腦圖形學(二)輸出圖元_10_多邊形填充區_7_OpenGL多邊形填充區函數(上)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.